| 1 |
<?php |
| 2 |
if ( ! defined( 'ABSPATH' ) ) { |
| 3 |
exit; // Exit if accessed directly |
| 4 |
} |
| 5 |
global $wpdb,$current_user, $wppmfunction; |
| 6 |
$task_per_page = 20; |
| 7 |
$page_no = isset($_POST['page_no']) ? intval(sanitize_text_field($_POST['page_no'])) : '0'; |
| 8 |
$task_status = $wpdb->get_results( "SELECT * FROM {$wpdb->prefix}wppm_task_statuses ORDER BY load_order ASC" ); |
| 9 |
$search_tag = isset($_POST['task_search']) ? sanitize_text_field($_POST['task_search']) : ''; |
| 10 |
$filters = array( |
| 11 |
'search' => $search_tag |
| 12 |
); |
| 13 |
$grid_view_filter = $filters ; |
| 14 |
$tl_filters = isset( $_COOKIE['wppm_grid_view_filters'] ) ? sanitize_text_field( wp_unslash( $_COOKIE['wppm_grid_view_filters'] ) ) : $grid_view_filter; |
| 15 |
if(!is_array($tl_filters)){ |
| 16 |
$tl_filters = json_decode($tl_filters); |
| 17 |
$tl_filters_arr = (array) $tl_filters; |
| 18 |
} else{ |
| 19 |
$tl_filters_arr = $filters; |
| 20 |
} |
| 21 |
$search_tag = isset($_POST['task_search']) ? sanitize_text_field($_POST['task_search']) : $tl_filters_arr['search']; |
| 22 |
$filters = array( |
| 23 |
'search'=>$search_tag |
| 24 |
); |
| 25 |
setcookie('wppm_grid_view_filters',wp_json_encode( $filters ),time() + 3600); |
| 26 |
|
| 27 |
if(!empty($search_tag)){ |
| 28 |
$search_tag_text = '%'.$search_tag.'%'; |
| 29 |
if($current_user->has_cap('manage_options')){ |
| 30 |
$query = ("SELECT Task.* |
| 31 |
FROM {$wpdb->prefix}wppm_task AS Task |
| 32 |
Left join {$wpdb->prefix}wppm_project proj ON Task.project = proj.id |
| 33 |
Left join {$wpdb->prefix}wppm_task_statuses task_statuses ON Task.status = task_statuses.id |
| 34 |
Left join {$wpdb->prefix}wppm_task_priorities task_priorities ON Task.priority = task_priorities.id |
| 35 |
Left join {$wpdb->base_prefix}users user ON (FIND_IN_SET(user.id,Task.users)>0) AND user.display_name LIKE '$search_tag_text' |
| 36 |
where (Task.task_name LIKE '$search_tag_text' OR proj.project_name LIKE '$search_tag_text' OR task_statuses.name LIKE '$search_tag_text' OR task_priorities.name LIKE '$search_tag_text' OR user.display_name LIKE '$search_tag_text') Group by Task.id"); |
| 37 |
$no_of_rows = ("SELECT count(*) FROM |
| 38 |
(SELECT Task.* |
| 39 |
FROM {$wpdb->prefix}wppm_task AS Task |
| 40 |
Left join {$wpdb->prefix}wppm_project proj ON Task.project = proj.id |
| 41 |
Left join {$wpdb->prefix}wppm_task_statuses task_statuses ON Task.status = task_statuses.id |
| 42 |
Left join {$wpdb->prefix}wppm_task_priorities task_priorities ON Task.priority = task_priorities.id |
| 43 |
Left join {$wpdb->base_prefix}users user ON (FIND_IN_SET(user.id,Task.users)>0) AND user.display_name LIKE '$search_tag_text' |
| 44 |
where (Task.task_name LIKE '$search_tag_text' OR proj.project_name LIKE '$search_tag_text' OR task_statuses.name LIKE '$search_tag_text' OR task_priorities.name LIKE '$search_tag_text' OR user.display_name LIKE '$search_tag_text') Group by Task.id) AS Task"); |
| 45 |
} else{ |
| 46 |
$query = ("SELECT Task.* |
| 47 |
FROM {$wpdb->prefix}wppm_task AS Task |
| 48 |
Left join {$wpdb->prefix}wppm_project proj ON Task.project = proj.id |
| 49 |
Left join {$wpdb->prefix}wppm_task_statuses task_statuses ON Task.status = task_statuses.id |
| 50 |
Left join {$wpdb->prefix}wppm_task_priorities task_priorities ON Task.priority = task_priorities.id |
| 51 |
Left join {$wpdb->prefix}wppm_project_users proj_users ON Task.project = proj_users.proj_id |
| 52 |
Left join {$wpdb->base_prefix}users user ON (FIND_IN_SET(user.id,Task.users)>0) AND user.display_name LIKE '$search_tag_text' |
| 53 |
Left join {$wpdb->prefix}wppm_project_meta proj_meta ON Task.project = proj_meta.project_id |
| 54 |
where ((FIND_IN_SET('$current_user->ID',Task.users)>0) OR (Task.created_by= '$current_user->ID') OR (proj_users.user_id = '$current_user->ID' AND proj_users.role_id = 1 AND (FIND_IN_SET('$current_user->ID',proj.users)>0)) OR (Task.project = proj_meta.project_id AND proj_meta.meta_key='public_project' AND proj_meta.meta_value=1)) AND (Task.task_name LIKE '$search_tag_text' OR proj.project_name LIKE '$search_tag_text' OR task_statuses.name LIKE '$search_tag_text' OR task_priorities.name LIKE '$search_tag_text' OR user.display_name LIKE '$search_tag_text') Group by Task.id"); |
| 55 |
$no_of_rows = ("SELECT count(*) FROM |
| 56 |
(SELECT Task.* |
| 57 |
FROM {$wpdb->prefix}wppm_task AS Task |
| 58 |
Left join {$wpdb->prefix}wppm_project proj ON Task.project = proj.id |
| 59 |
Left join {$wpdb->prefix}wppm_task_statuses task_statuses ON Task.status = task_statuses.id |
| 60 |
Left join {$wpdb->prefix}wppm_task_priorities task_priorities ON Task.priority = task_priorities.id |
| 61 |
Left join {$wpdb->prefix}wppm_project_users proj_users ON Task.project = proj_users.proj_id |
| 62 |
Left join {$wpdb->base_prefix}users user ON (FIND_IN_SET(user.id,Task.users)>0) AND user.display_name LIKE '$search_tag_text' |
| 63 |
Left join {$wpdb->prefix}wppm_project_meta proj_meta ON Task.project = proj_meta.project_id |
| 64 |
where ((FIND_IN_SET('$current_user->ID',Task.users)>0) OR (Task.created_by= '$current_user->ID') OR (proj_users.user_id = '$current_user->ID' AND proj_users.role_id = 1 AND (FIND_IN_SET('$current_user->ID',proj.users)>0)) OR (Task.project = proj_meta.project_id AND proj_meta.meta_key='public_project' AND proj_meta.meta_value=1)) AND (Task.task_name LIKE '$search_tag_text' OR proj.project_name LIKE '$search_tag_text' OR task_statuses.name LIKE '$search_tag_text' OR task_priorities.name LIKE '$search_tag_text' OR user.display_name LIKE '$search_tag_text') Group by Task.id) AS Task"); |
| 65 |
} |
| 66 |
}else{ |
| 67 |
if($current_user->has_cap('manage_options')){ |
| 68 |
$query = ( "SELECT * FROM {$wpdb->prefix}wppm_task"); |
| 69 |
$no_of_rows = ( "SELECT count(*) FROM {$wpdb->prefix}wppm_task" ); |
| 70 |
}else{ |
| 71 |
$query = ( "SELECT Task.* |
| 72 |
FROM {$wpdb->prefix}wppm_task AS Task |
| 73 |
Left join {$wpdb->prefix}wppm_project proj ON Task.project = proj.id |
| 74 |
Left join {$wpdb->prefix}wppm_project_users proj_users ON Task.project = proj_users.proj_id |
| 75 |
Left join {$wpdb->prefix}wppm_project_meta proj_meta ON Task.project = proj_meta.project_id |
| 76 |
where (FIND_IN_SET('$current_user->ID',Task.users)>0) OR (Task.created_by)= '$current_user->ID' OR (proj_users.user_id = '$current_user->ID' AND proj_users.role_id = 1 AND (FIND_IN_SET('$current_user->ID',proj.users)>0)) OR (Task.project = proj_meta.project_id AND proj_meta.meta_key='public_project' AND proj_meta.meta_value=1) Group by Task.id"); |
| 77 |
$no_of_rows = ( "SELECT count(*) FROM |
| 78 |
( SELECT Task.* |
| 79 |
FROM {$wpdb->prefix}wppm_task AS Task |
| 80 |
Left join {$wpdb->prefix}wppm_project proj ON Task.project = proj.id |
| 81 |
Left join {$wpdb->prefix}wppm_project_users proj_users ON Task.project = proj_users.proj_id |
| 82 |
Left join {$wpdb->prefix}wppm_project_meta proj_meta ON Task.project = proj_meta.project_id |
| 83 |
where (FIND_IN_SET('$current_user->ID',Task.users)>0) OR (Task.created_by)= '$current_user->ID' OR (proj_users.user_id = '$current_user->ID' AND proj_users.role_id = 1 AND (FIND_IN_SET('$current_user->ID',proj.users)>0)) OR (Task.project = proj_meta.project_id AND proj_meta.meta_key='public_project' AND proj_meta.meta_value=1) Group by Task.id) AS Task"); |
| 84 |
} |
| 85 |
} |
| 86 |
$no_of_rows = apply_filters('wppm_task_list_no_of_rows_for_grid_view',$no_of_rows); |
| 87 |
$totalrows = $wpdb->get_var($no_of_rows); |
| 88 |
$limit_start=$page_no*$task_per_page; |
| 89 |
$limit="\n LIMIT ".$limit_start.",".$task_per_page." "; |
| 90 |
$current_page=$page_no+1; |
| 91 |
$query = apply_filters('wppm_task_list_grid_view_query',$query); |
| 92 |
$query = $query.$limit; |
| 93 |
$wppm_task_fillter = $wpdb->get_results($query); |
| 94 |
$total_pages=ceil($totalrows/$task_per_page); |
| 95 |
$prev_page_no=$current_page-1; |
| 96 |
$prev_class=(!$prev_page_no)?'disabled':''; |
| 97 |
$next_page_no=($total_pages==$current_page)? $current_page-1:$current_page; |
| 98 |
$next_class=($total_pages==$current_page)?'disabled':''; |
| 99 |
?> |
| 100 |
<form name="wppm_view_project_task" id="wppm_view_project_task"> |
| 101 |
<div class="row"> |
| 102 |
<div class="col-sm-6"> |
| 103 |
<span class="wppm-heading-inline"> <?php echo esc_html_e('Tasks','taskbuilder');?> </span> |
| 104 |
<span class="wppm-add-new-btn btn-primary" onclick="wppm_add_new_task()"><img class="wppm_add_new_task_img" src="<?php echo esc_url( WPPM_PLUGIN_URL . 'asset/images/plus_icon.svg'); ?>" alt="add"><?php echo esc_html_e('Add New','taskbuilder');?></span> |
| 105 |
<span class="wppm-add-new-btn btn-primary" id="wppm_task_list" onclick="wppm_get_task_list()" ><span><img class="wppm_task_list_image" src="<?php echo esc_url( WPPM_PLUGIN_URL . 'asset/images/list-symbol.svg'); ?>" alt="list"></span><span><?php echo esc_html_e('Task List','taskbuilder');?></span></span> |
| 106 |
</div> |
| 107 |
<div id="wppm_task_search" class="col-sm-6"> |
| 108 |
<input type="search" id="wppm_view_task_search_filter" name="wppm_view_task_search_filter" class="form-control form-control-sm" aria-controls="selection-datatable" placeholder="<?php echo esc_attr('Search','taskbuilder')?>" value="<?php echo (!empty($search_tag)) ? esc_attr($search_tag) : "" ?>"> |
| 109 |
<span><img width="25" height="15" class="wppm_task_search_filter_img" src="<?php echo esc_url( WPPM_PLUGIN_URL . 'asset/images/search.svg'); ?>" alt="search"></span> |
| 110 |
</div> |
| 111 |
</div> |
| 112 |
<span id="wppm_list_view_btn" onclick="wppm_get_task_list()"><img src="<?php echo esc_url( WPPM_PLUGIN_URL . 'asset/images/listv.svg'); ?>" alt="list"><span style="margin-left:5px;"><?php echo esc_html_e('List view','taskbuilder');?></span></span> |
| 113 |
<div class="wppm_task_container" id="wppm_task_container"> |
| 114 |
<?php |
| 115 |
if(!empty($task_status)){ |
| 116 |
foreach($task_status as $status) { |
| 117 |
?> |
| 118 |
<div class="wppm_task_list" id="wppm_task_list_<?php echo esc_attr($status->id)?>"> |
| 119 |
<div class="row"> |
| 120 |
<div class="col-sm-12 wppm_card_header" style="background-color:<?php echo esc_attr($status->bg_color)?>;color:<?php echo esc_attr($status->color);?>;"> |
| 121 |
<span class="wppm_status_name"><?php echo esc_html_e($status->name,'taskbuilder');?></span> |
| 122 |
<span class="wppm_add_new_icon" onclick="wppm_add_new_task()"><img src="<?php echo esc_url( WPPM_PLUGIN_URL . 'asset/images/add_new1.svg'); ?>" alt="add"></span> |
| 123 |
</div> |
| 124 |
</div> |
| 125 |
<div id="wppm_card_body_container_<?php echo esc_attr($status->id) ?>" style="height:100%;"> |
| 126 |
<?php |
| 127 |
$total_checklist_items=0; |
| 128 |
$total_checked_items=0; |
| 129 |
$task_per_status = false; |
| 130 |
$total_tasks = 0; |
| 131 |
if(!empty($wppm_task_fillter)){ |
| 132 |
foreach($wppm_task_fillter as $task){ |
| 133 |
$total_tasks++; |
| 134 |
if((!empty($task)) && $task->status==$status->id){ |
| 135 |
$task_per_status = true; |
| 136 |
if(isset($task->priority)){ |
| 137 |
$task_priority = $wpdb->get_row( "SELECT * FROM {$wpdb->prefix}wppm_task_priorities where id = $task->priority" ); |
| 138 |
} |
| 139 |
if(!empty($task->id)){ |
| 140 |
$checklists = $wpdb->get_results( "SELECT * FROM {$wpdb->prefix}wppm_checklist where task_id = $task->id" ); |
| 141 |
$total=$wpdb->get_var("SELECT COUNT(Items.id) AS check_id |
| 142 |
FROM {$wpdb->prefix}wppm_checklist_items AS Items |
| 143 |
Left join {$wpdb->prefix}wppm_checklist checklist ON Items.checklist_id = checklist.id |
| 144 |
WHERE checklist.task_id = $task->id"); |
| 145 |
$total_checked_items=$wpdb->get_var("SELECT COUNT(Items.id) AS check_id |
| 146 |
FROM {$wpdb->prefix}wppm_checklist_items AS Items |
| 147 |
Left join {$wpdb->prefix}wppm_checklist checklist ON Items.checklist_id = checklist.id |
| 148 |
WHERE checklist.task_id = $task->id AND Items.checked=1"); |
| 149 |
?> |
| 150 |
<div class="wppm_card_body" onclick="wppm_open_task(<?php echo esc_attr($task->id)?>)" id="wppm_draggable_card_<?php echo esc_attr($task->id)?>"> |
| 151 |
<div class="row"> |
| 152 |
<div class="col-sm-6"> |
| 153 |
<span class="wppm_td_task_priority" style="background-color:<?php echo (!empty($task_priority->bg_color))? esc_attr($task_priority->bg_color):"";?>;color:<?php echo (!empty($task_priority->color))? esc_attr($task_priority->color):"";?>"><?php echo (!empty($task_priority->name))? esc_html($task_priority->name):"" ?></span> |
| 154 |
</div> |
| 155 |
<div class="wppm_card_task_action col-sm-6"> |
| 156 |
<span class="wppm_checklist_total_checked_item"><?php echo esc_html($total_checked_items.'/'.$total)?></span><span class="wppm_total_checked_item"><img src="<?php echo esc_url( WPPM_PLUGIN_URL . 'asset/images/checked.svg'); ?>" alt="checked"></span> |
| 157 |
<span class="wppm_show_dropdown_menu" onclick="wppm_show_dropdown_menu(<?php echo esc_attr($task->id);?>)" data-popover="wppm-dropdown-menu-<?php echo esc_attr($task->id);?>" id="wppm_task_action_<?php echo esc_attr($task->id);?>"><img src="<?php echo esc_url( WPPM_PLUGIN_URL . 'asset/images/vertical_dot.svg'); ?>" alt="vertical_dot"></span> |
| 158 |
<div class="gpopover" id="wppm-dropdown-menu-<?php echo esc_attr($task->id);?>"> |
| 159 |
<a class="dropdown-item" href="#"><?php echo esc_html_e('Edit','taskbuilder');?></a> |
| 160 |
<a class="dropdown-item" href="#"><?php echo esc_html_e('Delete','taskbuilder');?></a> |
| 161 |
</div> |
| 162 |
</div> |
| 163 |
</div> |
| 164 |
<div class="row"> |
| 165 |
<div class="col-sm-12"> |
| 166 |
<span class="wppm_task_name_grid_view"><?php echo esc_html_e($task->task_name,'taskbuilder');?></span> |
| 167 |
</div> |
| 168 |
</div> |
| 169 |
<div class="row"> |
| 170 |
<div class="col-sm-6 wppm_task_due_date_grid_view"> |
| 171 |
<small><?php echo (isset($task->end_date))? esc_html_e($task->end_date,'taskbuilder') :"" ?></small> |
| 172 |
</div> |
| 173 |
<div class="col-sm-6" class="wppm_card_task_users" style="text-align:right;"> |
| 174 |
<?php |
| 175 |
$task_users = explode(',',$task->users); |
| 176 |
$i=0; |
| 177 |
$project_data = $wppmfunction->get_project($task->project); |
| 178 |
if(!empty($project_data['users'])){ |
| 179 |
$proj_users = explode(',',$project_data['users']); |
| 180 |
} |
| 181 |
if(!empty($task_users)){ |
| 182 |
foreach($task_users as $user){ |
| 183 |
if( (!empty($proj_users)) && (in_array($user,$proj_users))){ |
| 184 |
$i++; |
| 185 |
if( $i <= 4 ){ |
| 186 |
if(!empty($user)){ |
| 187 |
$userdata = get_userdata( $user ); |
| 188 |
?> |
| 189 |
<a href="#" title="<?php echo esc_attr($userdata->display_name)?>"> |
| 190 |
<?php echo get_avatar($user, 25, "mysteryman");?> |
| 191 |
</a> |
| 192 |
<?php } |
| 193 |
} |
| 194 |
} |
| 195 |
} |
| 196 |
} |
| 197 |
if($i > 4){ |
| 198 |
?> |
| 199 |
<a href="#" class="wppm_avatar"> |
| 200 |
<span id="wppm_avatar" style="background-color:black;" class="avatar">+<?php echo esc_html($i-4) ?></span> |
| 201 |
</a> |
| 202 |
<?php } ?> |
| 203 |
</div> |
| 204 |
</div> |
| 205 |
</div> |
| 206 |
<?php |
| 207 |
} |
| 208 |
} |
| 209 |
} |
| 210 |
} |
| 211 |
if($task_per_status==false){ |
| 212 |
?> |
| 213 |
<div class="row"> |
| 214 |
<div class="col-sm-12 wppm_empty_container"> |
| 215 |
<?php echo esc_html_e('Empty','taskbuilder'); ?> |
| 216 |
</div> |
| 217 |
</div> |
| 218 |
<?php |
| 219 |
} |
| 220 |
?> |
| 221 |
</div> |
| 222 |
</div> |
| 223 |
<?php } |
| 224 |
} |
| 225 |
?> |
| 226 |
<input type="hidden" action="wppm_drag_and_drop_card"> |
| 227 |
</div> |
| 228 |
<div class="row wppm_task_pagination_container"> |
| 229 |
<div class="col-sm-4"> |
| 230 |
<?php echo esc_html_e('Total:','taskbuilder'); ?> <?php echo esc_html($total_tasks); ?> <?php echo esc_html_e( 'of','taskbuilder') ?> <?php echo esc_html($totalrows) ?> <?php echo esc_html_e('Tasks','taskbuilder')?> |
| 231 |
</div> |
| 232 |
<div class="wppm_task_pagination col-sm-4" style="<?php echo (esc_attr($total_pages)==0)? "display:none;":"display:flex;"?>"> |
| 233 |
<span class="wppm-pagination-txt"> |
| 234 |
<span><?php echo esc_html($current_page)?> <?php echo esc_html_e('of','taskbuilder');?> <?php echo esc_html($total_pages); ?> <?php echo esc_html_e('Page','taskbuilder'); ?></span> |
| 235 |
</span> |
| 236 |
<span <?php echo esc_attr($prev_class) ?> |
| 237 |
style="<?php echo (isset($prev_class) && esc_attr($prev_class) == 'disabled') ? 'display:none;':'display:block;'?>cursor:pointer;"> |
| 238 |
<a class="wppm_pagination_prev" onclick="return wppm_load_prev_task_page_card_view(<?php echo esc_attr($prev_page_no) ?>,<?php echo esc_attr($page_no)?>);"><?php echo esc_html_e('PREV','taskbuilder');?></a> |
| 239 |
</span> |
| 240 |
<span <?php echo esc_attr($next_class) ?> |
| 241 |
style="<?php echo (isset($next_class) && esc_attr($next_class) == 'disabled')?'display:none;':'display:block;'?>cursor:pointer;"> |
| 242 |
<a class="wppm_pagination_next" onclick="return wppm_load_next_task_page_card_view(<?php echo esc_attr($next_page_no) ?>,<?php echo esc_attr($page_no) ?>);"><?php echo esc_html_e('NEXT','taskbuilder');?></a> |
| 243 |
</span> |
| 244 |
</div> |
| 245 |
</div> |
| 246 |
</form> |
| 247 |
<script type="text/javascript"> |
| 248 |
jQuery( document ).ready( function( jQuery ) { |
| 249 |
dragula([ |
| 250 |
<?php foreach($task_status as $status) { ?> |
| 251 |
document.getElementById("wppm_card_body_container_<?php echo esc_attr($status->id) ?>"), |
| 252 |
<?php } ?> |
| 253 |
], {removeOnSpill: false}) |
| 254 |
.on('drop', function (el,target,source) { |
| 255 |
wppm_drag_drop_card(el,target,source); |
| 256 |
}); |
| 257 |
|
| 258 |
jQuery("input[name='wppm_view_task_search_filter']").keypress(function(e) { |
| 259 |
//Enter key |
| 260 |
if (e.which == 13) { |
| 261 |
e.preventDefault(); |
| 262 |
wppm_display_grid_view(); |
| 263 |
} |
| 264 |
}); |
| 265 |
}) |
| 266 |
function wppm_show_dropdown_menu(task_id){ |
| 267 |
jQuery("#wppm_task_action_"+task_id).gpopover({width: 50}); |
| 268 |
} |
| 269 |
|
| 270 |
function wppm_drag_drop_card(el,target,source){ |
| 271 |
var data = { |
| 272 |
action: 'wppm_drag_and_drop_card', |
| 273 |
el:el.id, |
| 274 |
target: target.id, |
| 275 |
source:source.id |
| 276 |
}; |
| 277 |
jQuery.post(wppm_admin.ajax_url, data, function(response) { |
| 278 |
wppm_display_grid_view(); |
| 279 |
}); |
| 280 |
} |
| 281 |
</script> |