public function init_admin() { parent::init_admin(); add_action('gform_entry_detail_sidebar_before', array($this, 'entry_detail_approval_box'), 10, 2); add_filter('gform_notification_events', array($this, 'add_notification_event')); add_filter('gform_entries_field_value', array($this, 'filter_gform_entries_field_value'), 10, 4); if (GFAPI::current_user_can_any('gravityforms_edit_entries')) { add_action('wp_dashboard_setup', array($this, 'dashboard_setup')); } }
public static function display($args) { $defaults = array('check_permissions' => true, 'detail_base_url' => admin_url('admin.php?page=gravityflow-inbox&view=entry')); $args = array_merge($defaults, $args); if ($args['check_permissions'] && !GFAPI::current_user_can_any('gravityflow_activity')) { esc_html_e("You don't have permission to view this page", 'gravityflow'); return; } $events = Gravity_Flow_Activity::get_events(); if (sizeof($events) > 0) { ?> <table id="gravityflow-activity" class="widefat" cellspacing="0" style="border:0px;"> <thead> <tr> <th data-label="<?php esc_html_e('Event ID', 'gravityflow'); ?> "><?php esc_html_e('Event ID', 'gravityflow'); ?> </th> <th><?php esc_html_e('Date', 'gravityflow'); ?> </th> <th><?php esc_html_e('Form', 'gravityflow'); ?> </th> <th><?php esc_html_e('Entry ID', 'gravityflow'); ?> </th> <th><?php esc_html_e('Type', 'gravityflow'); ?> </th> <th><?php esc_html_e('Event', 'gravityflow'); ?> </th> <th><?php esc_html_e('Step', 'gravityflow'); ?> </th> <th><?php esc_html_e('Duration', 'gravityflow'); ?> </th> </tr> </thead> <tbody class="list:user user-list"> <?php foreach ($events as $event) { $form = GFAPI::get_form($event->form_id); $base_url = $args['detail_base_url']; $url_entry = $base_url . sprintf('&id=%d&lid=%d', $event->form_id, $event->lead_id); $url_entry = esc_url_raw($url_entry); $link = "<a href='%s'>%s</a>"; ?> <tr> <td data-label="<?php esc_html_e('ID', 'gravityflow'); ?> "> <?php echo esc_html($event->id); ?> </td> <td data-label="<?php esc_html_e('Date', 'gravityflow'); ?> "> <?php echo esc_html(GFCommon::format_date($event->date_created)); ?> </td> <td data-label="<?php esc_html_e('Form', 'gravityflow'); ?> "> <?php printf($link, $url_entry, $form['title']); ?> </td> <td data-label="<?php esc_html_e('Entry ID', 'gravityflow'); ?> "> <?php printf($link, $url_entry, $event->lead_id); ?> </td> <td data-label="<?php esc_html_e('Type', 'gravityflow'); ?> "> <?php echo esc_html($event->log_object); ?> </td> <td data-label="<?php esc_html_e('Event', 'gravityflow'); ?> "> <?php switch ($event->log_object) { case 'workflow': echo $event->log_event; break; case 'step': echo esc_html($event->log_event); break; case 'assignee': echo esc_html($event->display_name) . ' <i class="fa fa-arrow-right"></i> ' . esc_html($event->log_value); break; default: echo esc_html($event->log_value); } ?> </td> <td data-label="<?php esc_html_e('Step', 'gravityflow'); ?> "> <?php if ($event->feed_id) { $step = gravity_flow()->get_step($event->feed_id); if ($step) { $step_name = $step->get_name(); echo esc_html($step_name); } } ?> </td> <td data-label="<?php esc_html_e('Event', 'gravityflow'); ?> "> <?php if (!empty($event->duration)) { echo self::format_duration($event->duration); } ?> </td> </tr> <?php } ?> </tbody> </table> <?php } else { ?> <div id="gravityflow-no-activity-container"> <div id="gravityflow-no-activity-content"> <i class="fa fa-spinner fa-pulse fa-3x fa-fw"></i> <br /><br /> <?php esc_html_e('Waiting for workflow activity', 'gravityflow'); ?> </div> </div> <?php } }
function __construct($args = array()) { $default_bulk_actions = array('print' => esc_html__('Print', 'gravityflow')); if (GFAPI::current_user_can_any('gravityflow_admin_actions')) { $default_bulk_actions['restart_workflow'] = esc_html__('Restart Workflow', 'gravityflow'); } $default_args = array('singular' => __('entry', 'gravityflow'), 'plural' => __('entries', 'gravityflow'), 'ajax' => false, 'base_url' => admin_url('admin.php?page=gravityflow-status'), 'detail_base_url' => admin_url('admin.php?page=gravityflow-inbox&view=entry'), 'constraint_filters' => array(), 'field_ids' => array(), 'screen' => 'gravityflow-status', 'display_all' => GFAPI::current_user_can_any('gravityflow_status_view_all'), 'bulk_actions' => $default_bulk_actions, 'per_page' => 20, 'id_column' => true, 'submitter_column' => true, 'step_column' => true, 'status_column' => true, 'last_updated' => false); $args = wp_parse_args($args, $default_args); require_once ABSPATH . 'wp-admin/includes/template.php'; if (!class_exists('WP_Screen')) { require_once ABSPATH . 'wp-admin/includes/class-wp-screen.php'; } parent::__construct($args); $this->base_url = $args['base_url']; $this->detail_base_url = $args['detail_base_url']; $this->constraint_filters = $args['constraint_filters']; if (!is_array($args['field_ids'])) { $args['field_ids'] = explode(',', $args['field_ids']); } $this->field_ids = $args['field_ids']; $this->display_all = $args['display_all']; $this->bulk_actions = $args['bulk_actions']; $this->set_counts(); $this->per_page = $args['per_page']; $this->id_column = $args['id_column']; $this->step_column = $args['step_column']; $this->submitter_column = $args['submitter_column']; $this->status_column = $args['status_column']; $this->last_updated = $args['last_updated']; }
public static function display($args) { $assignee_key = sanitize_text_field(rgget('assignee')); list($assignee_type, $assignee_id) = rgexplode('|', $assignee_key, 2); $range = sanitize_key(rgget('range')); switch ($range) { case 'last-6-months': $start_date = date('Y-m-d', strtotime('-6 months')); break; case 'last-3-months': $start_date = date('Y-m-d', strtotime('-3 months')); break; default: $start_date = date('Y-m-d', strtotime('-1 year')); } $defaults = array('view' => rgget('view'), 'form_id' => absint(rgget('form-id')), 'step_id' => absint(rgget('step-id')), 'category' => sanitize_key(rgget('category')), 'range' => $range, 'start_date' => $start_date, 'assignee' => $assignee_key, 'assignee_type' => $assignee_type, 'assignee_id' => $assignee_id, 'check_permissions' => true, 'base_url' => admin_url('admin.php?page=gravityflow-reports')); $args = array_merge($defaults, $args); if ($args['check_permissions'] && !GFAPI::current_user_can_any('gravityflow_reports')) { esc_html_e("You don't have permission to view this page", 'gravityflow'); return; } $filter_vars['config'] = self::get_filter_config_vars(); $filter_vars['selected'] = array('formId' => $args['form_id'], 'category' => $args['category'], 'stepId' => empty($args['step_id']) ? '' : $args['step_id'], 'assignee' => $args['assignee']); ?> <script>var gravityflowFilterVars = <?php echo json_encode($filter_vars); ?> ;</script> <div id="gravityflow-reports-filter" style="margin-bottom:10px;"> <form method="GET" action="<?php echo esc_url($args['base_url']); ?> "> <input type="hidden" value="gravityflow-reports" name="page" /> <?php self::range_drop_down($args['range']); ?> <?php self::form_drop_down($args['form_id']); ?> <?php self::category_drop_down($args['category']); ?> <select id="gravityflow-reports-steps" style="display:none;" name="step-id"></select> <select id="gravityflow-reports-assignees" style="display:none;" name="assignee"></select> <input type="submit" value="<?php esc_html_e('Filter', 'gravityflow'); ?> " class="button-secondary" /> </form> </div> <?php if (empty($args['form_id'])) { self::report_all_forms($args); return; } $form_id = $args['form_id']; if ($args['category'] == 'assignee') { if (empty($args['assignee_key'])) { self::report_form_by_assignee($form_id, $args); } } elseif ($args['category'] == 'step') { if (empty($args['step_id'])) { self::report_form_by_step($form_id, $args); } else { $step_id = $args['step_id']; if (empty($args['assignee_id'])) { self::report_step_by_assignee($step_id, $args); } else { $assignee_type = $args['assignee_type']; $assignee_id = $args['assignee_id']; self::report_assignee_by_month($assignee_type, $assignee_id, $args); } } } else { self::report_form_by_month($form_id, $args); } }
public function ajax_download_export() { if (!wp_verify_nonce(rgget('nonce'), 'gravityflow_download_export') || !GFAPI::current_user_can_any('gravityflow_status')) { $response['status'] = 'error'; $response['message'] = __('Not authorized', 'gravityflow'); $response_json = json_encode($response); echo $response_json; die; } $file_name = $_REQUEST['file_name']; $upload_dir = wp_upload_dir(); $file_path = trailingslashit($upload_dir['basedir']) . $file_name . '.csv'; $file = ''; if (@file_exists($file_path)) { $file = @file_get_contents($file_path); @unlink($file_path); } nocache_headers(); header('Content-Type: text/csv; charset=utf-8'); header('Content-Disposition: attachment; filename=' . $file_name . '-' . date('m-d-Y') . '.csv'); header('Expires: 0'); echo $file; die; }
/** * @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 }
public static function render() { $form_id = 0; $entries = rgget('lid'); if (0 == $entries) { // get all the entry ids for the current filter / search $filter = rgget('filter'); $search = rgget('search'); $star = $filter == 'star' ? 1 : null; $read = $filter == 'unread' ? 0 : null; $status = in_array($filter, array('trash', 'spam')) ? $filter : 'active'; $search_criteria['status'] = $status; if ($star) { $search_criteria['field_filters'][] = array('key' => 'is_starred', 'value' => (bool) $star); } if (!is_null($read)) { $search_criteria['field_filters'][] = array('key' => 'is_read', 'value' => (bool) $read); } $search_field_id = rgget('field_id'); $search_operator = rgget('operator'); if (isset($_GET['field_id']) && $_GET['field_id'] !== '') { $key = $search_field_id; $val = rgget('s'); $strpos_row_key = strpos($search_field_id, '|'); if ($strpos_row_key !== false) { //multi-row $key_array = explode('|', $search_field_id); $key = $key_array[0]; $val = $key_array[1] . ':' . $val; } $search_criteria['field_filters'][] = array('key' => $key, 'operator' => rgempty('operator', $_GET) ? 'is' : rgget('operator'), 'value' => $val); } $entry_ids = GFFormsModel::search_lead_ids($form_id, $search_criteria); } else { $entry_ids = explode(',', $entries); } $page_break = rgget('page_break') ? 'print-page-break' : false; // sort lead IDs numerically sort($entry_ids); if (empty($entry_ids)) { die(esc_html__('Form Id and Lead Id are required parameters.', 'gravityflow')); } $min = defined('SCRIPT_DEBUG') && SCRIPT_DEBUG || isset($_GET['gform_debug']) ? '' : '.min'; ?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> <head> <meta http-equiv="Content-type" content="text/html; charset=utf-8" /> <meta name="keywords" content="" /> <meta name="description" content="" /> <meta name="MSSmartTagsPreventParsing" content="true" /> <meta name="Robots" content="noindex, nofollow" /> <meta http-equiv="Imagetoolbar" content="No" /> <title> <?php $entry_count = count($entry_ids); $title = $entry_count > 1 ? esc_html__('Bulk Print', 'gravityflow') : esc_html__('Entry # ', 'gravityflow') . $entry_ids[0]; $title = apply_filters('gravityflow_page_title_print_entry', $title, $entry_count); echo esc_html($title); ?> </title> <link rel='stylesheet' href='<?php echo GFCommon::get_base_url(); ?> /css/print<?php echo $min; ?> .css' type='text/css' /> <link rel='stylesheet' href='<?php echo gravity_flow()->get_base_url(); ?> /css/entry-detail<?php echo $min; ?> .css' type='text/css' /> <?php $styles = apply_filters('gravityflow_print_styles', false); if (!empty($styles)) { wp_print_styles($styles); } ?> </head> <body> <div id="view-container"> <?php require_once GFCommon::get_base_path() . '/entry_detail.php'; foreach ($entry_ids as $entry_id) { $entry = RGFormsModel::get_lead($entry_id); $form = GFAPI::get_form($entry['form_id']); do_action('gravityflow_print_entry_header', $form, $entry); // Separate each entry inside a form element so radio buttons don't get treated as a single group across multiple entries. echo '<form>'; $gravity_flow = gravity_flow(); $current_step = $gravity_flow->get_current_step($form, $entry); // 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(); gravity_flow()->log_debug(__METHOD__ . '() - user status = ' . $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); if ($user_status) { break; } } } } $full_access = GFAPI::current_user_can_any(array('gform_full_access', 'gravityflow_status_view_all')); if (!($user_status || $full_access)) { esc_attr_e("You don't have permission to view this entry.", 'gravityflow'); continue; } } require_once $gravity_flow->get_base_path() . '/includes/pages/class-entry-detail.php'; Gravity_Flow_Entry_Detail::entry_detail_grid($form, $entry, false, array(), $current_step); echo '</form>'; if (rgget('notes')) { Gravity_Flow_Entry_Detail::timeline($entry, $form); } // output entry divider/page break if (array_search($entry_id, $entry_ids) < count($entry_ids) - 1) { echo '<div class="print-hr ' . $page_break . '"></div>'; } do_action('gravityflow_print_entry_footer', $form, $entry); } ?> </div> </body> </html> <?php }