ID); $page_no = isset($_POST['page_no']) ? intval((sanitize_text_field(wp_unslash($_POST['page_no'])))) : '0'; $orderby_sql = (sanitize_sql_orderby( "load_order ASC" )); $task_status = $wpdb->get_results("SELECT * FROM {$wpdb->prefix}wppm_task_statuses ORDER BY $orderby_sql"); $wppm_task_time = get_option('wppm_task_time'); $page = isset($_POST['page']) ? sanitize_text_field(wp_unslash($_POST['page'])) : ''; $id = isset($_POST['id']) ? intval(sanitize_text_field(wp_unslash($_POST['id']))) : 0; $project_id = isset($_POST['project_id']) ? intval(sanitize_text_field(wp_unslash($_POST['project_id']))) : "0"; $wppm_date_setting = get_option('wppm_date_setting'); $search_tag = isset($_POST['task_search']) ? sanitize_text_field(wp_unslash($_POST['task_search'])) : ''; $filter_by = isset($_POST['wppm_task_filter']) ? sanitize_text_field(wp_unslash($_POST['wppm_task_filter'])) : "all"; $proj_filter = isset($_POST['wppm_proj_filter']) ? absint(wp_unslash($_POST['wppm_proj_filter'])) : "0"; $public_projects = isset($_POST['public_projects']) ? sanitize_text_field(wp_unslash($_POST['public_projects'])):"0"; /** * PRIORITIES */ $priorities = $wpdb->get_results("SELECT id, name FROM {$wpdb->prefix}wppm_task_priorities ORDER BY id ASC"); /** * USERS */ $users = get_users(array('orderby' => 'display_name','order' => 'ASC',)); /** * ASSIGNED USERS */ $assigned_rows = $wpdb->get_col( "SELECT users FROM {$wpdb->prefix}wppm_task WHERE users IS NOT NULL AND users != ''"); $all_assigned = array(); if (!empty($assigned_rows)) { foreach ($assigned_rows as $row) { // Handle comma separated IDs $ids = explode(',', $row); foreach ($ids as $uid) { $uid = absint(trim($uid)); if ($uid > 0) { $all_assigned[$uid] = $uid; } } } } // Final unique IDs $all_assigned = array_values($all_assigned); if (isset($_POST['filters'])) { if (is_string($_POST['filters'])) { $advanced_filter = json_decode(stripslashes( sanitize_text_field(wp_unslash($_POST['filters']) ) ),true ); } elseif (is_array($_POST['filters'])) { $raw_filters = wp_unslash($_POST['filters']); $advanced_filter = [ 'created_by' => array_map('absint', (array) ($raw_filters['created_by'] ?? [])), 'assigned' => array_map('absint', (array) ($raw_filters['assigned'] ?? [])), 'priority' => array_map('absint', (array) ($raw_filters['priority'] ?? [])), 'start_date' => sanitize_text_field($raw_filters['start_date'] ?? ''), 'end_date' => sanitize_text_field($raw_filters['end_date'] ?? ''), ]; } else { $advanced_filter = []; } }else{ $advanced_filter = []; } $wppm_current_user_capability = get_user_meta( $current_user->ID, 'wppm_capability', true ); $wppm_hide_completed_status_task = get_option('wppm_hide_completed_status_task'); $wppm_hide_task_statuses_from_frontend = get_option('wppm_hide_task_statuses_from_frontend'); $wppm_deafault_time_duration_task = get_option('wppm_display_time_duration_task'); if(!empty($wppm_hide_task_statuses_from_frontend)){ $wppm_hide_task_statuses_from_frontend = explode(",",$wppm_hide_task_statuses_from_frontend); } else { $wppm_hide_task_statuses_from_frontend = ''; } $filters = array( 'search' => $search_tag, 'filter'=>$filter_by, 'proj_filter'=>$proj_filter ); $grid_view_filter = $filters ; $tl_filters = isset( $_COOKIE['wppm_grid_view_filters'] ) ? sanitize_text_field( wp_unslash( $_COOKIE['wppm_grid_view_filters'] ) ) : $grid_view_filter; $tl_advanced_filters = []; if($id != 0){ if ( isset($_COOKIE['tb_kanban_filters']) ) { $tl_advanced_filters = json_decode( stripslashes($_COOKIE['tb_kanban_filters']), true ); if ( ! is_array($tl_advanced_filters) ) { $tl_advanced_filters = []; } } }else{ if ( isset($_COOKIE['tb_filters']) ) { $tl_advanced_filters = json_decode( stripslashes($_COOKIE['tb_filters']), true ); if ( ! is_array($tl_advanced_filters) ) { $tl_advanced_filters = []; } } } //$tl_advanced_filters = isset( $_COOKIE['wppm_advanced_filters'] ) ? sanitize_text_field( wp_unslash( $_COOKIE['wppm_advanced_filters'] ) ) : $tl_advanced_filters; $filter_values = !empty($advanced_filter) ? $advanced_filter : $tl_advanced_filters; $current_date = wp_date('Y-m-d'); $proj_attr = isset($_POST['wppm_project_attr']) ? absint(wp_unslash($_POST['wppm_project_attr'])):""; $archived_where = " AND Task.is_archived = 0"; if ( isset($page) && $page === 'wppm-archived-tasks' ) { $archived_where = " AND Task.is_archived = 1"; } if( isset($page) && $page === 'wppm-tasks'){ $archived_where = " AND Task.is_archived = 0"; } if (!empty($proj_attr)) { $wppm_proj_attr = $wpdb->prepare( ' AND proj.project_name = %s', $proj_attr ); } else { $wppm_proj_attr = ''; } if ($id != 0 || $project_id != 0) { $final_project_id = ($project_id != 0) ? intval($project_id) : intval($id); $wppm_project_filter = $wpdb->prepare( ' AND Task.project = %d', $final_project_id ); } else { $wppm_project_filter = ''; } $query = ("SELECT proj.* FROM {$wpdb->prefix}wppm_project AS proj Left join {$wpdb->prefix}wppm_project_meta proj_meta ON proj.id = proj_meta.project_id"); $santitize_order_by = esc_sql(sanitize_sql_orderby( "project_name ASC" )); if($current_user->has_cap('manage_options') || $wppm_current_user_capability == 'wppm_admin'){ if(!empty($proj_attr )){ $proj_attr = esc_sql($proj_attr); $where = $wpdb->prepare( " WHERE proj.project_name = %s AND proj.is_archived = 0 GROUP BY proj.id ORDER BY {$santitize_order_by}", $proj_attr ); }else{ if(!empty($public_projects)){ $where = $wpdb->prepare( " WHERE proj.id = proj_meta.project_id AND proj_meta.meta_key = %s AND proj_meta.meta_value = %d AND proj.is_archived = 0 {$wppm_proj_attr} GROUP BY proj.id ORDER BY {$santitize_order_by}", 'public_project', 1 ); }else{ $where = " WHERE proj.is_archived = 0 GROUP BY proj.id ORDER BY '$santitize_order_by'"; } } }else{ if(!empty($public_projects)){ $where = $wpdb->prepare( " WHERE ( proj.id = proj_meta.project_id AND proj_meta.meta_key = %s AND proj_meta.meta_value = %d ) {$wppm_proj_attr} AND proj.is_archived = 0 GROUP BY proj.id ORDER BY {$santitize_order_by}", 'public_project', 1 ); } else{ $where = $wpdb->prepare( " WHERE ( FIND_IN_SET(%d, proj.users) AND proj.is_archived = 0 OR ( proj.id = proj_meta.project_id AND proj_meta.meta_key = %s AND proj_meta.meta_value = %d ) OR ( proj.created_by = %d ) ) {$wppm_proj_attr} GROUP BY proj.id ORDER BY {$santitize_order_by}", $current_user->ID, 'public_project', 1, $cu_id ); } } $where = apply_filters('wppm_project_filter_in_task_list_grid_view_where',$where); $query.= $where; $projects = $wpdb->get_results($query); $wppm_tl_filter = "1=1"; if(!is_array($tl_filters)){ $tl_filters = json_decode($tl_filters); $tl_filters_arr = (array) $tl_filters; } else{ $tl_filters_arr = $filters; } $search_tag = isset($_POST['task_search']) ? sanitize_text_field(wp_unslash($_POST['task_search'])) : $tl_filters_arr['search']; $filter_by = isset($_POST['wppm_task_filter']) ? sanitize_text_field(wp_unslash($_POST['wppm_task_filter'])) : $tl_filters_arr['filter']; $proj_filter = isset($_POST['wppm_proj_filter']) ? absint(wp_unslash($_POST['wppm_proj_filter'])) : $tl_filters_arr['proj_filter']; $filters = array( 'search'=>$search_tag, 'filter'=>$filter_by, 'proj_filter' =>$proj_filter ); setcookie('wppm_grid_view_filters',wp_json_encode( $filters ),time() + 3600); if($filter_by=='all'){ if($wppm_hide_completed_status_task == 0){ $wppm_tl_filter = "Task.status!='4'"; } } if($filter_by=='4'){ $wppm_tl_filter = "Task.status='4'"; }elseif($filter_by=='overdue'){ $wppm_tl_filter = "Task.status!='4' AND (CAST(Task.end_date AS DATE)) < '$current_date'"; }elseif($filter_by == 'unassigned'){ $wppm_tl_filter = "Task.users=''"; }elseif($filter_by == '1'){ $wppm_tl_filter = "Task.status='1'"; }elseif($filter_by == '2'){ $wppm_tl_filter = "Task.status='2'"; }elseif($filter_by == '3'){ $wppm_tl_filter = "Task.status='3'"; }elseif($filter_by == 'mine'){ $wppm_tl_filter = "(FIND_IN_SET('$current_user->ID',Task.users)>0)"; }elseif($filter_by == 'archived'){ $wppm_tl_filter = "Task.is_archived = 1"; }elseif($filter_by == 'today'){ $wppm_tl_filter = "DATE(Task.end_date) = CURDATE()"; }elseif($filter_by == 'upcoming'){ $wppm_tl_filter = "DATE(Task.end_date) BETWEEN CURDATE() AND DATE_ADD(CURDATE(), INTERVAL 7 DAY) AND Task.status != 4 AND Task.active = 1 AND Task.is_archived = 0"; }elseif ($filter_by == 'mytasks') { $wppm_tl_filter = "( FIND_IN_SET('$current_user->ID', Task.users) OR Task.created_by = '$current_user->ID' ) AND Task.status != 4 AND Task.active = 1 AND Task.is_archived = 0"; } if(!empty($tl_advanced_filters['created_by'])){ $created_by_ids = array_map('intval', $tl_advanced_filters['created_by']); $wppm_tl_filter .= " AND Task.created_by IN (" . implode(',', $created_by_ids) . ")"; } if(!empty($tl_advanced_filters['assigned'])){ $assigned_ids = array_map('intval', $tl_advanced_filters['assigned']); $assigned_sql = []; foreach ($assigned_ids as $user_id) { $assigned_sql[] = "FIND_IN_SET('$user_id', Task.users)"; } $wppm_tl_filter .= " AND (" . implode(' OR ', $assigned_sql) . ")"; } if(!empty($tl_advanced_filters['priority'])){ $priority = array_map('intval', $tl_advanced_filters['priority']); $wppm_tl_filter .= " AND Task.priority IN (" . implode(',', $priority) . ")"; } if(!empty($tl_advanced_filters['start_date'])){ $start_date = sanitize_text_field($tl_advanced_filters['start_date']); $wppm_tl_filter .= $wpdb->prepare(" AND (CAST(Task.start_date AS DATE)) >= %s", $start_date); } if(!empty($tl_advanced_filters['end_date'])){ $end_date = sanitize_text_field($tl_advanced_filters['end_date']); $wppm_tl_filter .= $wpdb->prepare(" AND (CAST(Task.end_date AS DATE)) <= %s", $end_date); } $advanced_conditions = []; // Created By if (!empty($advanced_filter['created_by'])) { $created_by_ids = array_map('intval', $advanced_filter['created_by']); $advanced_conditions[] = "Task.created_by IN (" . implode(',', $created_by_ids) . ")"; } // Assigned Users if (!empty($advanced_filter['assigned'])) { $assigned_ids = array_map('intval', $advanced_filter['assigned']); $assigned_sql = []; foreach ($assigned_ids as $user_id) { $assigned_sql[] = "FIND_IN_SET('$user_id', Task.users)"; } $advanced_conditions[] = "(" . implode(' OR ', $assigned_sql) . ")"; } // Priority if (!empty($advanced_filter['priority'])) { $priority = array_map('intval', $advanced_filter['priority']); $advanced_conditions[] = "Task.priority IN (" . implode(',', $priority) . ")"; } // Start Date if (!empty($advanced_filter['start_date'])) { $start_date = sanitize_text_field($advanced_filter['start_date']); $advanced_conditions[] = $wpdb->prepare("(CAST(Task.start_date AS DATE)) >= %s", $start_date); } // End Date if (!empty($advanced_filter['end_date'])) { $end_date = sanitize_text_field($advanced_filter['end_date']); $advanced_conditions[] = $wpdb->prepare("(CAST(Task.end_date AS DATE)) <= %s", $end_date); } if (!empty($advanced_conditions)) { $wppm_tl_filter .= " AND " . implode(" AND ", $advanced_conditions); } // Subtasks are shown only within their parent task, never as their own row/card in project views. $wppm_tl_filter .= " AND (Task.parent_task_id = 0 OR Task.parent_task_id IS NULL)"; if(!empty($wppm_hide_task_statuses_from_frontend) && is_array($wppm_hide_task_statuses_from_frontend) && (isset($_POST['is_frontend']) && sanitize_text_field($_POST['is_frontend'])==1)){ foreach($wppm_hide_task_statuses_from_frontend as $status){ $wppm_tl_filter .= " AND Task.status != '$status'"; } } if($proj_filter!=0){ $proj_filter = absint( $proj_filter ); $wppm_task_by_proj_filter = $wpdb->prepare( "Task.project = %d AND proj.is_archived = 0", $proj_filter ); }else{ $wppm_task_by_proj_filter ="1=1"; } if(!empty($task_status)){ foreach($task_status as $status) { $status_id = absint($status->id); if(!empty($search_tag)){ $search_tag_text = '%'.$wpdb->esc_like($search_tag).'%'; if($current_user->has_cap('manage_options') || $wppm_current_user_capability == 'wppm_admin'){ $query = ("SELECT Task.* FROM {$wpdb->prefix}wppm_task AS Task Left join {$wpdb->prefix}wppm_project proj ON Task.project = proj.id Left join {$wpdb->prefix}wppm_task_statuses task_statuses ON Task.status = task_statuses.id Left join {$wpdb->prefix}wppm_task_priorities task_priorities ON Task.priority = task_priorities.id Left join {$wpdb->base_prefix}users user ON (FIND_IN_SET(user.ID,Task.users)>0) Left join {$wpdb->prefix}wppm_project_meta proj_meta ON Task.project = proj_meta.project_id "); $no_of_rows = ( "SELECT count(*) FROM ($query"); if(!empty($public_projects)){ $where = $wpdb->prepare( " WHERE ( proj_meta.meta_key = %s AND proj_meta.meta_value = %d ) AND {$wppm_tl_filter} AND {$wppm_task_by_proj_filter} AND ( Task.task_name LIKE %s OR proj.project_name LIKE %s OR task_statuses.name LIKE %s OR task_priorities.name LIKE %s OR user.display_name LIKE %s ) AND Task.status = %d ", 'public_project', 1, $search_tag_text, $search_tag_text, $search_tag_text, $search_tag_text, $search_tag_text, $status_id ); }else{ $where = $wpdb->prepare( " WHERE {$wppm_tl_filter} AND {$wppm_task_by_proj_filter} AND ( Task.task_name LIKE %s OR proj.project_name LIKE %s OR task_statuses.name LIKE %s OR task_priorities.name LIKE %s OR user.display_name LIKE %s ) AND Task.status = %d ", $search_tag_text, $search_tag_text, $search_tag_text, $search_tag_text, $search_tag_text, $status_id ); } } else{ $query = ("SELECT Task.* FROM {$wpdb->prefix}wppm_task AS Task Left join {$wpdb->prefix}wppm_project proj ON Task.project = proj.id Left join {$wpdb->prefix}wppm_task_statuses task_statuses ON Task.status = task_statuses.id Left join {$wpdb->prefix}wppm_task_priorities task_priorities ON Task.priority = task_priorities.id Left join {$wpdb->prefix}wppm_project_users proj_users ON Task.project = proj_users.proj_id Left join {$wpdb->base_prefix}users user ON (FIND_IN_SET(user.ID,Task.users)>0) Left join {$wpdb->prefix}wppm_project_meta proj_meta ON Task.project = proj_meta.project_id "); $no_of_rows = ( "SELECT count(*) FROM ($query"); if(!empty($public_projects)){ $where = $wpdb->prepare( " WHERE ( proj_meta.meta_key = %s AND proj_meta.meta_value = %d ) AND proj.is_archived = 0 AND {$wppm_tl_filter} AND {$wppm_task_by_proj_filter} AND ( Task.task_name LIKE %s OR proj.project_name LIKE %s OR task_statuses.name LIKE %s OR task_priorities.name LIKE %s OR user.display_name LIKE %s ) AND Task.status = %d ", 'public_project', 1, $search_tag_text, $search_tag_text, $search_tag_text, $search_tag_text, $search_tag_text, $status_id ); }else{ $where = $wpdb->prepare( " WHERE {$wppm_tl_filter} AND proj.is_archived = 0 AND {$wppm_task_by_proj_filter} AND ( ( FIND_IN_SET(%d, Task.users) > 0 OR Task.created_by = %d OR ( proj_users.user_id = %d AND proj_users.role_id = %d AND FIND_IN_SET(%d, proj.users) > 0 ) OR ( Task.project = proj_meta.project_id AND proj_meta.meta_key = %s AND proj_meta.meta_value = %d ) OR proj.created_by = %d ) AND ( Task.task_name LIKE %s OR proj.project_name LIKE %s OR task_statuses.name LIKE %s OR task_priorities.name LIKE %s OR user.display_name LIKE %s ) ) AND Task.status = %d ", $current_user->ID, $cu_id, $cu_id, 1, $current_user->ID, 'public_project', 1, $cu_id, $search_tag_text, $search_tag_text, $search_tag_text, $search_tag_text, $search_tag_text, $status_id ); } } }else{ if($current_user->has_cap('manage_options') || $wppm_current_user_capability == 'wppm_admin'){ $query = ( "SELECT Task.* FROM {$wpdb->prefix}wppm_task AS Task Left join {$wpdb->prefix}wppm_project proj ON Task.project = proj.id Left join {$wpdb->prefix}wppm_project_meta proj_meta ON Task.project = proj_meta.project_id "); $no_of_rows = ( "SELECT count(*) FROM ($query"); if(!empty($public_projects)){ $where = $wpdb->prepare( " WHERE ( proj_meta.meta_key = %s AND proj_meta.meta_value = %d ) AND {$wppm_tl_filter} AND proj.is_archived = 0 AND {$wppm_task_by_proj_filter} AND Task.status = %d ", 'public_project', 1, $status_id ); }else{ $where = $wpdb->prepare( " WHERE {$wppm_tl_filter} AND {$wppm_task_by_proj_filter} AND proj.is_archived = 0 AND Task.status = %d ", $status_id ); } }else{ $query = ( "SELECT Task.* FROM {$wpdb->prefix}wppm_task AS Task Left join {$wpdb->prefix}wppm_project proj ON Task.project = proj.id Left join {$wpdb->prefix}wppm_project_users proj_users ON Task.project = proj_users.proj_id Left join {$wpdb->prefix}wppm_project_meta proj_meta ON Task.project = proj_meta.project_id "); $no_of_rows = ( "SELECT count(*) FROM ($query"); if(!empty($public_projects)){ $where = $wpdb->prepare( " WHERE ( proj_meta.meta_key = %s AND proj_meta.meta_value = %d ) AND {$wppm_tl_filter} AND proj.is_archived = 0 AND {$wppm_task_by_proj_filter} AND Task.status = %d ", 'public_project', 1, $status_id ); } else{ $where = $wpdb->prepare( " WHERE {$wppm_tl_filter} AND {$wppm_task_by_proj_filter} AND proj.is_archived = 0 AND ( FIND_IN_SET(%d, Task.users) > 0 OR Task.created_by = %d OR ( proj_users.user_id = %d AND proj_users.role_id = %d AND FIND_IN_SET(%d, proj.users) > 0 ) OR ( Task.project = proj_meta.project_id AND proj_meta.meta_key = %s AND proj_meta.meta_value = %d ) OR proj.created_by = %d ) AND Task.status = %d ", $current_user->ID, $cu_id, $cu_id, 1, $current_user->ID, 'public_project', 1, $cu_id, $status_id ); } } } $query = apply_filters('wppm_query_for_grid_view',$query); $no_of_rows = apply_filters('wppm_number_of_rows_query_for_grid_view',$no_of_rows); $where.= $wppm_proj_attr; if($filter_by != 'archived'){ $where .= $archived_where; } if($id!=0){ $where .=$wppm_project_filter; } $where = apply_filters('wppm_task_list_where_for_grid_view',$where,$wppm_tl_filter,$search_tag); $no_of_rows .= $where; $no_of_rows .= " Group by Task.id) AS Task"; $no_of_rows = apply_filters('wppm_task_list_no_of_rows_for_grid_view',$no_of_rows); $totalrows = $wpdb->get_var($no_of_rows); $totalrows_tasks +=$totalrows; if($total_no_of_rows > $totalrows){ $totalrows = $total_no_of_rows; }else{ $total_no_of_rows = $totalrows; } $limit_start=$page_no*$task_per_page; $limit="\n LIMIT ".$limit_start.",".$task_per_page." "; $current_page=$page_no+1; $query = apply_filters('wppm_tasks_grid_view_query',$query,$search_tag); $where .= " Group by Task.id"; $query .= $where; $query = apply_filters('wppm_task_list_grid_view_query',$query); $query = $query.$limit; $wppm_task_fillter[] = $wpdb->get_results($query); } $total_pages=ceil($total_no_of_rows/$task_per_page); $prev_page_no=$current_page-1; $prev_class=(!$prev_page_no)?'disabled':''; $next_page_no=($total_pages==$current_page)? $current_page-1:$current_page; $next_class=($total_pages==$current_page)?'disabled':''; $flag = false; if(!empty($wppm_task_fillter)){ foreach($wppm_task_fillter as $key_filter=>$val_filter){ foreach($val_filter as $key=>$val){ $val_array = (array) $val; $tusers = $val_array['users']; $tusers_arr = explode(',',$tusers); $tproject_id = ($val_array['project']); if(!empty($tusers) && in_array($current_user->ID,$tusers_arr)){ $project_user_role = $wpdb->get_var( $wpdb->prepare("SELECT role_id FROM {$wpdb->prefix}wppm_project_users WHERE proj_id = %d AND user_id = %d", absint($tproject_id), absint($cu_id))); $project_users = $wpdb->get_var( $wpdb->prepare( "SELECT users FROM {$wpdb->prefix}wppm_project WHERE id = %d", absint($tproject_id))); $project_users_arr = explode(',',(string)$project_users); if((!empty($project_user_role)) && ($project_user_role == 1) && in_array($current_user->ID,$project_users_arr)){ $flag = true; break; } } } } } } $todo_status_name = $wpdb->get_var($wpdb->prepare("SELECT name FROM {$wpdb->prefix}wppm_task_statuses where id=%d",1)); $inp_status_name = $wpdb->get_var($wpdb->prepare("SELECT name FROM {$wpdb->prefix}wppm_task_statuses where id=%d",2)); $hold_status_name = $wpdb->get_var($wpdb->prepare("SELECT name FROM {$wpdb->prefix}wppm_task_statuses where id=%d",3)); $completed_status_name = $wpdb->get_var($wpdb->prepare("SELECT name FROM {$wpdb->prefix}wppm_task_statuses where id=%d",4)); $todo_status_style = (!empty($todo_status_name))? "display:inline" :"display:none;"; $inp_status_style = (!empty($inp_status_name))? "display:inline" :"display:none;"; $hold_status_style = (!empty($hold_status_name))? "display:inline" :"display:none;"; $completed_status_style = (!empty($completed_status_name))? "display:inline" :"display:none;"; if ( empty( $id ) ) { $proj_filter_style = 'display:inline;'; } else { $proj_filter_style = 'display:none;'; } if( isset($page) && $page === 'wppm-tasks'){ $arch_filter_style = "display:inline;"; $dashboard_style = "display:inline;"; }else{ $arch_filter_style = "display:none;"; $dashboard_style = "display:none;"; } if ( isset($page) && $page === 'wppm-archived-tasks' ) { $arch_filter_style = "display:none;"; } else { $arch_filter_style = "display:flex;"; } ?>