PluginProbe
Taskbuilder – Project Management & Task Management Tool With Kanban Board / 6.0.6
Taskbuilder – Project Management & Task Management Tool With Kanban Board v6.0.6
6.0.6 6.0.5 6.0.2 6.0.3 6.0.4 6.0.1 6.0.0 5.0.8 5.0.9 4.0.9 5.0.0 5.0.1 5.0.2 5.0.3 5.0.4 5.0.5 5.0.6 5.0.7 trunk 1.0.0 1.0.1 1.0.2 1.0.3 1.0.4 1.0.5 All 58 releases
← All changes | includes/admin/tasks/wppm_tasks_list.php +1362 -1055 5.0.86.0.6 View file →
@@ -1,1055 +1,1362 @@
1 -<?php
2 -if ( ! defined( 'ABSPATH' ) ) {
3 - exit; // Exit if accessed directly
4 -}
5 -global $current_user,$wpdb,$wppmfunction;
6 -$task_per_page = 20;
7 -$page_no = isset($_POST['page_no']) ? intval(sanitize_text_field(wp_unslash($_POST['page_no']))) : '0';
8 -$project_id = isset($_POST['project_id']) ? intval(sanitize_text_field(wp_unslash($_POST['project_id']))) : "0";
9 -$search_tag = isset($_POST['task_search']) ? sanitize_text_field(wp_unslash($_POST['task_search'])) : '';
10 -$order = isset($_POST['order']) ? sanitize_text_field(wp_unslash($_POST['order'])) :"ASC";
11 -$sort_by = isset($_POST['sort_by']) ? sanitize_text_field(wp_unslash($_POST['sort_by'])):"task_name";
12 -$filter_by = isset($_POST['wppm_task_filter']) ? sanitize_text_field(wp_unslash($_POST['wppm_task_filter'])) : "all";
13 -$proj_filter = isset($_POST['wppm_proj_filter']) ? sanitize_text_field(wp_unslash($_POST['wppm_proj_filter'])) : "0";
14 -$proj_attr = isset($_POST['wppm_project_attr']) ? sanitize_text_field(wp_unslash($_POST['wppm_project_attr'])):"";
15 -$public_projects = isset($_POST['public_projects']) ? sanitize_text_field(wp_unslash($_POST['public_projects'])):"0";
16 -$page = isset($_POST['page']) ? sanitize_text_field(wp_unslash($_POST['page'])):"";
17 -$wppm_current_user_capability = get_user_meta( $current_user->ID, 'wppm_capability', true );
18 -$wppm_create_tasks_coworkers_permission = get_option('wppm_allow_coworkers_create_task');
19 -$orderby_proj_sql = esc_sql(sanitize_sql_orderby( "project_name" ));
20 -$wppm_date_setting = get_option('wppm_date_setting');
21 -$wppm_hide_completed_status_task = get_option('wppm_hide_completed_status_task');
22 -$wppm_hide_task_statuses_from_frontend = get_option('wppm_hide_task_statuses_from_frontend');
23 -$wppm_deafault_time_duration_task = get_option('wppm_display_time_duration_task');
24 -if(!empty($wppm_hide_task_statuses_from_frontend)){
25 - $wppm_hide_task_statuses_from_frontend = explode(",",$wppm_hide_task_statuses_from_frontend);
26 -} else {
27 - $wppm_hide_task_statuses_from_frontend = '';
28 -}
29 -$proj_attr = esc_sql($proj_attr);
30 -$is_frontend = 0;
31 -if ( ! empty( $proj_attr ) ) {
32 - $wppm_proj_attr = $wpdb->prepare(
33 - ' AND (proj.project_name = %s)',
34 - $proj_attr
35 - );
36 -} else {
37 - $wppm_proj_attr = '';
38 -}
39 -$current_date = wp_date('Y-m-d');
40 -$cu_id = absint($current_user->ID);
41 -$archived_where = '';
42 -if ( isset( $page ) && $page === 'wppm-archived-tasks' ) {
43 - $archived_where = ' AND Task.is_archived = 1';
44 -} elseif ( isset( $page ) && $page === 'wppm-tasks' ) {
45 - $archived_where = ' AND Task.is_archived = 0';
46 -}
47 -$wppm_task_time = get_option('wppm_task_time');
48 -$query = "SELECT proj.*
49 -FROM {$wpdb->prefix}wppm_project AS proj
50 -LEFT JOIN {$wpdb->prefix}wppm_project_meta AS proj_meta ON proj.id = proj_meta.project_id";
51 -if ( $current_user->has_cap( 'manage_options' ) || $wppm_current_user_capability === 'wppm_admin' ) {
52 - if ( ! empty( $proj_attr ) ) {
53 - $where = $wpdb->prepare(
54 - " WHERE proj.project_name = %s
55 - GROUP BY proj.id
56 - ORDER BY $orderby_proj_sql",
57 - $proj_attr
58 - );
59 - } else {
60 - if ( ! empty( $public_projects ) ) {
61 - $where = $wpdb->prepare(
62 - " WHERE proj_meta.meta_key = %s
63 - AND proj_meta.meta_value = %d
64 - GROUP BY proj.id
65 - ORDER BY $orderby_proj_sql",
66 - 'public_project',
67 - 1
68 - );
69 - } else {
70 - $where = " GROUP BY proj.id ORDER BY $orderby_proj_sql";
71 - }
72 - }
73 -} else {
74 - if ( ! empty( $public_projects ) ) {
75 - $where = $wpdb->prepare(
76 - " WHERE (
77 - proj_meta.meta_key = %s
78 - AND proj_meta.meta_value = %d
79 - )
80 - $wppm_proj_attr
81 - GROUP BY proj.id
82 - ORDER BY $orderby_proj_sql",
83 - 'public_project',
84 - 1
85 - );
86 -
87 - } else {
88 - $where = $wpdb->prepare(
89 - " WHERE (
90 - FIND_IN_SET(%d, proj.users)
91 - OR (
92 - proj_meta.meta_key = %s
93 - AND proj_meta.meta_value = %d
94 - )
95 - OR proj.created_by = %d
96 - )
97 - $wppm_proj_attr
98 - GROUP BY proj.id
99 - ORDER BY $orderby_proj_sql",
100 - $current_user->ID,
101 - 'public_project',
102 - 1,
103 - $cu_id
104 - );
105 - }
106 -}
107 -$where = apply_filters('wppm_project_filter_in_task_list_where',$where);
108 -$query.= $where;
109 -$projects = $wpdb->get_results($query);
110 -$appearance_settings = get_option("wppm-ap-task-list");
111 -$filters = array(
112 - 'sort_by' => $sort_by,
113 - 'order' => $order,
114 - 'search' => $search_tag,
115 - 'filter'=>$filter_by,
116 - 'proj_filter' =>$proj_filter
117 -);
118 -$tl_filters = isset( $_COOKIE['wppm_filters'] ) ? sanitize_text_field( wp_unslash( $_COOKIE['wppm_filters'] ) ) : $filters;
119 -if(!is_array($tl_filters)){
120 - $tl_filters = json_decode($tl_filters);
121 - $tl_filters_arr = (array) $tl_filters;
122 -} else{
123 - $tl_filters_arr = $filters;
124 -}
125 -$wppm_tl_filter = "1=1";
126 -$order = isset($_POST['order']) ? sanitize_text_field(wp_unslash($_POST['order'])) :$tl_filters_arr['order'];
127 -$sort_by = isset($_POST['sort_by']) ? sanitize_text_field(wp_unslash($_POST['sort_by'])):$tl_filters_arr['sort_by'];
128 -$search_tag = isset($_POST['task_search']) ? sanitize_text_field(wp_unslash($_POST['task_search'])) : $tl_filters_arr['search'];
129 -$filter_by = isset($_POST['wppm_task_filter']) ? sanitize_text_field(wp_unslash($_POST['wppm_task_filter'])) : $tl_filters_arr['filter'];
130 -$proj_filter = isset($_POST['wppm_proj_filter']) ? sanitize_text_field(wp_unslash($_POST['wppm_proj_filter'])) : $tl_filters_arr['proj_filter'];
131 -$proj_filter = esc_sql($proj_filter);
132 -if($sort_by == ""){
133 - $sort_by = 'task_name';
134 -}
135 -$filters = array(
136 - 'sort_by' => $sort_by,
137 - 'order' => $order,
138 - 'search'=>$search_tag,
139 - 'filter'=>$filter_by,
140 - 'proj_filter'=>$proj_filter
141 -);
142 -setcookie('wppm_filters',wp_json_encode( $filters ),time() + 3600);
143 -
144 -// Allowed sort columns
145 -$allowed_sort_by = [
146 - 'project' => 'proj.project_name',
147 - 'status' => 'task_statuses.name',
148 - 'priority' => 'task_priorities.name',
149 - 'start_date' => 'Task.start_date',
150 - 'end_date' => 'Task.end_date',
151 - 'TIMESTAMPDIFF(SECOND, Task.start_date, Task.end_date)' => 'TIMESTAMPDIFF(SECOND, Task.start_date, Task.end_date)',
152 -];
153 -
154 -// Resolve sort_by safely
155 -$sort_key = isset($_POST['sort_by'])
156 - ? sanitize_text_field(wp_unslash($_POST['sort_by']))
157 - : ($tl_filters_arr['sort_by'] ?? 'task_name');
158 -
159 -$sort_by = $allowed_sort_by[$sort_key] ?? 'Task.task_name';
160 -// Resolve order safely
161 -$order = (isset($_POST['order']) && strtoupper(wp_unslash($_POST['order'])) === 'ASC')
162 - ? 'ASC'
163 - : 'DESC';
164 -
165 -if($filter_by=='all'){
166 - if($wppm_hide_completed_status_task == 0){
167 - $wppm_tl_filter = "Task.status!='4'";
168 - }
169 -}
170 -if($filter_by=='4'){
171 - $wppm_tl_filter = "Task.status='4'";
172 -}elseif($filter_by=='overdue'){
173 - $wppm_tl_filter = "Task.status!='4' AND (CAST(Task.end_date AS DATE)) < '$current_date'";
174 -}elseif($filter_by == 'unassigned'){
175 - $wppm_tl_filter = "Task.users=''";
176 -}elseif($filter_by == '1'){
177 - $wppm_tl_filter = "Task.status='1'";
178 -}elseif($filter_by == '2'){
179 - $wppm_tl_filter = "Task.status='2'";
180 -}elseif($filter_by == '3'){
181 - $wppm_tl_filter = "Task.status='3'";
182 -}elseif($filter_by == 'mine'){
183 - $wppm_tl_filter = "(FIND_IN_SET('$current_user->ID',Task.users)>0)";
184 -}elseif($filter_by == 'archived'){
185 - $wppm_tl_filter = "Task.is_archived = 1";
186 -}
187 -
188 -if(!empty($wppm_hide_task_statuses_from_frontend) && is_array($wppm_hide_task_statuses_from_frontend) && ((isset($_POST['is_frontend'])) && (sanitize_text_field(wp_unslash($_POST['is_frontend']))==1))){
189 - foreach($wppm_hide_task_statuses_from_frontend as $status){
190 - $wppm_tl_filter .= " AND Task.status != '$status'";
191 - }
192 -}
193 -if ( $proj_filter != 0 || $project_id != 0 ) {
194 - if ( $project_id != 0 ) {
195 - $proj_filter = $project_id;
196 - }
197 - $proj_filter = absint( $proj_filter );
198 - $wppm_task_by_proj_filter = $wpdb->prepare(
199 - "Task.project = %d",
200 - $proj_filter
201 - );
202 -} else {
203 - $wppm_task_by_proj_filter = "1=1";
204 -}
205 -$wppm_default_task_date = get_option('wppm_default_task_date');
206 -$search_tag_text = '%'.$wpdb->esc_like($search_tag).'%';
207 -if(!empty($search_tag)){
208 - $search_tag_text = '%'.$wpdb->esc_like($search_tag).'%';
209 - $query = ("SELECT Task.*
210 - FROM {$wpdb->prefix}wppm_task AS Task
211 - Left join {$wpdb->prefix}wppm_project proj ON Task.project = proj.id
212 - Left join {$wpdb->prefix}wppm_task_statuses task_statuses ON Task.status = task_statuses.id
213 - Left join {$wpdb->prefix}wppm_task_priorities task_priorities ON Task.priority = task_priorities.id
214 - Left join {$wpdb->prefix}wppm_project_users proj_users ON Task.project = proj_users.proj_id
215 - Left join {$wpdb->base_prefix}users user ON (FIND_IN_SET(user.id,Task.users)>0) AND user.display_name LIKE '$search_tag_text'
216 - Left join {$wpdb->prefix}wppm_project_meta proj_meta ON Task.project = proj_meta.project_id");
217 -}
218 -else{
219 - if($current_user->has_cap('manage_options') || $wppm_current_user_capability == 'wppm_admin'){
220 - if($sort_by=='task_name'|| $sort_by=='start_date' || $sort_by=='end_date'){
221 - $query = ( "SELECT Task.* FROM {$wpdb->prefix}wppm_task AS Task
222 - Left join {$wpdb->prefix}wppm_project proj ON Task.project = proj.id
223 - Left join {$wpdb->prefix}wppm_project_meta proj_meta ON Task.project = proj_meta.project_id
224 - ");
225 - } else{
226 - $query = ( "SELECT Task.* FROM {$wpdb->prefix}wppm_task AS Task
227 - Left join {$wpdb->prefix}wppm_project proj ON Task.project = proj.id
228 - Left join {$wpdb->prefix}wppm_task_statuses task_statuses ON Task.status = task_statuses.id
229 - Left join {$wpdb->prefix}wppm_task_priorities task_priorities ON Task.priority = task_priorities.id
230 - Left join {$wpdb->prefix}wppm_project_meta proj_meta ON Task.project = proj_meta.project_id
231 - ");
232 - }
233 - }else{
234 - $query = ( "SELECT Task.*
235 - FROM {$wpdb->prefix}wppm_task AS Task
236 - Left join {$wpdb->prefix}wppm_project proj ON Task.project = proj.id
237 - Left join {$wpdb->prefix}wppm_project_users proj_users ON Task.project = proj_users.proj_id
238 - Left join {$wpdb->prefix}wppm_task_statuses task_statuses ON Task.status = task_statuses.id
239 - Left join {$wpdb->prefix}wppm_task_priorities task_priorities ON Task.priority = task_priorities.id
240 - Left join {$wpdb->prefix}wppm_project_meta proj_meta ON Task.project = proj_meta.project_id
241 - ");
242 - }
243 -}
244 -$no_of_rows = ( "SELECT count(*) FROM ($query");
245 -if(!empty($search_tag )){
246 - if($current_user->has_cap('manage_options') || $wppm_current_user_capability == 'wppm_admin'){
247 - if(!empty($public_projects)){
248 - //$where = " where (proj_meta.meta_key='public_project' AND proj_meta.meta_value=1) AND $wppm_tl_filter AND $wppm_task_by_proj_filter 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') $wppm_proj_attr ";
249 - $where = $wpdb->prepare( " WHERE (proj_meta.meta_key='public_project' AND proj_meta.meta_value=1) AND $wppm_tl_filter AND $wppm_task_by_proj_filter
250 - AND (
251 - Task.task_name LIKE %s
252 - OR proj.project_name LIKE %s
253 - OR task_statuses.name LIKE %s
254 - OR task_priorities.name LIKE %s
255 - OR user.display_name LIKE %s
256 - ) $wppm_proj_attr",
257 - $search_tag_text,
258 - $search_tag_text,
259 - $search_tag_text,
260 - $search_tag_text,
261 - $search_tag_text
262 - );
263 - }else{
264 - $where = $wpdb->prepare(
265 - " WHERE $wppm_tl_filter
266 - AND $wppm_task_by_proj_filter
267 - AND (
268 - Task.task_name LIKE %s
269 - OR proj.project_name LIKE %s
270 - OR task_statuses.name LIKE %s
271 - OR task_priorities.name LIKE %s
272 - OR user.display_name LIKE %s
273 - )
274 - $wppm_proj_attr",
275 - $search_tag_text,
276 - $search_tag_text,
277 - $search_tag_text,
278 - $search_tag_text,
279 - $search_tag_text
280 - );
281 - }
282 - } else{
283 - if(!empty($public_projects)){
284 - $where = $wpdb->prepare(
285 - " WHERE
286 - (proj_meta.meta_key='public_project' AND proj_meta.meta_value=1)
287 - AND $wppm_tl_filter
288 - AND $wppm_task_by_proj_filter
289 - AND (
290 - (
291 - FIND_IN_SET(%d, Task.users) > 0
292 - OR Task.created_by = %d
293 - OR (
294 - proj_users.user_id = %d
295 - AND proj_users.role_id = 1
296 - AND FIND_IN_SET(%d, proj.users) > 0
297 - )
298 - OR (
299 - Task.project = proj_meta.project_id
300 - AND proj_meta.meta_key='public_project'
301 - AND proj_meta.meta_value=1
302 - )
303 - OR (
304 - proj.created_by = %d
305 - AND FIND_IN_SET(%d, proj.users) > 0
306 - )
307 - )
308 - AND (
309 - Task.task_name LIKE %s
310 - OR proj.project_name LIKE %s
311 - OR task_statuses.name LIKE %s
312 - OR task_priorities.name LIKE %s
313 - OR user.display_name LIKE %s
314 - )
315 - )
316 - $wppm_proj_attr",
317 - $current_user->ID,
318 - $cu_id,
319 - $cu_id,
320 - $current_user->ID,
321 - $cu_id,
322 - $current_user->ID,
323 - $search_tag_text,
324 - $search_tag_text,
325 - $search_tag_text,
326 - $search_tag_text,
327 - $search_tag_text
328 - );
329 - }else{
330 - $where = $wpdb->prepare(
331 - " WHERE
332 - $wppm_tl_filter
333 - AND $wppm_task_by_proj_filter
334 - AND (
335 - (
336 - FIND_IN_SET(%d, Task.users) > 0
337 - OR Task.created_by = %d
338 - OR (
339 - proj_users.user_id = %d
340 - AND proj_users.role_id = 1
341 - AND FIND_IN_SET(%d, proj.users) > 0
342 - )
343 - OR (
344 - Task.project = proj_meta.project_id
345 - AND proj_meta.meta_key='public_project'
346 - AND proj_meta.meta_value=1
347 - )
348 - OR (
349 - proj.created_by = %d
350 - AND FIND_IN_SET(%d, proj.users) > 0
351 - )
352 - )
353 - AND (
354 - Task.task_name LIKE %s
355 - OR proj.project_name LIKE %s
356 - OR task_statuses.name LIKE %s
357 - OR task_priorities.name LIKE %s
358 - OR user.display_name LIKE %s
359 - )
360 - )
361 - $wppm_proj_attr",
362 - $current_user->ID,
363 - $cu_id,
364 - $cu_id,
365 - $current_user->ID,
366 - $cu_id,
367 - $current_user->ID,
368 - $search_tag_text,
369 - $search_tag_text,
370 - $search_tag_text,
371 - $search_tag_text,
372 - $search_tag_text
373 - );
374 - }
375 - }
376 -}else{
377 - if($current_user->has_cap('manage_options') || $wppm_current_user_capability == 'wppm_admin'){
378 - if(!empty($public_projects)){
379 - $where = $wpdb->prepare(
380 - " WHERE
381 - (proj_meta.meta_key = %s AND proj_meta.meta_value = %d)
382 - AND $wppm_tl_filter
383 - AND $wppm_task_by_proj_filter
384 - $wppm_proj_attr",
385 - 'public_project',
386 - 1
387 - );
388 - }else{
389 - $where = " where $wppm_tl_filter AND $wppm_task_by_proj_filter $wppm_proj_attr";
390 - }
391 - } else{
392 - if(!empty($public_projects)){
393 - $where = $wpdb->prepare(
394 - " WHERE
395 - (
396 - proj_meta.meta_key = %s
397 - AND proj_meta.meta_value = %d
398 - )
399 - AND $wppm_tl_filter
400 - AND $wppm_task_by_proj_filter
401 - $wppm_proj_attr",
402 - 'public_project',
403 - 1
404 - );
405 - }else{
406 - $where = $wpdb->prepare(
407 - " WHERE
408 - $wppm_tl_filter
409 - AND $wppm_task_by_proj_filter
410 - AND (
411 - (
412 - FIND_IN_SET(%d, Task.users) > 0
413 - )
414 - OR (
415 - Task.created_by = %d
416 - )
417 - OR (
418 - proj_users.user_id = %d
419 - AND proj_users.role_id = %d
420 - AND FIND_IN_SET(%d, proj.users) > 0
421 - )
422 - OR (
423 - Task.project = proj_meta.project_id
424 - AND proj_meta.meta_key = %s
425 - AND proj_meta.meta_value = %d
426 - )
427 - OR (
428 - proj.created_by = %d
429 - AND FIND_IN_SET(%d, proj.users) > 0
430 - )
431 - )
432 - $wppm_proj_attr",
433 - $current_user->ID,
434 - $cu_id,
435 - $cu_id,
436 - 1,
437 - $current_user->ID,
438 - 'public_project',
439 - 1,
440 - $cu_id,
441 - $current_user->ID
442 - );
443 - }
444 - }
445 -}
446 -$query = apply_filters('wppm_task_list_list_view_query',$query,$search_tag_text);
447 -$no_of_rows= apply_filters('wppm_task_list_number_of_rows_query',$no_of_rows,$search_tag_text);
448 -$where = apply_filters('wppm_task_list_query_where',$where, $wppm_tl_filter,$search_tag_text);
449 -if($filter_by != 'archived'){
450 - $where .= $archived_where;
451 -}
452 -$no_of_rows_where = $where." Group by Task.id) AS Task";
453 -$no_of_rows .= $no_of_rows_where;
454 -$no_of_rows = apply_filters('wppm_task_list_no_of_rows',$no_of_rows,$wppm_tl_filter,$search_tag_text);
455 -$totalrows = $wpdb->get_var($no_of_rows);
456 -$query .= $where." Group by Task.id ORDER BY ".$sort_by." ".$order."";
457 -$query = apply_filters('wppm_task_list_query',$query);
458 -$limit_start=$page_no*$task_per_page;
459 -$limit="\n LIMIT ".$limit_start.",".$task_per_page." ";
460 -$task_id_array = array();
461 -$query = $query.$limit;
462 -$wppm_task_fillter = $wpdb->get_results($query);
463 -$flag = false;
464 -$project_creator = $wpdb->get_var($wpdb->prepare("SELECT created_by FROM {$wpdb->prefix}wppm_project WHERE created_by = %d",$cu_id));
465 -if(!empty($wppm_task_fillter)){
466 - foreach($wppm_task_fillter as $key_filter=>$val_filter){
467 - $val_array = (array) $val_filter;
468 - $tusers = $val_array['users'];
469 - $tusers_arr = explode(',',$tusers);
470 - $tproject_id = esc_sql($val_array['project']);
471 - if(!empty($tusers) && in_array($current_user->ID,$tusers_arr)){
472 - $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",$tproject_id,$cu_id));
473 - $project_users = $wpdb->get_var($wpdb->prepare("SELECT users FROM {$wpdb->prefix}wppm_project WHERE id = %d",$tproject_id));
474 - $project_users_arr = explode(',',(string)$project_users);
475 - if(((!empty($project_user_role)) && ($project_user_role == 1) && in_array($current_user->ID,$project_users_arr))){
476 - $flag= true;
477 - break;
478 - }
479 - }
480 - }
481 -}
482 -if(($current_user->has_cap('manage_options') || $wppmfunction->has_permission('add_new_task',0) || ($flag==true) || ($project_creator!="")) && (isset($page) && $page != 'wppm-archived-tasks' )){
483 - $style = "display:inline;";
484 -}else{
485 - $style = "display:none;";
486 -}
487 -$style = apply_filters('wppm_tl_add_new_task_btn_style',$style);
488 -if($current_user->has_cap('manage_options') || $wppm_current_user_capability == ('wppm_admin') || ($flag==true) || ($wppmfunction->has_permission('change_task_status',0))!="" || ($project_creator!="")){
489 - $cs_style = "display:flex;";
490 -}else{
491 - $cs_style = "display:none;";
492 -}
493 -if ( isset($page) && $page === 'wppm-archived-tasks' ) {
494 - $ar_filter_style = "display:none;";
495 -} else {
496 - $ar_filter_style = "display:flex;";
497 -}
498 -$todo_status_name = $wpdb->get_var( "SELECT name FROM {$wpdb->prefix}wppm_task_statuses where id='".esc_sql(1)."'" );
499 -$inp_status_name = $wpdb->get_var( "SELECT name FROM {$wpdb->prefix}wppm_task_statuses where id='".esc_sql(2)."'" );
500 -$hold_status_name = $wpdb->get_var( "SELECT name FROM {$wpdb->prefix}wppm_task_statuses where id='".esc_sql(3)."'" );
501 -$completed_status_name = $wpdb->get_var( "SELECT name FROM {$wpdb->prefix}wppm_task_statuses where id='".esc_sql(4)."'" );
502 -$todo_status_style = (!empty($todo_status_name))? "display:inline" :"display:none;";
503 -$inp_status_style = (!empty($inp_status_name))? "display:inline" :"display:none;";
504 -$hold_status_style = (!empty($hold_status_name))? "display:inline" :"display:none;";
505 -$completed_status_style = (!empty($completed_status_name))? "display:inline" :"display:none;";
506 -if( isset($page) && $page === 'wppm-tasks'){
507 - $arch_filter_style = "display:inline;";
508 -}else{
509 - $arch_filter_style = "display:none;";
510 -}
511 -?>
512 -<form id="wppm_task_list_frm">
513 - <div id="wppm_task_list_container" class="wppm_bootstrap">
514 - <div class="row">
515 - <div class="col-sm-12" id="wppm_heading_inline">
516 - <span class="wppm-heading-inline"><?php echo (isset($page) && $page === 'wppm-archived-tasks' ) ? esc_html_e('Archived Tasks','taskbuilder'): esc_html_e('Tasks','taskbuilder');?> </span>
517 - <span class="wppm-add-new-btn btn-primary" id="wppm_add_new_task_btn_tl" style="background-color:<?php echo esc_attr($appearance_settings['list-header-button-background-color'])?>;color:<?php echo esc_attr($appearance_settings['list-header-button-text-color'])?>;<?php echo esc_attr($style)?>;" 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_icon"><?php echo esc_html_e('Add New','taskbuilder');?></span>
518 - <!-- Dashboard Button -->
519 - <a class="wppm-add-new-btn btn-primary" style="background-color:<?php echo esc_attr($appearance_settings['list-header-button-background-color'])?>;color:<?php echo esc_attr($appearance_settings['list-header-button-text-color'])?>;<?php echo esc_attr($style)?>;" href="<?php echo esc_url( admin_url('admin.php?page=wppm-dashboard') ); ?>"
520 - style="margin-right:10px;">
521 - <img src="<?php echo esc_url( WPPM_PLUGIN_URL . 'asset/images/dashboard.svg'); ?>" alt="dashboard_icon">
522 - <?php esc_html_e('Dashboard','taskbuilder'); ?>
523 - </a>
524 - </div>
525 - </div>
526 - <div style="display:flex;justify-content:space-between;margin-top:20px;flex-wrap: wrap;">
527 - <div style="display:flex;flex-wrap: wrap;min-width: 0; max-width: 100%; ">
528 - <div id="wppm_task_filter_container">
529 - <div class="wppm-bulk-actions"style="margin-left: -14px !important;">
530 - <button
531 - id="wppm-task-bulk-actions-btn"
532 - class="wppm-button small secondary"
533 - type="button"
534 - style="display:none;margin: 14px -20px 0px 22px; padding:14px;font: 13px Helvetica Neue, Arial, Helvetica, sans-serif !important;"
535 - data-popover="wppm-task-bulk-actions">
536 - <?php esc_attr_e( 'Bulk Actions ', 'taskbuilder' ); ?><img src="<?php echo esc_url( WPPM_PLUGIN_URL . 'asset/images/wppm_chevron_down_icon.svg'); ?>" alt="chevron_down">
537 - </button>
538 - <div id="wppm-task-bulk-actions" class="gpopover wppm-popover-menu wppm-proj-bulk-actions">
539 - <div class="wppm-popover-menu-item" style="<?php echo esc_attr($cs_style);?><?php echo esc_attr($ar_filter_style);?>" onclick="wppm_bulk_change_task_status('<?php echo esc_attr( wp_create_nonce( 'wppm_bulk_change_task_status' ) ); ?>');">
540 - <span><img style="margin-right:5px;" src="<?php echo esc_url( WPPM_PLUGIN_URL . 'asset/images/gps-navigation.svg'); ?>" alt="task_status"><?php echo esc_html_e('Change Status','taskbuilder'); ?></span>
541 - </div>
542 - <div class="wppm-popover-menu-item" style="<?php echo esc_attr($ar_filter_style);?>" onclick="wppm_bulk_change_task_priority('<?php echo esc_attr( wp_create_nonce( 'wppm_bulk_change_task_priority' ) ); ?>');">
543 - <span><img style="margin-right:5px;" src="<?php echo esc_url( WPPM_PLUGIN_URL . 'asset/images/priority_up_icon.svg'); ?>" alt="priority"><?php echo esc_html_e('Change Priority','taskbuilder'); ?></span>
544 - </div>
545 - <div class="wppm-popover-menu-item" onclick="wppm_bulk_delete_task('<?php echo esc_attr( wp_create_nonce( 'wppm_bulk_delete_task' ) ); ?>');">
546 - <span><img style="margin-right:5px;" src="<?php echo esc_url( WPPM_PLUGIN_URL . 'asset/images/trash-alt-solid.svg'); ?>" alt="delete"><?php echo esc_html_e('Delete Tasks','taskbuilder'); ?></span>
547 - </div>
548 - </div>
549 - <div class="wppm-filter-item">
550 - <label for="wppm_task_filter" style="margin-left:20px;"> <?php echo esc_html_e('Filter','taskbuilder');?></label>
551 - <select id="wppm_task_filter" name="wppm_task_filter" onchange="wppm_apply_task_filter('<?php echo esc_attr($page); ?>')" style="margin-left:20px;">
552 - <option value="all"<?php echo ($filter_by == "all")? 'selected':""?>><?php echo esc_html_e('All','taskbuilder');?></option>
553 - <option value="1" style="<?php echo esc_attr($todo_status_style); ?>" <?php echo ($filter_by == "1")? 'selected':""?>><?php echo esc_html($todo_status_name);?></option>
554 - <option value="2" style="<?php echo esc_attr($inp_status_style); ?>" <?php echo ($filter_by == "2")? 'selected':""?>><?php echo esc_html($inp_status_name);?></option>
555 - <option value="3" style="<?php echo esc_attr($hold_status_style); ?>" <?php echo ($filter_by == "3")? 'selected':""?>><?php echo esc_html($hold_status_name);?></option>
556 - <option value="4" style="<?php echo esc_attr($completed_status_style); ?>" <?php echo ($filter_by == "4")? 'selected':""?>><?php echo esc_html($completed_status_name);?></option>
557 - <option value="mine" <?php echo ($filter_by == "mine")? 'selected':""?>><?php echo esc_html_e('Mine','taskbuilder');?></option>
558 - <option value="unassigned" <?php echo ($filter_by == "unassigned")? 'selected':""?>><?php echo esc_html_e('Unassigned','taskbuilder');?></option>
559 - <option value="overdue" <?php echo ($filter_by == "overdue")? 'selected':""?>><?php echo esc_html_e('Overdue','taskbuilder');?></option>
560 - <option value="archived" style="<?php echo esc_attr($arch_filter_style); ?>" <?php echo ($filter_by == "archived")? 'selected':""?>><?php echo esc_html_e('Archived','taskbuilder');?></option>
561 - </select>
562 - </div>
563 - </div>
564 - </div>
565 - <div class="wppm-filter-item wppm_project_autocomplete_container" style="margin: 0 0 0 28px;">
566 - <label for="wppm_task_list_proj_filter">
567 - <?php echo esc_html_e('Project','taskbuilder');?>
568 - </label><br>
569 - <select searchable="search here" onchange="wppm_tasks_by_select_project('<?php echo esc_attr($page); ?>')" class="form-control" size="40" name="wppm_task_list_proj_filter" id="wppm_task_list_proj_filter" data-width="100%" style="width: 100%!important;">
570 - <option value="0" <?php echo ($proj_filter == 0)? 'selected':""?>><?php echo esc_html_e('All','taskbuilder');?></option>
571 - <?php
572 - if(!empty($projects)){
573 - foreach($projects as $proj) {
574 - ?>
575 - <option value="<?php echo esc_attr($proj->id)?>" <?php echo ($proj_filter == $proj->id)? 'selected':""?>><?php echo esc_html($proj->project_name,'taskbuilder');?></option>
576 - <?php }
577 - } ?>
578 - </select>
579 - </div>
580 - <div class="wppm_display_submit" style="margin: 0 0 -5px 10px;">
581 - <div class="wppm-filter-actions">
582 - <span class="wppm-link" onclick="wppm_tl_reset_filter('<?php echo esc_attr($page); ?>')"> <?php echo esc_html_e('Reset','taskbuilder');?></span>
583 - </div>
584 - </div>
585 - </div>
586 - <div id="wppm_task_search" style="display:flex;justify-content:flex-end;">
587 - <img width="25px" height="15" class="wppm_task_search_filter_img" style="position: relative;top: 10px;left: 30px;" height="15px" src="<?php echo esc_url( WPPM_PLUGIN_URL . 'asset/images/search.svg'); ?>" alt="search">
588 - <input type="search" id="wppm_task_search_filter" style="margin-right:10px;" name="wppm_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) : "" ?>">
589 - </div>
590 - </div>
591 - </div>
592 - <div style="display:flex;justify-content:flex-end;margin-right: 10px;">
593 - <span id="wppm_grid_view_btn" onclick="wppm_view_task_search_filter('<?php echo esc_attr($page_no)?>','<?php echo esc_attr($page)?>','<?php echo esc_attr($project_id)?>')"><img src="<?php echo esc_url( WPPM_PLUGIN_URL . 'asset/images/grid_view.svg'); ?>" alt="grid_view"><span><?php echo esc_html_e('Grid view','taskbuilder');?></span></span>
594 - </div>
595 - </div>
596 - <script>
597 - jQuery('#wppm-more-actions-btn, #wppm-task-bulk-actions-btn').gpopover({width: 200});
598 - </script>
599 - <div id="wppm_task_table_container" class="wppm_task_table_container table-responsive" style="padding: 0 15px 15px 15px;">
600 - <table id="wppm_task_table" class="wppm_table table">
601 - <thead>
602 - <tr>
603 - <th style="background-color:<?php echo esc_attr($appearance_settings['list-header-background-color'])?>" onchange="wppm_task_bulk_select_change()">
604 - <div class="checkbox-container">
605 - <input id="wppm_task_bulk_select_option" class="wppm-bulk-selector" type="checkbox" onchange="wppm_task_bulk_select_change();"/>
606 - <label for="wppm_task_bulk_select_option"></label>
607 - </div>
608 - </th>
609 - <th class="wppm_table_header" style="background-color:<?php echo esc_attr($appearance_settings['list-header-background-color'])?>">
610 - <div id="wppm_task_name_container">
611 - <span id="wppm_task_name_th" style="color:<?php echo esc_attr($appearance_settings['list-header-text-color'])?>"><?php echo esc_html_e('Task name','taskbuilder'); ?></span>
612 - <img width="16" height="16" style = "<?php echo ($sort_by == 'task_name' && $order == 'DESC') ? 'display:inline': 'display:none;'?>" onclick="wppm_sort_up_task_list('task_name','ASC','<?php echo esc_attr($page); ?>')" class="wppm_chevron_img" id="wppm_chevron_sort_up_task_name_img" src="<?php echo esc_url( WPPM_PLUGIN_URL . 'asset/images/sort_up_icon.svg'); ?>" alt="chevron_sort_up_icon">
613 - <img width="16" height="16" style = "<?php echo ($sort_by == 'task_name' && $order == 'ASC') ? 'display:inline': 'display:none;'?>" onclick="wppm_sort_up_task_list('task_name','DESC','<?php echo esc_attr($page); ?>')" class="wppm_chevron_img" id="wppm_chevron_sort_down_task_name_img" src="<?php echo esc_url( WPPM_PLUGIN_URL . 'asset/images/sort_down_icon.svg'); ?>" alt="chevron_sort_down_icon">
614 - </div>
615 - </th>
616 - <th class="wppm_table_header" style="background-color:<?php echo esc_attr($appearance_settings['list-header-background-color'])?>">
617 - <span id="wppm_project_name_th" style="color:<?php echo esc_attr($appearance_settings['list-header-text-color'])?>"><?php echo esc_html_e('Project','taskbuilder'); ?></span>
618 - <img width="16" height="16" style = "<?php echo ($sort_by == 'proj.project_name' && $order == 'DESC') ? 'display:inline': 'display:none;'?>" onclick="wppm_sort_up_task_list('project','ASC','<?php echo esc_attr($page); ?>')" class="wppm_chevron_img" id="wppm_chevron_sort_up_project_list_img" src="<?php echo esc_url( WPPM_PLUGIN_URL . 'asset/images/sort_up_icon.svg'); ?>" alt="chevron_sort_up_icon">
619 - <img width="16" height="16" style = "<?php echo ($sort_by == 'proj.project_name' && $order == 'ASC') ? 'display:inline': 'display:none;'?>" onclick="wppm_sort_up_task_list('project','DESC','<?php echo esc_attr($page); ?>')" class="wppm_chevron_img" id="wppm_chevron_sort_down_project_list_img" src="<?php echo esc_url( WPPM_PLUGIN_URL . 'asset/images/sort_down_icon.svg'); ?>" alt="chevron_sort_down_icon">
620 - </th>
621 - <th class="wppm_table_header" style="background-color:<?php echo esc_attr($appearance_settings['list-header-background-color'])?>">
622 - <span id="wppm_status_th" style="color:<?php echo esc_attr($appearance_settings['list-header-text-color'])?>"><?php echo esc_html_e('Status','taskbuilder'); ?></span>
623 - <img width="16" height="16" style = "<?php echo ($sort_by == 'task_statuses.name' && $order == 'DESC') ? 'display:inline': 'display:none;'?>" onclick="wppm_sort_up_task_list('status','ASC','<?php echo esc_attr($page); ?>')" class="wppm_chevron_img" id="wppm_chevron_sort_up_status_img" src="<?php echo esc_url( WPPM_PLUGIN_URL . 'asset/images/sort_up_icon.svg'); ?>" alt="chevron_sort_up_icon">
624 - <img width="16" height="16" style = "<?php echo ($sort_by == 'task_statuses.name' && $order == 'ASC') ? 'display:inline': 'display:none;'?>" onclick="wppm_sort_up_task_list('status','DESC','<?php echo esc_attr($page); ?>')" class="wppm_chevron_img" id="wppm_chevron_sort_down_status_img" src="<?php echo esc_url( WPPM_PLUGIN_URL . 'asset/images/sort_down_icon.svg'); ?>" alt="chevron_sort_down_icon">
625 - </th>
626 - <th class="wppm_table_header" style="background-color:<?php echo esc_attr($appearance_settings['list-header-background-color'])?>">
627 - <span id="wppm_priority_th" style="color:<?php echo esc_attr($appearance_settings['list-header-text-color'])?>"><?php echo esc_html_e('Priority','taskbuilder'); ?></span>
628 - <img width="16" height="16" style = "<?php echo ($sort_by == ('task_priorities.name') && $order == 'DESC') ? 'display:inline': 'display:none;'?>" onclick="wppm_sort_up_task_list('priority','ASC','<?php echo esc_attr($page); ?>')" class="wppm_chevron_img" id="wppm_chevron_sort_up_priority_img" src="<?php echo esc_url( WPPM_PLUGIN_URL . 'asset/images/sort_up_icon.svg'); ?>" alt="chevron_sort_up_icon">
629 - <img width="16" height="16" style = "<?php echo ($sort_by == ('task_priorities.name') && $order == 'ASC') ? 'display:inline': 'display:none;'?>" onclick="wppm_sort_up_task_list('priority','DESC','<?php echo esc_attr($page); ?>')" class="wppm_chevron_img" id="wppm_chevron_sort_down_priority_img" src="<?php echo esc_url( WPPM_PLUGIN_URL . 'asset/images/sort_down_icon.svg'); ?>" alt="chevron_sort_down_icon">
630 - </th>
631 - <?php if($wppm_default_task_date == 1 && $wppm_deafault_time_duration_task==0) { ?>
632 - <th class="wppm_table_header" style="background-color:<?php echo esc_attr($appearance_settings['list-header-background-color'])?>">
633 - <span id="wppm_start_date_th" style="color:<?php echo esc_attr($appearance_settings['list-header-text-color'])?>"><?php echo esc_html_e('Start date','taskbuilder'); ?></span>
634 - <img width="16" height="16" style = "<?php echo ($sort_by == 'Task.start_date' && $order == 'DESC') ? 'display:inline': 'display:none;'?>" onclick="wppm_sort_up_task_list('start_date','ASC','<?php echo esc_attr($page); ?>')" class="wppm_chevron_img" id="wppm_chevron_sort_up_start_date_img" src="<?php echo esc_url( WPPM_PLUGIN_URL . 'asset/images/sort_up_icon.svg'); ?>" alt="chevron_sort_up_icon">
635 - <img width="16" height="16" style = "<?php echo ($sort_by == 'Task.start_date' && $order == 'ASC') ? 'display:inline': 'display:none;'?>" onclick="wppm_sort_up_task_list('start_date','DESC','<?php echo esc_attr($page); ?>')" class="wppm_chevron_img" id="wppm_chevron_sort_down_start_date_img" src="<?php echo esc_url( WPPM_PLUGIN_URL . 'asset/images/sort_down_icon.svg'); ?>" alt="chevron_sort_down_icon">
636 - </th>
637 - <th class="wppm_table_header" style="background-color:<?php echo esc_attr($appearance_settings['list-header-background-color'])?>">
638 - <span id="wppm_end_date_th" style="color:<?php echo esc_attr($appearance_settings['list-header-text-color'])?>"><?php echo esc_html_e('End date','taskbuilder'); ?></span>
639 - <img width="16" height="16" style = "<?php echo ($sort_by == 'Task.end_date' && $order == 'DESC') ? 'display:inline': 'display:none;'?>" onclick="wppm_sort_up_task_list('end_date','ASC','<?php echo esc_attr($page); ?>')" class="wppm_chevron_img" id="wppm_chevron_sort_up_end_date_img" src="<?php echo esc_url( WPPM_PLUGIN_URL . 'asset/images/sort_up_icon.svg'); ?>" alt="chevron_sort_up_icon">
640 - <img width="16" height="16" style = "<?php echo ($sort_by == 'Task.end_date' && $order == 'ASC') ? 'display:inline': 'display:none;'?>" onclick="wppm_sort_up_task_list('end_date','DESC','<?php echo esc_attr($page); ?>')" class="wppm_chevron_img" id="wppm_chevron_sort_down_end_date_img" src="<?php echo esc_url( WPPM_PLUGIN_URL . 'asset/images/sort_down_icon.svg'); ?>" alt="chevron_sort_down_icon">
641 - </th>
642 - <?php }
643 - if( $wppm_deafault_time_duration_task==1){ ?>
644 - <th class="wppm_table_header" style="background-color:<?php echo esc_attr($appearance_settings['list-header-background-color'])?>">
645 - <span id="wppm_task_duration_th" style="color:<?php echo esc_attr($appearance_settings['list-header-text-color'])?>"><?php echo esc_html_e('Duration','taskbuilder'); ?></span>
646 - <img width="16" height="16" style = "<?php echo ($sort_by == 'TIMESTAMPDIFF(SECOND, Task.start_date, Task.end_date)' && $order == 'DESC') ? 'display:inline': 'display:none;'?>" onclick="wppm_sort_up_task_list('TIMESTAMPDIFF(SECOND, Task.start_date, Task.end_date)','ASC','<?php echo esc_attr($page); ?>')" class="wppm_chevron_img" id="wppm_chevron_sort_up_task_duration_img" src="<?php echo esc_url( WPPM_PLUGIN_URL . 'asset/images/sort_up_icon.svg'); ?>" alt="chevron_sort_up_icon">
647 - <img width="16" height="16" style = "<?php echo ($sort_by == 'TIMESTAMPDIFF(SECOND, Task.start_date, Task.end_date)' && $order == 'ASC') ? 'display:inline': 'display:none;'?>" onclick="wppm_sort_up_task_list('TIMESTAMPDIFF(SECOND, Task.start_date, Task.end_date)','DESC','<?php echo esc_attr($page); ?>')" class="wppm_chevron_img" id="wppm_chevron_sort_down_task_duration_img" src="<?php echo esc_url( WPPM_PLUGIN_URL . 'asset/images/sort_down_icon.svg'); ?>" alt="chevron_sort_down_icon">
648 - </th>
649 - <?php }?>
650 - <th class="wppm_table_header" style="background-color:<?php echo esc_attr($appearance_settings['list-header-background-color'])?>">
651 - <span style="color:<?php echo esc_attr($appearance_settings['list-header-text-color'])?>"><?php echo esc_html_e('Assign To','taskbuilder'); ?></span>
652 - </th>
653 - <th class="wppm_table_header" style="background-color:<?php echo esc_attr($appearance_settings['list-header-background-color'])?>">
654 - <span style="color:<?php echo esc_attr($appearance_settings['list-header-text-color'])?>"><?php echo esc_html_e('Progress','taskbuilder'); ?></span>
655 - </th>
656 - <?php do_action('wppm_table_header');?>
657 - </tr>
658 - </thead>
659 - <tbody>
660 - <?php
661 - $task_index = 0;
662 - $statuses = $wpdb->get_results(
663 - "SELECT * FROM {$wpdb->prefix}wppm_task_statuses",
664 - OBJECT_K
665 - );
666 -
667 - $priorities = $wpdb->get_results(
668 - "SELECT * FROM {$wpdb->prefix}wppm_task_priorities",
669 - OBJECT_K
670 - );
671 - $projects = $wpdb->get_results( "SELECT * FROM {$wpdb->prefix}wppm_project", OBJECT_K) ;
672 - $task_ids = wp_list_pluck($wppm_task_fillter, 'id');
673 - $checklist_counts = [];
674 - if (!empty($task_ids)) {
675 - $task_ids_sql = implode(',', array_map('absint', $task_ids));
676 - $checklist_results = $wpdb->get_results(" SELECT checklist.task_id,
677 - COUNT(Items.id) AS total_items,
678 - SUM(CASE WHEN Items.checked = 1 THEN 1 ELSE 0 END) AS checked_items
679 - FROM {$wpdb->prefix}wppm_checklist_items AS Items
680 - LEFT JOIN {$wpdb->prefix}wppm_checklist AS checklist
681 - ON Items.checklist_id = checklist.id
682 - WHERE checklist.task_id IN ($task_ids_sql)
683 - GROUP BY checklist.task_id"
684 - );
685 - foreach ($checklist_results as $row) {
686 - $checklist_counts[$row->task_id] = [
687 - 'total' => (int) $row->total_items,
688 - 'checked' => (int) $row->checked_items,
689 - ];
690 - }
691 - }
692 - if(!empty($wppm_task_fillter)){
693 - foreach($wppm_task_fillter as $task) {
694 - $task_id = absint($task->id);
695 - $wppm_task_duration = $wppmfunction->wppm_get_duration($task->start_date,$task->end_date);
696 - $checklists = $wpdb->get_results( $wpdb->prepare("SELECT * FROM {$wpdb->prefix}wppm_checklist where task_id = %d",$task_id) );
697 - if(!empty($task)){
698 - $taskdata = $wppmfunction->get_task($task->id);
699 - $project_data = $wppmfunction->get_project($task->project);
700 - $task_index++;
701 - $total = $checklist_counts[$task_id]['total'] ?? 0;
702 - $total_checked_items = $checklist_counts[$task_id]['checked'] ?? 0;
703 - if(isset($task->status)){
704 - $tstatus = absint($task->status);
705 - $status = $statuses[$task->status] ?? null;
706 - }
707 - if(!empty($task->priority)){
708 - $tpriority = absint($task->priority);
709 - $priority = $priorities[$task->priority] ?? null;
710 - }
711 - if(isset($task->project)){
712 - $tproj = absint($task->project);
713 - $project = $projects[$task->project] ?? null;
714 - }
715 - if($wppm_task_time == 1){
716 - $tsDate = new DateTime($task->start_date);
717 - $teDate = new DateTime($task->end_date);
718 - if($task->start_date=='0000-00-00 00:00:00'){
719 - if($wppm_date_setting=='Y-m-d H:i:s'){
720 - $task_start_date = '0000-00-00 00:00:00';
721 - }elseif($wppm_date_setting=='d-m-Y H:i:s'){
722 - $task_start_date = '00-00-0000 00:00:00';
723 - }elseif($wppm_date_setting=='m-d-Y H:i:s'){
724 - $task_start_date = '00-00-0000 00:00:00';
725 - }else{
726 - $task_start_date = '0000-00-00 00:00:00';
727 - }
728 - }if($task->end_date=='0000-00-00 00:00:00'){
729 - if($wppm_date_setting=='Y-m-d H:i:s'){
730 - $task_end_date = '0000-00-00 00:00:00';
731 - }elseif($wppm_date_setting=='d-m-Y H:i:s'){
732 - $task_end_date = '00-00-0000 00:00:00';
733 - }elseif($wppm_date_setting=='m-d-Y H:i:s'){
734 - $task_end_date = '00-00-0000 00:00:00';
735 - }else{
736 - $task_end_date = '0000-00-00 00:00:00';
737 - }
738 - }if($task->start_date!='0000-00-00 00:00:00'){
739 - if(!empty($wppm_date_setting)){
740 - $task_start_date = $tsDate->format($wppm_date_setting);
741 - } else {
742 - $task_start_date = isset($task->start_date)? $task->start_date:"";
743 - }
744 - }if($task->end_date!='0000-00-00 00:00:00'){
745 - if(!empty($wppm_date_setting)){
746 - $task_end_date = $teDate->format($wppm_date_setting);
747 - }else{
748 - $task_end_date = isset($task->end_date) ? $task->end_date: "" ;
749 - }
750 - }
751 - } elseif($wppm_task_time == 0){
752 - $tsDate = new DateTime($task->start_date);
753 - $teDate = new DateTime($task->end_date);
754 - $task_start_date = $tsDate->format('Y-m-d');
755 - $task_end_date = $teDate->format('Y-m-d');
756 - if($task->start_date=='0000-00-00 00:00:00'){
757 - if($wppm_date_setting=='Y-m-d H:i:s'){
758 - $task_start_date = '0000-00-00';
759 - }elseif($wppm_date_setting=='d-m-Y H:i:s'){
760 - $task_start_date = '00-00-0000';
761 - }elseif($wppm_date_setting=='m-d-Y H:i:s'){
762 - $task_start_date = '00-00-0000';
763 - }else{
764 - $task_start_date = '0000-00-00';
765 - }
766 - }
767 - if($task->end_date=='0000-00-00 00:00:00'){
768 - if($wppm_date_setting=='Y-m-d H:i:s'){
769 - $task_end_date = '0000-00-00';
770 - }elseif($wppm_date_setting=='d-m-Y H:i:s'){
771 - $task_end_date = '00-00-0000';
772 - }elseif($wppm_date_setting=='m-d-Y H:i:s'){
773 - $task_end_date = '00-00-0000';
774 - }else{
775 - $task_end_date = '0000-00-00';
776 - }
777 - }
778 - if($task->start_date!='0000-00-00 00:00:00'){
779 - if($wppm_date_setting=='Y-m-d H:i:s'){
780 - $task_start_date = $tsDate->format('Y-m-d');
781 - }elseif($wppm_date_setting=='d-m-Y H:i:s'){
782 - $task_start_date = $tsDate->format('d-m-Y');
783 - }elseif($wppm_date_setting=='m-d-Y H:i:s'){
784 - $task_start_date = $tsDate->format('m-d-Y');
785 - }else{
786 - $task_start_date = $tsDate->format('Y-m-d');
787 - }
788 - }
789 - if($task->end_date!='0000-00-00 00:00:00'){
790 - if($wppm_date_setting=='Y-m-d H:i:s'){
791 - $task_end_date = $teDate->format('Y-m-d');
792 - }elseif($wppm_date_setting=='d-m-Y H:i:s'){
793 - $task_end_date = $teDate->format('d-m-Y');
794 - }elseif($wppm_date_setting=='m-d-Y H:i:s'){
795 - $task_end_date = $teDate->format('m-d-Y');
796 - }else{
797 - $task_end_date = $teDate->format('Y-m-d');
798 - }
799 - }
800 - }
801 - $url = $wppmfunction->get_task_url( $task->id, $is_frontend );
802 - ?>
803 - <tr onclick= "if(link)wppm_tl_handle_click(event, <?php echo esc_attr($task->id) ?>, '<?php echo esc_url( $url ); ?>',<?php echo esc_attr($project_id) ?>)" >
804 - <td class="bulk-selector" onmouseover="link=false;" onmouseout="link=true;">
805 - <div class="wppm-pl-item-selector">
806 - <div class="checkbox-container">
807 - <input id="wppm_bulk_select_<?php echo esc_attr($task->id) ?>" class="wppm-task-bulk-select" type="checkbox" onchange="wppm_bulk_task_item_select_change();" value="<?php echo esc_attr( $task->id ); ?>"/>
808 - <label for="wppm_bulk_select_<?php echo esc_attr($task->id) ?>"></label>
809 - </div>
810 - </div>
811 - </td>
812 - <td onmouseover="link=true;">
813 - <?php echo esc_html($task->task_name) ?>
814 - </td>
815 - <td onmouseover="link=true;">
816 - <?php if(!empty($project->project_name)){
817 - echo esc_html($project->project_name);
818 - }
819 - ?>
820 - </td>
821 - <td onmouseover="link=true;">
822 - <?php if(!empty($task->status)){ ?>
823 - <span class="wppm_td_task_status" style="background-color:<?php echo (isset($status->bg_color))? esc_attr($status->bg_color):"";?>; color: <?php echo (isset($status->color))? esc_attr($status->color):""; ?>"><?php echo (isset($status->name))? esc_html($status->name):"" ?></span>
824 - <?php } ?>
825 - </td>
826 - <td onmouseover="link=true;">
827 - <?php if(!empty($task->priority)){ ?>
828 - <span class ="wppm_td_task_priority" style="background-color:<?php echo (isset($priority->bg_color))? esc_attr($priority->bg_color):"" ;?>; color: <?php echo (isset($priority->color))? esc_attr($priority->color):""; ?>"><?php echo (isset($priority->name))? esc_html($priority->name):"" ?></span>
829 - <?php } ?>
830 - </td>
831 - <?php if($wppm_default_task_date == 1 && $wppm_deafault_time_duration_task==0) { ?>
832 - <td onmouseover="link=true;">
833 - <?php if(!empty($task_start_date)){ ?>
834 - <?php echo esc_html($task_start_date);
835 - } ?>
836 - </td>
837 - <td onmouseover="link=true;"><?php
838 - if(!empty($task_end_date) && ($task->status!=4 && $task_end_date < $current_date && $task_end_date != '0000-00-00 00:00:00' && $task_end_date != '00-00-0000 00:00:00' && $task_end_date != '00-00-0000' && $task_end_date != '0000-00-00')){
839 - $style = "color:#FF0000";
840 - } else{
841 - $style = "color:#2C3E50";
842 - }?>
843 - <span style="<?php echo esc_attr($style); ?>"><?php echo esc_html($task_end_date);?></span>
844 - </td>
845 - <?php } ?>
846 - <?php if($wppm_deafault_time_duration_task==1){ ?>
847 - <?php
848 - if(!empty($task_end_date) && ($task->status!=4 && $task_end_date < $current_date && $task_end_date != '0000-00-00 00:00:00' && $task_end_date != '00-00-0000 00:00:00' && $task_end_date != '00-00-0000' && $task_end_date != '0000-00-00')){
849 - $style = "color:#FF2222";
850 - } else {
851 - $style = "color:#2C3E50";
852 - } ?>
853 - <td onmouseover="link=true;" class="wppm_table_td"><span style="<?php echo esc_attr($style); ?>"><?php echo isset($wppm_task_duration) ? esc_html($wppm_task_duration):"" ?></span></td>
854 - <?php } ?>
855 - </td>
856 - <td onmouseover="link=true;" style="text-align:center;">
857 - <?php
858 - $i=0;
859 - if(!empty($project_data['users'])){
860 - $proj_users = explode(',',$project_data['users']);
861 - }
862 - if(!empty($task->users)){
863 - $users = explode(",",$task->users);
864 - foreach($users as $user){
865 - if( (!empty($proj_users)) && (in_array($user,$proj_users))){
866 - $i++;
867 - if( $i <= 4 ){
868 - $userdata = get_userdata( $user );
869 - if(!empty($userdata)){
870 - ?>
871 - <a href="#" title="<?php echo esc_attr($userdata->display_name); ?>">
872 - <?php echo get_avatar($userdata->ID, 25, "mysteryman")?>
873 - </a> <?php
874 - }
875 - }
876 - }
877 - }
878 - }
879 - if($i > 4){
880 - ?>
881 - <a href="#" class="wppm_avatar">
882 - <span id="wppm_avatar" style="background-color:black;" class="avatar">+<?php echo esc_html($i-4) ?></span>
883 - </a>
884 - <?php } ?>
885 - <?php
886 - if($i==0){
887 - echo esc_html_e('None','taskbuilder');
888 - } ?>
889 - </td>
890 - <td onmouseover="link=true;">
891 - <?php
892 - $completion = 0;
893 - if ($total != 0 && $total != NULL) {
894 - $completion = intval($total_checked_items/$total*100);
895 - }
896 - echo esc_html($completion).'%';
897 - ?>
898 - </td>
899 - <?php do_action('wppm_table_column');?>
900 - </tr>
901 - <?php }
902 - }
903 - }
904 - ?>
905 - </tbody>
906 - </table>
907 - <script>
908 - function wppm_tl_handle_click(event, id, url,project_id) {
909 - if ( ( event.ctrlKey || event.metaKey ) && url ) {
910 - window.open(url, '_blank');
911 - } else {
912 - wppm_open_task(id,project_id);
913 - }
914 - }
915 - </script>
916 - <?php
917 - $current_page=$page_no+1;
918 - $total_pages=ceil($totalrows/$task_per_page);
919 - $prev_page_no=$current_page-1;
920 - $prev_class=($prev_page_no==0)?'disabled':'';
921 - $next_page_no=($total_pages==$current_page)? $current_page-1:$current_page;
922 - $next_class=($total_pages==$current_page)?'disabled':'';
923 - ?>
924 - <div class="row" style="background-color:#ffffff;">
925 - <div class="col-sm-12">
926 - <div class="wppm_task_result" style="<?php echo esc_attr($total_pages==0)? '':'display: none;';?>"><?php esc_html_e('Your search request returned no results.','taskbuilder');?></div>
927 - <hr style="<?php echo esc_attr($total_pages==0)? '':'display: none;';?>">
928 - </div>
929 - <div>
930 - </div>
931 - </div>
932 - <div class="row wppm_task_pagination_container">
933 - <div class="col-sm-4">
934 - <?php echo esc_html_e('Total:','taskbuilder'); ?>&nbsp;<?php echo esc_attr($task_index) ?>&nbsp;<?php echo esc_html_e('of','taskbuilder') ?>&nbsp;<?php echo esc_html($totalrows) ?>&nbsp;<?php echo esc_html_e('Tasks','taskbuilder')?>
935 - </div>
936 - <div class="wppm_task_pagination col-sm-4" style="<?php echo esc_attr($total_pages==0)? "display:none;":"display:flex;"?>">
937 - <span class="wppm-pagination-txt">
938 - <span><?php echo esc_html($current_page)?>&nbsp;<?php echo esc_html_e('of','taskbuilder');?>&nbsp;<?php echo esc_html($total_pages); ?>&nbsp;<?php echo esc_html_e('Page','taskbuilder'); ?></span>
939 - </span>
940 - <span <?php echo esc_attr($prev_class) ?>
941 - style="<?php echo (isset($prev_class) && esc_attr($prev_class)== 'disabled') ? 'display:none;':'display:block;'?>cursor:pointer;">
942 - <a class="wppm_pagination_prev" onclick="return wppm_load_prev_task_page(<?php echo esc_attr($prev_page_no) ?>,<?php echo esc_attr($page_no) ?>,'<?php echo esc_attr($sort_by)?>','<?php echo esc_attr($order) ?>');"><?php echo esc_html_e('PREV','taskbuilder');?></a>
943 - </span>
944 - <span <?php echo esc_attr($next_class) ?>
945 - style="<?php echo (isset($next_class) && esc_attr($next_class) == 'disabled')?'display:none;':'display:block;'?>cursor:pointer;">
946 - <a class="wppm_pagination_next" onclick="return wppm_load_next_task_page(<?php echo esc_attr($next_page_no) ?>,<?php echo esc_attr($page_no) ?>,'<?php echo esc_attr($sort_by)?>','<?php echo esc_attr($order) ?>');"><?php echo esc_html_e('NEXT','taskbuilder');?></a>
947 - </span>
948 - </div>
949 - </div>
950 -</form>
951 -<style>
952 - .select2-selection--single {
953 - height: 30px!important;
954 - }
955 - .select2-dropdown:hover {
956 - color: #23527c!important;;
957 - }
958 - .select2-results__options{
959 - font:15px "Helvetica Neue",Arial,Helvetica,sans-serif !important;
960 - margin: 0!important;
961 - line-height: inherit!important;
962 - }
963 - .select2-selection__rendered{
964 - font:15px "Helvetica Neue",Arial,Helvetica,sans-serif !important;
965 - margin-top: 5px!important;
966 - }
967 - .select2-selection__rendered:hover{
968 - color: #2271b1 !important;
969 - }
970 - .select2-container--default .select2-results__option--highlighted.select2-results__option--selectable{
971 - background-color: #e85f08!important;
972 - color: white !important;
973 - }
974 - .select2-container {
975 - max-width: 150px !important;
976 - min-width: 150px !important;
977 - }
978 - #wppm_task_filter{
979 - min-height: 30px !important;
980 - max-height: 35px !important;
981 - }
982 - #wppm_task_table tr:nth-child(even) td{
983 - background-color:<?php echo esc_attr($appearance_settings['list-item-even-background-color'])?>;
984 - color:<?php echo esc_attr($appearance_settings['list-item-even-text-color'])?>;
985 - }
986 - #wppm_task_table tr:nth-child(odd) td{
987 - background-color:<?php echo esc_attr($appearance_settings['list-item-odd-background-color'])?>;
988 - color:<?php echo esc_attr($appearance_settings['list-item-odd-text-color'])?>;
989 - }
990 - #wppm_task_table tr:hover td{
991 - background-color:<?php echo esc_attr($appearance_settings['list-item-hover-background-color'])?>;
992 - }
993 - #wppm_task_table tr:hover td{
994 - color: <?php echo esc_attr($appearance_settings['list-item-hover-text-color'])?>;
995 - }
996 - #wppm_add_new_task_btn_tl:hover{
997 - background-color:<?php echo esc_attr($appearance_settings['list-header-button-hover-color'])?>!important;
998 - }
999 -</style>
1000 -<script type="text/javascript">
1001 - var link = true;
1002 - jQuery( document ).ready( function( jQuery ) {
1003 - jQuery("input[name='wppm_task_search_filter']").keypress(function(e) {
1004 - //Enter key
1005 - if (e.which == 13) {
1006 - wppm_task_search_filter('<?php echo esc_attr($page); ?>');
1007 - }
1008 - });
1009 - jQuery("#wppm_task_name_th").hover(function(){
1010 - jQuery('#wppm_chevron_sort_up_task_name_img').show();
1011 - jQuery('#wppm_chevron_sort_down_task_name_img').hide();
1012 - });
1013 - jQuery("#wppm_project_name_th").hover(function(){
1014 - jQuery('#wppm_chevron_sort_up_project_list_img').show();
1015 - jQuery('#wppm_chevron_sort_down_project_list_img').hide();
1016 - });
1017 - jQuery("#wppm_status_th").hover(function(){
1018 - jQuery('#wppm_chevron_sort_up_status_img').show();
1019 - jQuery('#wppm_chevron_sort_down_status_img').hide();
1020 - });
1021 - jQuery("#wppm_priority_th").hover(function(){
1022 - jQuery('#wppm_chevron_sort_up_priority_img').show();
1023 - jQuery('#wppm_chevron_sort_down_priority_img').hide();
1024 - });
1025 - jQuery("#wppm_start_date_th").hover(function(){
1026 - jQuery('#wppm_chevron_sort_up_start_date_img').show();
1027 - jQuery('#wppm_chevron_sort_down_start_date_img').hide();
1028 - });
1029 - jQuery("#wppm_end_date_th").hover(function(){
1030 - jQuery('#wppm_chevron_sort_up_end_date_img').show();
1031 - jQuery('#wppm_chevron_sort_down_end_date_img').hide();
1032 - });
1033 - jQuery("#wppm_task_duration_th").hover(function(){
1034 - jQuery('#wppm_chevron_sort_up_task_duration_img').show();
1035 - jQuery('#wppm_chevron_sort_down_task_duration_img').hide();
1036 - });
1037 -
1038 - })
1039 - jQuery('#wppm_task_list_proj_filter').select2({ dropdownAutoWidth: true, width: 'auto' });
1040 - jQuery('#wppm_task_list_proj_filter').val(<?php echo esc_attr($proj_filter) ?>);
1041 - /**
1042 - * Bulk item selector change
1043 - */
1044 - function wppm_bulk_task_item_select_change() {
1045 - jQuery("#wppm-task-bulk-actions-btn").show();
1046 - var items = jQuery(".wppm-task-bulk-select:checked");
1047 - var checked = items.length === 0 ? false : true;
1048 - if(checked){
1049 - jQuery(".wppm-bulk-selector").prop("checked", checked);
1050 - }else{
1051 - jQuery("#wppm-task-bulk-actions-btn").hide();
1052 - jQuery(".wppm-bulk-selector").prop("checked", false);
1053 - }
1054 - }
1055 -</script>
1 +<?php
2 +if ( ! defined( 'ABSPATH' ) ) {
3 + exit; // Exit if accessed directly
4 +}
5 +global $current_user,$wpdb,$wppmfunction;
6 +$task_per_page = 20;
7 +$page_no = isset($_POST['page_no']) ? intval(sanitize_text_field(wp_unslash($_POST['page_no']))) : '0';
8 +$project_id = isset($_POST['project_id']) ? intval(sanitize_text_field(wp_unslash($_POST['project_id']))) : "0";
9 +$search_tag = isset($_POST['task_search']) ? sanitize_text_field(wp_unslash($_POST['task_search'])) : '';
10 +$order = isset($_POST['order']) ? sanitize_text_field(wp_unslash($_POST['order'])) :"ASC";
11 +$sort_by = isset($_POST['sort_by']) ? sanitize_text_field(wp_unslash($_POST['sort_by'])):"task_name";
12 +$filter_by = isset($_POST['wppm_task_filter']) ? sanitize_text_field(wp_unslash($_POST['wppm_task_filter'])) : "all";
13 +if (isset($_POST['filters'])) {
14 + if (is_string($_POST['filters'])) {
15 + $advanced_filter = json_decode( stripslashes( sanitize_text_field( wp_unslash($_POST['filters']))),true );
16 + } elseif (is_array($_POST['filters'])) {
17 + $raw_filters = wp_unslash($_POST['filters']);
18 + $advanced_filter = [
19 + 'created_by' => array_map('absint', (array) ($raw_filters['created_by'] ?? [])),
20 + 'assigned' => array_map('absint', (array) ($raw_filters['assigned'] ?? [])),
21 + 'priority' => array_map('absint', (array) ($raw_filters['priority'] ?? [])),
22 + 'start_date' => sanitize_text_field($raw_filters['start_date'] ?? ''),
23 + 'end_date' => sanitize_text_field($raw_filters['end_date'] ?? ''),
24 + ];
25 + } else {
26 + $advanced_filter = [];
27 + }
28 +}else{
29 + $advanced_filter = [];
30 +}
31 +///$advanced_filter = isset($_POST['filters']) ? (($_POST['filters'])) : "array()";
32 +$proj_filter = isset($_POST['wppm_proj_filter']) ? sanitize_text_field(wp_unslash($_POST['wppm_proj_filter'])) : "0";
33 +$proj_attr = isset($_POST['wppm_project_attr']) ? sanitize_text_field(wp_unslash($_POST['wppm_project_attr'])):"";
34 +$public_projects = isset($_POST['public_projects']) ? sanitize_text_field(wp_unslash($_POST['public_projects'])):"0";
35 +$tb_start_date = isset($_POST['tb_start_date']) ? sanitize_text_field($_POST['tb_start_date']) : '';
36 +$tb_end_date = isset($_POST['tb_end_date']) ? sanitize_text_field($_POST['tb_end_date']) : '';
37 +$tb_created_by = isset($_POST['tb_created_by']) ? sanitize_text_field($_POST['tb_created_by']) : '';
38 +$page = isset($_POST['page']) ? sanitize_text_field(wp_unslash($_POST['page'])):"";
39 +$priorities = $wpdb->get_results("SELECT id, name FROM {$wpdb->prefix}wppm_task_priorities ORDER BY id ASC ");
40 +$users = get_users(array(
41 + 'orderby' => 'display_name',
42 + 'order' => 'ASC'
43 +));
44 +$assigned_users = $wpdb->get_col( " SELECT DISTINCT users FROM {$wpdb->prefix}wppm_task WHERE users != ''");
45 +$all_assigned = [];
46 +foreach ($assigned_users as $row) {
47 + $ids = explode(',', $row);
48 + foreach ($ids as $id) {
49 + $all_assigned[] = trim($id);
50 + }
51 +}
52 +$all_assigned = array_unique($all_assigned);
53 +$wppm_current_user_capability = get_user_meta( $current_user->ID, 'wppm_capability', true );
54 +$wppm_create_tasks_coworkers_permission = get_option('wppm_allow_coworkers_create_task');
55 +$orderby_proj_sql = esc_sql(sanitize_sql_orderby( "project_name" ));
56 +$wppm_date_setting = get_option('wppm_date_setting');
57 +$wppm_hide_completed_status_task = get_option('wppm_hide_completed_status_task');
58 +$wppm_hide_task_statuses_from_frontend = get_option('wppm_hide_task_statuses_from_frontend');
59 +$wppm_deafault_time_duration_task = get_option('wppm_display_time_duration_task');
60 +if(!empty($wppm_hide_task_statuses_from_frontend)){
61 + $wppm_hide_task_statuses_from_frontend = explode(",",$wppm_hide_task_statuses_from_frontend);
62 +} else {
63 + $wppm_hide_task_statuses_from_frontend = '';
64 +}
65 +$proj_attr = esc_sql($proj_attr);
66 +$is_frontend = 0;
67 +if ( ! empty( $proj_attr ) ) {
68 + $wppm_proj_attr = $wpdb->prepare(
69 + ' AND (proj.project_name = %s)',
70 + $proj_attr
71 + );
72 +} else {
73 + $wppm_proj_attr = '';
74 +}
75 +$current_date = wp_date('Y-m-d');
76 +$current_date = esc_sql($current_date );
77 +$cu_id = esc_sql($current_user->ID);
78 +$archived_where = '';
79 +if ( isset( $page ) && $page === 'wppm-archived-tasks' ) {
80 + $archived_where = ' AND Task.is_archived = 1';
81 +} elseif ( isset( $page ) && $page === 'wppm-tasks' ) {
82 + $archived_where = ' AND Task.is_archived = 0';
83 +}
84 +$wppm_task_time = get_option('wppm_task_time');
85 +$query = "SELECT proj.*
86 +FROM {$wpdb->prefix}wppm_project AS proj
87 +LEFT JOIN {$wpdb->prefix}wppm_project_meta AS proj_meta ON proj.id = proj_meta.project_id";
88 +if ( $current_user->has_cap( 'manage_options' ) || $wppm_current_user_capability === 'wppm_admin' ) {
89 + if ( ! empty( $proj_attr ) ) {
90 + $where = $wpdb->prepare(
91 + " WHERE proj.project_name = %s
92 + GROUP BY proj.id
93 + ORDER BY $orderby_proj_sql",
94 + $proj_attr
95 + );
96 + } else {
97 + if ( ! empty( $public_projects ) ) {
98 + $where = $wpdb->prepare(
99 + " WHERE proj_meta.meta_key = %s
100 + AND proj_meta.meta_value = %d
101 + GROUP BY proj.id
102 + ORDER BY $orderby_proj_sql",
103 + 'public_project',
104 + 1
105 + );
106 + } else {
107 + $where = " GROUP BY proj.id ORDER BY $orderby_proj_sql";
108 + }
109 + }
110 +} else {
111 + if ( ! empty( $public_projects ) ) {
112 + $where = $wpdb->prepare(
113 + " WHERE (
114 + proj_meta.meta_key = %s
115 + AND proj_meta.meta_value = %d
116 + )
117 + $wppm_proj_attr
118 + GROUP BY proj.id
119 + ORDER BY $orderby_proj_sql",
120 + 'public_project',
121 + 1
122 + );
123 +
124 + } else {
125 + $where = $wpdb->prepare(
126 + " WHERE (
127 + FIND_IN_SET(%d, proj.users)
128 + OR (
129 + proj_meta.meta_key = %s
130 + AND proj_meta.meta_value = %d
131 + )
132 + OR proj.created_by = %d
133 + )
134 + $wppm_proj_attr
135 + GROUP BY proj.id
136 + ORDER BY $orderby_proj_sql",
137 + $current_user->ID,
138 + 'public_project',
139 + 1,
140 + $cu_id
141 + );
142 + }
143 +}
144 +$where = apply_filters('wppm_project_filter_in_task_list_where',$where);
145 +$query.= $where;
146 +$projects = $wpdb->get_results($query);
147 +$appearance_settings = get_option("wppm-ap-task-list");
148 +$filters = array(
149 + 'sort_by' => $sort_by,
150 + 'order' => $order,
151 + 'search' => $search_tag,
152 + 'filter'=>$filter_by,
153 + 'proj_filter' =>$proj_filter
154 +);
155 +$tl_filters = isset( $_COOKIE['wppm_filters'] ) ? sanitize_text_field( wp_unslash( $_COOKIE['wppm_filters'] ) ) : $filters;
156 +$tl_advanced_filters = [];
157 +if ( !empty($_COOKIE['tb_list_filters']) ) {
158 + $tl_advanced_filters = json_decode(
159 + stripslashes($_COOKIE['tb_list_filters']),
160 + true
161 + );
162 + if ( ! is_array($tl_advanced_filters) ) {
163 + $tl_advanced_filters = [];
164 + }
165 +}
166 +//$tl_advanced_filters = isset( $_COOKIE['wppm_advanced_filters'] ) ? sanitize_text_field( wp_unslash( $_COOKIE['wppm_advanced_filters'] ) ) : $tl_advanced_filters;
167 +
168 +if(!is_array($tl_filters)){
169 + $tl_filters = json_decode($tl_filters);
170 + $tl_filters_arr = (array) $tl_filters;
171 +} else{
172 + $tl_filters_arr = $filters;
173 +}
174 +$wppm_tl_filter = "1=1";
175 +$order = isset($_POST['order']) ? sanitize_text_field(wp_unslash($_POST['order'])) :$tl_filters_arr['order'];
176 +$sort_by = isset($_POST['sort_by']) ? sanitize_text_field(wp_unslash($_POST['sort_by'])):$tl_filters_arr['sort_by'];
177 +$search_tag = isset($_POST['task_search']) ? sanitize_text_field(wp_unslash($_POST['task_search'])) : $tl_filters_arr['search'];
178 +$filter_by = isset($_POST['wppm_task_filter']) ? sanitize_text_field(wp_unslash($_POST['wppm_task_filter'])) : $tl_filters_arr['filter'];
179 +$proj_filter = isset($_POST['wppm_proj_filter']) ? sanitize_text_field(wp_unslash($_POST['wppm_proj_filter'])) : $tl_filters_arr['proj_filter'];
180 +$proj_filter = esc_sql($proj_filter);
181 +if($sort_by == ""){
182 + $sort_by = 'task_name';
183 +}
184 +$filters = array(
185 + 'sort_by' => $sort_by,
186 + 'order' => $order,
187 + 'search'=>$search_tag,
188 + 'filter'=>$filter_by,
189 + 'proj_filter'=>$proj_filter
190 +);
191 +setcookie('wppm_filters',wp_json_encode( $filters ),time() + 3600);
192 +//setcookie('wppm_advanced_filters',wp_json_encode( $tl_advanced_filters ),time() + 3600);
193 +// Allowed sort columns
194 +$allowed_sort_by = [
195 + 'project' => 'proj.project_name',
196 + 'status' => 'task_statuses.name',
197 + 'priority' => 'task_priorities.name',
198 + 'start_date' => 'Task.start_date',
199 + 'end_date' => 'Task.end_date',
200 + 'TIMESTAMPDIFF(SECOND, Task.start_date, Task.end_date)' => 'TIMESTAMPDIFF(SECOND, Task.start_date, Task.end_date)',
201 +];
202 +
203 +// Resolve sort_by safely
204 +$sort_key = isset($_POST['sort_by'])
205 + ? sanitize_text_field(wp_unslash($_POST['sort_by']))
206 + : ($tl_filters_arr['sort_by'] ?? 'task_name');
207 +
208 +$sort_by = $allowed_sort_by[$sort_key] ?? 'Task.task_name';
209 +// Resolve order safely
210 +$order = (isset($_POST['order']) && strtoupper(wp_unslash($_POST['order'])) === 'ASC')
211 + ? 'ASC'
212 + : 'DESC';
213 +
214 +if($filter_by=='all'){
215 + if($wppm_hide_completed_status_task == 0){
216 + $wppm_tl_filter = "Task.status!='4'";
217 + }
218 +}
219 +if($filter_by=='4'){
220 + $wppm_tl_filter = "Task.status='4'";
221 +}elseif($filter_by=='overdue'){
222 + $wppm_tl_filter = "Task.status!='4' AND (CAST(Task.end_date AS DATE)) < '$current_date'";
223 +}elseif($filter_by == 'unassigned'){
224 + $wppm_tl_filter = "Task.users=''";
225 +}elseif($filter_by == '1'){
226 + $wppm_tl_filter = "Task.status='1'";
227 +}elseif($filter_by == '2'){
228 + $wppm_tl_filter = "Task.status='2'";
229 +}elseif($filter_by == '3'){
230 + $wppm_tl_filter = "Task.status='3'";
231 +}elseif($filter_by == 'mine'){
232 + $wppm_tl_filter = "(FIND_IN_SET('$current_user->ID',Task.users)>0)";
233 +}elseif($filter_by == 'archived'){
234 + $wppm_tl_filter = "Task.is_archived = 1";
235 +} elseif($filter_by == 'today'){
236 + $wppm_tl_filter = "DATE(Task.end_date) = CURDATE()";
237 +}elseif($filter_by == 'upcoming'){
238 + $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";
239 +}elseif ($filter_by == 'mytasks') {
240 + $wppm_tl_filter = "(
241 + FIND_IN_SET('$current_user->ID', Task.users)
242 + OR Task.created_by = '$current_user->ID'
243 + )
244 + AND Task.status != 4
245 + AND Task.active = 1
246 + AND Task.is_archived = 0";
247 +
248 +}
249 +
250 +if(!empty($tl_advanced_filters['created_by'])){
251 + $created_by_ids = array_map('intval', $tl_advanced_filters['created_by']);
252 + $wppm_tl_filter .= " AND Task.created_by IN (" . implode(',', $created_by_ids) . ")";
253 +}
254 +if(!empty($tl_advanced_filters['assigned'])){
255 + $assigned_ids = array_map('intval', $tl_advanced_filters['assigned']);
256 + $assigned_sql = [];
257 + foreach ($assigned_ids as $id) {
258 + $assigned_sql[] = "FIND_IN_SET('$id', Task.users)";
259 + }
260 + $wppm_tl_filter .= " AND (" . implode(' OR ', $assigned_sql) . ")";
261 +}
262 +if(!empty($tl_advanced_filters['priority'])){
263 + $priority = array_map('intval', $tl_advanced_filters['priority']);
264 + $wppm_tl_filter .= " AND Task.priority IN (" . implode(',', $priority) . ")";
265 +}
266 +if(!empty($tl_advanced_filters['start_date'])){
267 + $start_date = sanitize_text_field($tl_advanced_filters['start_date']);
268 + $wppm_tl_filter .= $wpdb->prepare(" AND (CAST(Task.start_date AS DATE)) >= %s", $start_date);
269 +}
270 +if(!empty($tl_advanced_filters['end_date'])){
271 + $end_date = sanitize_text_field($tl_advanced_filters['end_date']);
272 + $wppm_tl_filter .= $wpdb->prepare(" AND (CAST(Task.end_date AS DATE)) <= %s", $end_date);
273 +}
274 +
275 +$advanced_conditions = [];
276 +// Created By
277 +if (!empty($advanced_filter['created_by'])) {
278 + $created_by_ids = array_map('intval', $advanced_filter['created_by']);
279 + $advanced_conditions[] = "Task.created_by IN (" . implode(',', $created_by_ids) . ")";
280 +}
281 +// Assigned Users
282 +if (!empty($advanced_filter['assigned'])) {
283 + $assigned_ids = array_map('intval', $advanced_filter['assigned']);
284 + $assigned_sql = [];
285 + foreach ($assigned_ids as $id) {
286 + $assigned_sql[] = "FIND_IN_SET('$id', Task.users)";
287 + }
288 + $advanced_conditions[] = "(" . implode(' OR ', $assigned_sql) . ")";
289 +}
290 +// Priority
291 +if (!empty($advanced_filter['priority'])) {
292 + $priority = array_map('intval', $advanced_filter['priority']);
293 + $advanced_conditions[] = "Task.priority IN (" . implode(',', $priority) . ")";
294 +}
295 +// Start Date
296 +if (!empty($advanced_filter['start_date'])) {
297 + $start_date = sanitize_text_field($advanced_filter['start_date']);
298 + $advanced_conditions[] = $wpdb->prepare("(CAST(Task.start_date AS DATE)) >= %s", $start_date);
299 +}
300 +// End Date
301 +if (!empty($advanced_filter['end_date'])) {
302 + $end_date = sanitize_text_field($advanced_filter['end_date']);
303 + $advanced_conditions[] = $wpdb->prepare("(CAST(Task.end_date AS DATE)) <= %s", $end_date);
304 +}
305 +if (!empty($advanced_conditions)) {
306 + $wppm_tl_filter .= " AND " . implode(" AND ", $advanced_conditions);
307 +}
308 +// Subtasks are shown only within their parent task, never as their own row in the task list.
309 +$wppm_tl_filter .= " AND (Task.parent_task_id = 0 OR Task.parent_task_id IS NULL)";
310 +//setcookie('wppm_advanced_filters',wp_json_encode( $advanced_filter ),time() + 3600);
311 +if(!empty($wppm_hide_task_statuses_from_frontend) && is_array($wppm_hide_task_statuses_from_frontend) && ((isset($_POST['is_frontend'])) && (sanitize_text_field(wp_unslash($_POST['is_frontend']))==1))){
312 + foreach($wppm_hide_task_statuses_from_frontend as $status){
313 + $wppm_tl_filter .= " AND Task.status != '$status'";
314 + }
315 +}
316 +if ( $proj_filter != 0 || $project_id != 0 ) {
317 + if ( $project_id != 0 ) {
318 + $proj_filter = $project_id;
319 + }
320 + $proj_filter = absint( $proj_filter );
321 + $wppm_task_by_proj_filter = $wpdb->prepare(
322 + "Task.project = %d",
323 + $proj_filter
324 + );
325 +} else {
326 + $wppm_task_by_proj_filter = "1=1";
327 +}
328 +$wppm_default_task_date = get_option('wppm_default_task_date');
329 +$search_tag_text = "";
330 +if(!empty($search_tag)){
331 + $search_tag_text = '%'.$wpdb->esc_like($search_tag).'%';
332 + $query = ("SELECT Task.*
333 + FROM {$wpdb->prefix}wppm_task AS Task
334 + Left join {$wpdb->prefix}wppm_project proj ON Task.project = proj.id
335 + Left join {$wpdb->prefix}wppm_task_statuses task_statuses ON Task.status = task_statuses.id
336 + Left join {$wpdb->prefix}wppm_task_priorities task_priorities ON Task.priority = task_priorities.id
337 + Left join {$wpdb->prefix}wppm_project_users proj_users ON Task.project = proj_users.proj_id
338 + Left join {$wpdb->base_prefix}users user ON (FIND_IN_SET(user.ID,Task.users)>0)
339 + Left join {$wpdb->prefix}wppm_project_meta proj_meta ON Task.project = proj_meta.project_id");
340 +}
341 +else{
342 + if($current_user->has_cap('manage_options') || $wppm_current_user_capability == 'wppm_admin'){
343 + if($sort_by=='task_name'|| $sort_by=='start_date' || $sort_by=='end_date'){
344 + $query = ( "SELECT Task.* FROM {$wpdb->prefix}wppm_task AS Task
345 + Left join {$wpdb->prefix}wppm_project proj ON Task.project = proj.id
346 + Left join {$wpdb->prefix}wppm_project_meta proj_meta ON Task.project = proj_meta.project_id
347 + ");
348 + } else{
349 + $query = ( "SELECT Task.* FROM {$wpdb->prefix}wppm_task AS Task
350 + Left join {$wpdb->prefix}wppm_project proj ON Task.project = proj.id
351 + Left join {$wpdb->prefix}wppm_task_statuses task_statuses ON Task.status = task_statuses.id
352 + Left join {$wpdb->prefix}wppm_task_priorities task_priorities ON Task.priority = task_priorities.id
353 + Left join {$wpdb->prefix}wppm_project_meta proj_meta ON Task.project = proj_meta.project_id
354 + ");
355 + }
356 + }else{
357 + $query = ( "SELECT Task.*
358 + FROM {$wpdb->prefix}wppm_task AS Task
359 + Left join {$wpdb->prefix}wppm_project proj ON Task.project = proj.id
360 + Left join {$wpdb->prefix}wppm_project_users proj_users ON Task.project = proj_users.proj_id
361 + Left join {$wpdb->prefix}wppm_task_statuses task_statuses ON Task.status = task_statuses.id
362 + Left join {$wpdb->prefix}wppm_task_priorities task_priorities ON Task.priority = task_priorities.id
363 + Left join {$wpdb->prefix}wppm_project_meta proj_meta ON Task.project = proj_meta.project_id
364 + ");
365 + }
366 +}
367 +$no_of_rows = ( "SELECT count(*) FROM ($query");
368 +if(!empty($search_tag )){
369 + if($current_user->has_cap('manage_options') || $wppm_current_user_capability == 'wppm_admin'){
370 + if(!empty($public_projects)){
371 + //$where = " where (proj_meta.meta_key='public_project' AND proj_meta.meta_value=1) AND $wppm_tl_filter AND $wppm_task_by_proj_filter 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') $wppm_proj_attr ";
372 + $where = $wpdb->prepare( " WHERE (proj_meta.meta_key='public_project' AND proj_meta.meta_value=1) AND $wppm_tl_filter AND $wppm_task_by_proj_filter
373 + AND (
374 + Task.task_name LIKE %s
375 + OR proj.project_name LIKE %s
376 + OR task_statuses.name LIKE %s
377 + OR task_priorities.name LIKE %s
378 + OR user.display_name LIKE %s
379 + ) $wppm_proj_attr",
380 + $search_tag_text,
381 + $search_tag_text,
382 + $search_tag_text,
383 + $search_tag_text,
384 + $search_tag_text
385 + );
386 + }else{
387 + $where = $wpdb->prepare(
388 + " WHERE $wppm_tl_filter
389 + AND $wppm_task_by_proj_filter
390 + AND (
391 + Task.task_name LIKE %s
392 + OR proj.project_name LIKE %s
393 + OR task_statuses.name LIKE %s
394 + OR task_priorities.name LIKE %s
395 + OR user.display_name LIKE %s
396 + )
397 + $wppm_proj_attr",
398 + $search_tag_text,
399 + $search_tag_text,
400 + $search_tag_text,
401 + $search_tag_text,
402 + $search_tag_text
403 + );
404 + }
405 + } else{
406 + if(!empty($public_projects)){
407 + $where = $wpdb->prepare(
408 + " WHERE
409 + (proj_meta.meta_key='public_project' AND proj_meta.meta_value=1) AND (proj.is_archived = 0)
410 + AND $wppm_tl_filter
411 + AND $wppm_task_by_proj_filter
412 + AND (
413 + (
414 + FIND_IN_SET(%d, Task.users) > 0
415 + OR Task.created_by = %d
416 + OR (
417 + proj_users.user_id = %d
418 + AND proj_users.role_id = 1
419 + AND FIND_IN_SET(%d, proj.users) > 0
420 + )
421 + OR (
422 + Task.project = proj_meta.project_id
423 + AND proj_meta.meta_key='public_project'
424 + AND proj_meta.meta_value=1
425 + )
426 + OR (
427 + proj.created_by = %d
428 + AND FIND_IN_SET(%d, proj.users) > 0
429 + )
430 + )
431 + AND (
432 + Task.task_name LIKE %s
433 + OR proj.project_name LIKE %s
434 + OR task_statuses.name LIKE %s
435 + OR task_priorities.name LIKE %s
436 + OR user.display_name LIKE %s
437 + )
438 + )
439 + $wppm_proj_attr",
440 + $current_user->ID,
441 + $cu_id,
442 + $cu_id,
443 + $current_user->ID,
444 + $cu_id,
445 + $current_user->ID,
446 + $search_tag_text,
447 + $search_tag_text,
448 + $search_tag_text,
449 + $search_tag_text,
450 + $search_tag_text
451 + );
452 + }else{
453 + $where = $wpdb->prepare(
454 + " WHERE
455 + (proj.is_archived = 0)
456 + AND $wppm_tl_filter
457 + AND $wppm_task_by_proj_filter
458 + AND (
459 + (
460 + FIND_IN_SET(%d, Task.users) > 0
461 + OR Task.created_by = %d
462 + OR (
463 + proj_users.user_id = %d
464 + AND proj_users.role_id = 1
465 + AND FIND_IN_SET(%d, proj.users) > 0
466 + )
467 + OR (
468 + Task.project = proj_meta.project_id
469 + AND proj_meta.meta_key='public_project'
470 + AND proj_meta.meta_value=1
471 + )
472 + OR (
473 + proj.created_by = %d
474 + AND FIND_IN_SET(%d, proj.users) > 0
475 + )
476 + )
477 + AND (
478 + Task.task_name LIKE %s
479 + OR proj.project_name LIKE %s
480 + OR task_statuses.name LIKE %s
481 + OR task_priorities.name LIKE %s
482 + OR user.display_name LIKE %s
483 + )
484 + )
485 + $wppm_proj_attr",
486 + $current_user->ID,
487 + $cu_id,
488 + $cu_id,
489 + $current_user->ID,
490 + $cu_id,
491 + $current_user->ID,
492 + $search_tag_text,
493 + $search_tag_text,
494 + $search_tag_text,
495 + $search_tag_text,
496 + $search_tag_text
497 + );
498 + }
499 + }
500 +}else{
501 + if($current_user->has_cap('manage_options') || $wppm_current_user_capability == 'wppm_admin'){
502 + if(!empty($public_projects)){
503 + $where = $wpdb->prepare(
504 + " WHERE
505 + (proj_meta.meta_key = %s AND proj_meta.meta_value = %d)
506 + AND (proj.is_archived = 0)
507 + AND $wppm_tl_filter
508 + AND $wppm_task_by_proj_filter
509 + $wppm_proj_attr",
510 + 'public_project',
511 + 1
512 + );
513 + }else{
514 + $where = " where (proj.is_archived = 0) AND $wppm_tl_filter AND $wppm_task_by_proj_filter $wppm_proj_attr";
515 + }
516 + } else{
517 + if(!empty($public_projects)){
518 + $where = $wpdb->prepare(
519 + " WHERE
520 + (
521 + proj_meta.meta_key = %s
522 + AND proj_meta.meta_value = %d
523 + )
524 + AND (proj.is_archived = 0)
525 + AND $wppm_tl_filter
526 + AND $wppm_task_by_proj_filter
527 + $wppm_proj_attr",
528 + 'public_project',
529 + 1
530 + );
531 + }else{
532 + $where = $wpdb->prepare(
533 + " WHERE
534 + (proj.is_archived = 0)
535 + AND $wppm_tl_filter
536 + AND $wppm_task_by_proj_filter
537 + AND (
538 + (
539 + FIND_IN_SET(%d, Task.users) > 0
540 + )
541 + OR (
542 + Task.created_by = %d
543 + )
544 + OR (
545 + proj_users.user_id = %d
546 + AND proj_users.role_id = %d
547 + AND FIND_IN_SET(%d, proj.users) > 0
548 + )
549 + OR (
550 + Task.project = proj_meta.project_id
551 + AND proj_meta.meta_key = %s
552 + AND proj_meta.meta_value = %d
553 + )
554 + OR (
555 + proj.created_by = %d
556 + AND FIND_IN_SET(%d, proj.users) > 0
557 + )
558 + )
559 + $wppm_proj_attr",
560 + $current_user->ID,
561 + $cu_id,
562 + $cu_id,
563 + 1,
564 + $current_user->ID,
565 + 'public_project',
566 + 1,
567 + $cu_id,
568 + $current_user->ID
569 + );
570 + }
571 + }
572 +}
573 +$query = apply_filters('wppm_task_list_list_view_query',$query,$search_tag_text);
574 +$no_of_rows= apply_filters('wppm_task_list_number_of_rows_query',$no_of_rows,$search_tag_text);
575 +$where = apply_filters('wppm_task_list_query_where',$where, $wppm_tl_filter,$search_tag_text);
576 +if($filter_by != 'archived'){
577 + $where .= $archived_where;
578 +}
579 +$no_of_rows_where = $where." Group by Task.id) AS Task";
580 +$no_of_rows .= $no_of_rows_where;
581 +$no_of_rows = apply_filters('wppm_task_list_no_of_rows',$no_of_rows,$wppm_tl_filter,$search_tag_text);
582 +$totalrows = $wpdb->get_var($no_of_rows);
583 +$query .= $where." Group by Task.id ORDER BY ".$sort_by." ".$order."";
584 +$query = apply_filters('wppm_task_list_query',$query);
585 +$limit_start=$page_no*$task_per_page;
586 +$limit="\n LIMIT ".$limit_start.",".$task_per_page." ";
587 +$task_id_array = array();
588 +$query = $query.$limit;
589 +$wppm_task_fillter = $wpdb->get_results($query);
590 +$flag = false;
591 +$project_creator = $wpdb->get_var($wpdb->prepare("SELECT created_by FROM {$wpdb->prefix}wppm_project WHERE created_by = %d",$cu_id));
592 +if(!empty($wppm_task_fillter)){
593 + foreach($wppm_task_fillter as $key_filter=>$val_filter){
594 + $val_array = (array) $val_filter;
595 + $tusers = $val_array['users'];
596 + $tusers_arr = explode(',',$tusers);
597 + $tproject_id = esc_sql($val_array['project']);
598 + if(!empty($tusers) && in_array($current_user->ID,$tusers_arr)){
599 + $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",$tproject_id,$cu_id));
600 + $project_users = $wpdb->get_var($wpdb->prepare("SELECT users FROM {$wpdb->prefix}wppm_project WHERE id = %d",$tproject_id));
601 + $project_users_arr = explode(',',(string)$project_users);
602 + if(((!empty($project_user_role)) && ($project_user_role == 1) && in_array($current_user->ID,$project_users_arr))){
603 + $flag= true;
604 + break;
605 + }
606 + }
607 + }
608 +}
609 +if(($current_user->has_cap('manage_options') || $wppmfunction->has_permission('add_new_task',0) || ($flag==true) || ($project_creator!="")) && (isset($page) && $page != 'wppm-archived-tasks' )){
610 + $style = "display:inline;";
611 +}else{
612 + $style = "display:none;";
613 +}
614 +$style = apply_filters('wppm_tl_add_new_task_btn_style',$style);
615 +if($current_user->has_cap('manage_options') || $wppm_current_user_capability == ('wppm_admin') || ($flag==true) || ($wppmfunction->has_permission('change_task_status',0))!="" || ($project_creator!="")){
616 + $cs_style = "display:flex;";
617 +}else{
618 + $cs_style = "display:none;";
619 +}
620 +if ( isset($page) && $page === 'wppm-archived-tasks' ) {
621 + $ar_filter_style = "display:none;";
622 +} else {
623 + $ar_filter_style = "display:flex;";
624 +}
625 +$todo_status_name = $wpdb->get_var( "SELECT name FROM {$wpdb->prefix}wppm_task_statuses where id='".esc_sql(1)."'" );
626 +$inp_status_name = $wpdb->get_var( "SELECT name FROM {$wpdb->prefix}wppm_task_statuses where id='".esc_sql(2)."'" );
627 +$hold_status_name = $wpdb->get_var( "SELECT name FROM {$wpdb->prefix}wppm_task_statuses where id='".esc_sql(3)."'" );
628 +$completed_status_name = $wpdb->get_var( "SELECT name FROM {$wpdb->prefix}wppm_task_statuses where id='".esc_sql(4)."'" );
629 +$todo_status_style = (!empty($todo_status_name))? "display:inline" :"display:none;";
630 +$inp_status_style = (!empty($inp_status_name))? "display:inline" :"display:none;";
631 +$hold_status_style = (!empty($hold_status_name))? "display:inline" :"display:none;";
632 +$completed_status_style = (!empty($completed_status_name))? "display:inline" :"display:none;";
633 +if( isset($page) && $page === 'wppm-tasks'){
634 + $arch_filter_style = "display:inline;";
635 +}else{
636 + $arch_filter_style = "display:none;";
637 +}
638 +?>
639 +<form id="wppm_task_list_frm">
640 + <div id="wppm_task_list_container" class="wppm_bootstrap">
641 + <div class="row">
642 + <div class="col-sm-12" id="wppm_heading_inline">
643 + <span class="wppm-heading-inline"><?php echo (isset($page) && $page === 'wppm-archived-tasks' ) ? esc_html_e('Archived Tasks','taskbuilder'): esc_html_e('Tasks','taskbuilder');?> </span>
644 + <span class="wppm-add-new-btn btn-primary" id="wppm_add_new_task_btn_tl" style="background-color:<?php echo esc_attr($appearance_settings['list-header-button-background-color'])?>;color:<?php echo esc_attr($appearance_settings['list-header-button-text-color'])?>;<?php echo esc_attr($style)?>;" 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_icon"><?php echo esc_html_e('Add New','taskbuilder');?></span>
645 + <!-- Dashboard Button -->
646 + <a class="wppm-add-new-btn btn-primary" style="background-color:<?php echo esc_attr($appearance_settings['list-header-button-background-color'])?>;color:<?php echo esc_attr($appearance_settings['list-header-button-text-color'])?>;<?php echo esc_attr($style)?>;" href="<?php echo esc_url( admin_url('admin.php?page=wppm-dashboard') ); ?>"
647 + style="margin-right:10px;" title="<?php echo esc_attr_e('Go to Dashboard','taskbuilder'); ?>">
648 + <img src="<?php echo esc_url( WPPM_PLUGIN_URL . 'asset/images/dashboard.svg'); ?>" alt="dashboard_icon">
649 + <?php esc_html_e('Dashboard','taskbuilder'); ?>
650 + </a>
651 + </span>
652 + </div>
653 + </div>
654 + <div>
655 + <div style="display:flex;flex-wrap: wrap;min-width: 0; max-width: 100%;margin-top: 20px;">
656 + <div id="wppm_task_filter_container">
657 + <div class="wppm-bulk-actions"style="margin-left: -14px !important;">
658 + <button
659 + id="wppm-task-bulk-actions-btn"
660 + class="wppm-button small secondary"
661 + type="button"
662 + style="display:none;margin: 14px -20px 0px 22px; padding:14px;font: 13px Helvetica Neue, Arial, Helvetica, sans-serif !important;"
663 + data-popover="wppm-task-bulk-actions">
664 + <?php esc_attr_e( 'Bulk Actions ', 'taskbuilder' ); ?><img src="<?php echo esc_url( WPPM_PLUGIN_URL . 'asset/images/wppm_chevron_down_icon.svg'); ?>" alt="chevron_down">
665 + </button>
666 + <div id="wppm-task-bulk-actions" class="gpopover wppm-popover-menu wppm-proj-bulk-actions">
667 + <div class="wppm-popover-menu-item" style="<?php echo esc_attr($cs_style);?><?php echo esc_attr($ar_filter_style);?>" onclick="wppm_bulk_change_task_status('<?php echo esc_attr( wp_create_nonce( 'wppm_bulk_change_task_status' ) ); ?>');">
668 + <span><img style="margin-right:5px;" src="<?php echo esc_url( WPPM_PLUGIN_URL . 'asset/images/gps-navigation.svg'); ?>" alt="task_status"><?php echo esc_html_e('Change Status','taskbuilder'); ?></span>
669 + </div>
670 + <div class="wppm-popover-menu-item" style="<?php echo esc_attr($ar_filter_style);?>" onclick="wppm_bulk_change_task_priority('<?php echo esc_attr( wp_create_nonce( 'wppm_bulk_change_task_priority' ) ); ?>');">
671 + <span><img style="margin-right:5px;" src="<?php echo esc_url( WPPM_PLUGIN_URL . 'asset/images/priority_up_icon.svg'); ?>" alt="priority"><?php echo esc_html_e('Change Priority','taskbuilder'); ?></span>
672 + </div>
673 + <div class="wppm-popover-menu-item" onclick="wppm_bulk_delete_task('<?php echo esc_attr( wp_create_nonce( 'wppm_bulk_delete_task' ) ); ?>');">
674 + <span><img style="margin-right:5px;" src="<?php echo esc_url( WPPM_PLUGIN_URL . 'asset/images/trash-alt-solid.svg'); ?>" alt="delete"><?php echo esc_html_e('Delete Tasks','taskbuilder'); ?></span>
675 + </div>
676 + </div>
677 + <div class="wppm-filter-item">
678 + <label for="wppm_task_filter" style="margin-left:20px;"> <?php echo esc_html_e('Filter','taskbuilder');?></label>
679 + <select id="wppm_task_filter" name="wppm_task_filter" onchange="wppm_apply_task_filter('<?php echo esc_attr($page); ?>')" style="margin-left:20px;">
680 + <option value="all"<?php echo ($filter_by == "all")? 'selected':""?>><?php echo esc_html_e('All','taskbuilder');?></option>
681 + <option value="1" style="<?php echo esc_attr($todo_status_style); ?>" <?php echo ($filter_by == "1")? 'selected':""?>><?php echo esc_html($todo_status_name);?></option>
682 + <option value="2" style="<?php echo esc_attr($inp_status_style); ?>" <?php echo ($filter_by == "2")? 'selected':""?>><?php echo esc_html($inp_status_name);?></option>
683 + <option value="3" style="<?php echo esc_attr($hold_status_style); ?>" <?php echo ($filter_by == "3")? 'selected':""?>><?php echo esc_html($hold_status_name);?></option>
684 + <option value="4" style="<?php echo esc_attr($completed_status_style); ?>" <?php echo ($filter_by == "4")? 'selected':""?>><?php echo esc_html($completed_status_name);?></option>
685 + <option value="mine" <?php echo ($filter_by == "mine")? 'selected':""?>><?php echo esc_html_e('Mine','taskbuilder');?></option>
686 + <option value="unassigned" <?php echo ($filter_by == "unassigned")? 'selected':""?>><?php echo esc_html_e('Unassigned','taskbuilder');?></option>
687 + <option value="overdue" <?php echo ($filter_by == "overdue")? 'selected':""?>><?php echo esc_html_e('Overdue','taskbuilder');?></option>
688 + <option value="archived" style="<?php echo esc_attr($arch_filter_style); ?>" <?php echo ($filter_by == "archived")? 'selected':""?>><?php echo esc_html_e('Archived','taskbuilder');?></option>
689 + </select>
690 + </div>
691 + </div>
692 + </div>
693 + <div class="wppm-filter-item wppm_project_autocomplete_container" style="margin: 0 0 0 20px;">
694 + <label for="wppm_task_list_proj_filter">
695 + <?php echo esc_html_e('Project','taskbuilder');?>
696 + </label><br>
697 + <select searchable="search here" onchange="wppm_tasks_by_select_project('<?php echo esc_attr($page); ?>')" class="form-control" size="40" name="wppm_task_list_proj_filter" id="wppm_task_list_proj_filter" data-width="100%" style="width: 100%!important;">
698 + <option value="0" <?php echo ($proj_filter == 0)? 'selected':""?>><?php echo esc_html_e('All','taskbuilder');?></option>
699 + <?php
700 + if(!empty($projects)){
701 + foreach($projects as $proj) {
702 + ?><option value="<?php echo esc_attr($proj->id)?>" <?php echo ($proj_filter == $proj->id)? 'selected':""?>><?php echo esc_html($proj->project_name,'taskbuilder');?></option>
703 + <?php }
704 + } ?>
705 + </select>
706 + </div>
707 + <!-- FILTER BUTTON -->
708 + <div class="tb-filters" class="wppm-filter-item" style="display:flex;margin-left: 4px;">
709 + <div class="tb-filter-bar">
710 + <span id="tb-advanced-toggle" class="tb-btn" style="margin-top:0px!important;">
711 + <?php echo esc_html_e('⚙️ Filters', 'taskbuilder'); ?>
712 + </span>
713 +
714 + <!-- ACTIVE FILTER CHIPS -->
715 + <div id="tb-active-filters" class="tb-chips"></div>
716 +
717 + <!-- POPOVER -->
718 + <div id="tb-advanced-panel" class="tb-popover">
719 + <div class="tb-mobile-header">
720 + <span><?php echo esc_html_e('Filters', 'taskbuilder'); ?></span>
721 + <button type="button" id="tb-close-filters">✕</button>
722 + </div>
723 + <div class="tb-arrow"></div>
724 +
725 + <div class="tb-section">
726 + <h4> <?php echo esc_html_e('Created By', 'taskbuilder'); ?></h4>
727 + <select id="tb-created-by" class="form-control" multiple>
728 + <?php
729 + if(!empty($users)){
730 + foreach($users as $user): ?>
731 + <option value="<?php echo esc_attr($user->ID); ?>"><?php echo esc_html($user->display_name); ?></option>
732 + <?php endforeach; ?>
733 + <?php } ?>
734 + </select>
735 + <h4> <?php echo esc_html_e('Assigned To', 'taskbuilder'); ?></h4>
736 + <select id="tb-assigned" multiple>
737 + <?php
738 + if(!empty($all_assigned)){
739 + foreach($all_assigned as $uid){
740 + $user = get_userdata($uid);
741 + if($user){ ?>
742 + <option value="<?php echo esc_attr($uid); ?>">
743 + <?php echo esc_html($user->display_name); ?>
744 + </option>
745 + <?php }
746 + }
747 + }
748 + ?>
749 + </select>
750 + </div>
751 + <div class="tb-section">
752 + <h4> <?php echo esc_html_e('Priority', 'taskbuilder'); ?></h4>
753 + <select id="tb-priority" class="form-control" multiple>
754 + <?php if(!empty($priorities)) {
755 + foreach($priorities as $priority){ ?>
756 + <option value="<?php echo esc_attr($priority->id); ?>">
757 + <?php echo esc_html($priority->name); ?>
758 + </option>
759 + <?php } } ?>
760 + </select>
761 + </div>
762 + <div class="tb-section">
763 + <h4> <?php echo esc_html_e('Date', 'taskbuilder'); ?></h4>
764 + <input type="date" class="form-control" id="tb-start-date">
765 + <input type="date" class="form-control"id="tb-end-date">
766 + </div>
767 + <div id="tb-filter-actions">
768 + <button class="wppm-submit-btn" id="tb-apply-filter" type="button"> <?php echo esc_html_e('Apply', 'taskbuilder'); ?></button>
769 + <button class="wppm_reset_btn" id="tb-reset-filter" type="button"> <?php echo esc_html_e('Reset', 'taskbuilder'); ?></button>
770 + </div>
771 + </div>
772 + </div>
773 + <div id="tb-backdrop"></div>
774 + </div>
775 + <div class="wppm_display_submit" style="margin: 0 0 -5px 10px;">
776 + <div class="wppm-filter-actions">
777 + <span class="wppm-link" onclick="wppm_tl_reset_filter('<?php echo esc_attr($page); ?>')"> <?php echo esc_html_e('Reset','taskbuilder');?></span>
778 + </div>
779 + </div>
780 + <div id="wppm_task_search" style="display:flex;justify-content:flex-end;margin-left: auto;">
781 + <img width="25px" height="15" class="wppm_task_search_filter_img" style="position: relative;top: 10px;left: 30px;" height="15px" src="<?php echo esc_url( WPPM_PLUGIN_URL . 'asset/images/search.svg'); ?>" alt="search">
782 + <input type="search" id="wppm_task_search_filter" style="margin-right:10px;" name="wppm_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) : "" ?>">
783 + </div>
784 + </div>
785 + </div>
786 + </div>
787 + <div style="display:flex;justify-content:flex-end;margin-right: 10px;">
788 + <span id="wppm_grid_view_btn" onclick="wppm_view_task_search_filter('<?php echo esc_attr($page_no)?>','<?php echo esc_attr($page)?>','<?php echo esc_attr($project_id)?>')"><img src="<?php echo esc_url( WPPM_PLUGIN_URL . 'asset/images/grid_view.svg'); ?>" alt="grid_view"><span><?php echo esc_html_e('Grid view','taskbuilder');?></span></span>
789 + </div>
790 + </div>
791 + <script>
792 + jQuery('#wppm-more-actions-btn, #wppm-task-bulk-actions-btn').gpopover({width: 200});
793 + </script>
794 + <div id="wppm_task_table_container" class="wppm_task_table_container table-responsive" style="padding: 0 15px 15px 15px;">
795 + <table id="wppm_task_table" class="wppm_table table">
796 + <thead>
797 + <tr>
798 + <th style="background-color:<?php echo esc_attr($appearance_settings['list-header-background-color'])?>" onchange="wppm_task_bulk_select_change()">
799 + <div class="checkbox-container">
800 + <input id="wppm_task_bulk_select_option" class="wppm-bulk-selector" type="checkbox" onchange="wppm_task_bulk_select_change();"/>
801 + <label for="wppm_task_bulk_select_option"></label>
802 + </div>
803 + </th>
804 + <th class="wppm_table_header" style="background-color:<?php echo esc_attr($appearance_settings['list-header-background-color'])?>">
805 + <div id="wppm_task_name_container">
806 + <span id="wppm_task_name_th" style="color:<?php echo esc_attr($appearance_settings['list-header-text-color'])?>"><?php echo esc_html_e('Task name','taskbuilder'); ?></span>
807 + <img width="16" height="16" style = "<?php echo ($sort_by == 'task_name' && $order == 'DESC') ? 'display:inline': 'display:none;'?>" onclick="wppm_sort_up_task_list('task_name','ASC','<?php echo esc_attr($page); ?>')" class="wppm_chevron_img" id="wppm_chevron_sort_up_task_name_img" src="<?php echo esc_url( WPPM_PLUGIN_URL . 'asset/images/sort_up_icon.svg'); ?>" alt="chevron_sort_up_icon">
808 + <img width="16" height="16" style = "<?php echo ($sort_by == 'task_name' && $order == 'ASC') ? 'display:inline': 'display:none;'?>" onclick="wppm_sort_up_task_list('task_name','DESC','<?php echo esc_attr($page); ?>')" class="wppm_chevron_img" id="wppm_chevron_sort_down_task_name_img" src="<?php echo esc_url( WPPM_PLUGIN_URL . 'asset/images/sort_down_icon.svg'); ?>" alt="chevron_sort_down_icon">
809 + </div>
810 + </th>
811 + <th class="wppm_table_header" style="background-color:<?php echo esc_attr($appearance_settings['list-header-background-color'])?>">
812 + <span id="wppm_project_name_th" style="color:<?php echo esc_attr($appearance_settings['list-header-text-color'])?>"><?php echo esc_html_e('Project','taskbuilder'); ?></span>
813 + <img width="16" height="16" style = "<?php echo ($sort_by == 'proj.project_name' && $order == 'DESC') ? 'display:inline': 'display:none;'?>" onclick="wppm_sort_up_task_list('project','ASC','<?php echo esc_attr($page); ?>')" class="wppm_chevron_img" id="wppm_chevron_sort_up_project_list_img" src="<?php echo esc_url( WPPM_PLUGIN_URL . 'asset/images/sort_up_icon.svg'); ?>" alt="chevron_sort_up_icon">
814 + <img width="16" height="16" style = "<?php echo ($sort_by == 'proj.project_name' && $order == 'ASC') ? 'display:inline': 'display:none;'?>" onclick="wppm_sort_up_task_list('project','DESC','<?php echo esc_attr($page); ?>')" class="wppm_chevron_img" id="wppm_chevron_sort_down_project_list_img" src="<?php echo esc_url( WPPM_PLUGIN_URL . 'asset/images/sort_down_icon.svg'); ?>" alt="chevron_sort_down_icon">
815 + </th>
816 + <th class="wppm_table_header" style="background-color:<?php echo esc_attr($appearance_settings['list-header-background-color'])?>">
817 + <span id="wppm_status_th" style="color:<?php echo esc_attr($appearance_settings['list-header-text-color'])?>"><?php echo esc_html_e('Status','taskbuilder'); ?></span>
818 + <img width="16" height="16" style = "<?php echo ($sort_by == 'task_statuses.name' && $order == 'DESC') ? 'display:inline': 'display:none;'?>" onclick="wppm_sort_up_task_list('status','ASC','<?php echo esc_attr($page); ?>')" class="wppm_chevron_img" id="wppm_chevron_sort_up_status_img" src="<?php echo esc_url( WPPM_PLUGIN_URL . 'asset/images/sort_up_icon.svg'); ?>" alt="chevron_sort_up_icon">
819 + <img width="16" height="16" style = "<?php echo ($sort_by == 'task_statuses.name' && $order == 'ASC') ? 'display:inline': 'display:none;'?>" onclick="wppm_sort_up_task_list('status','DESC','<?php echo esc_attr($page); ?>')" class="wppm_chevron_img" id="wppm_chevron_sort_down_status_img" src="<?php echo esc_url( WPPM_PLUGIN_URL . 'asset/images/sort_down_icon.svg'); ?>" alt="chevron_sort_down_icon">
820 + </th>
821 + <th class="wppm_table_header" style="background-color:<?php echo esc_attr($appearance_settings['list-header-background-color'])?>">
822 + <span id="wppm_priority_th" style="color:<?php echo esc_attr($appearance_settings['list-header-text-color'])?>"><?php echo esc_html_e('Priority','taskbuilder'); ?></span>
823 + <img width="16" height="16" style = "<?php echo ($sort_by == ('task_priorities.name') && $order == 'DESC') ? 'display:inline': 'display:none;'?>" onclick="wppm_sort_up_task_list('priority','ASC','<?php echo esc_attr($page); ?>')" class="wppm_chevron_img" id="wppm_chevron_sort_up_priority_img" src="<?php echo esc_url( WPPM_PLUGIN_URL . 'asset/images/sort_up_icon.svg'); ?>" alt="chevron_sort_up_icon">
824 + <img width="16" height="16" style = "<?php echo ($sort_by == ('task_priorities.name') && $order == 'ASC') ? 'display:inline': 'display:none;'?>" onclick="wppm_sort_up_task_list('priority','DESC','<?php echo esc_attr($page); ?>')" class="wppm_chevron_img" id="wppm_chevron_sort_down_priority_img" src="<?php echo esc_url( WPPM_PLUGIN_URL . 'asset/images/sort_down_icon.svg'); ?>" alt="chevron_sort_down_icon">
825 + </th>
826 + <?php if($wppm_default_task_date == 1 && $wppm_deafault_time_duration_task==0) { ?>
827 + <th class="wppm_table_header" style="background-color:<?php echo esc_attr($appearance_settings['list-header-background-color'])?>">
828 + <span id="wppm_start_date_th" style="color:<?php echo esc_attr($appearance_settings['list-header-text-color'])?>"><?php echo esc_html_e('Start date','taskbuilder'); ?></span>
829 + <img width="16" height="16" style = "<?php echo ($sort_by == 'Task.start_date' && $order == 'DESC') ? 'display:inline': 'display:none;'?>" onclick="wppm_sort_up_task_list('start_date','ASC','<?php echo esc_attr($page); ?>')" class="wppm_chevron_img" id="wppm_chevron_sort_up_start_date_img" src="<?php echo esc_url( WPPM_PLUGIN_URL . 'asset/images/sort_up_icon.svg'); ?>" alt="chevron_sort_up_icon">
830 + <img width="16" height="16" style = "<?php echo ($sort_by == 'Task.start_date' && $order == 'ASC') ? 'display:inline': 'display:none;'?>" onclick="wppm_sort_up_task_list('start_date','DESC','<?php echo esc_attr($page); ?>')" class="wppm_chevron_img" id="wppm_chevron_sort_down_start_date_img" src="<?php echo esc_url( WPPM_PLUGIN_URL . 'asset/images/sort_down_icon.svg'); ?>" alt="chevron_sort_down_icon">
831 + </th>
832 + <th class="wppm_table_header" style="background-color:<?php echo esc_attr($appearance_settings['list-header-background-color'])?>">
833 + <span id="wppm_end_date_th" style="color:<?php echo esc_attr($appearance_settings['list-header-text-color'])?>"><?php echo esc_html_e('End date','taskbuilder'); ?></span>
834 + <img width="16" height="16" style = "<?php echo ($sort_by == 'Task.end_date' && $order == 'DESC') ? 'display:inline': 'display:none;'?>" onclick="wppm_sort_up_task_list('end_date','ASC','<?php echo esc_attr($page); ?>')" class="wppm_chevron_img" id="wppm_chevron_sort_up_end_date_img" src="<?php echo esc_url( WPPM_PLUGIN_URL . 'asset/images/sort_up_icon.svg'); ?>" alt="chevron_sort_up_icon">
835 + <img width="16" height="16" style = "<?php echo ($sort_by == 'Task.end_date' && $order == 'ASC') ? 'display:inline': 'display:none;'?>" onclick="wppm_sort_up_task_list('end_date','DESC','<?php echo esc_attr($page); ?>')" class="wppm_chevron_img" id="wppm_chevron_sort_down_end_date_img" src="<?php echo esc_url( WPPM_PLUGIN_URL . 'asset/images/sort_down_icon.svg'); ?>" alt="chevron_sort_down_icon">
836 + </th>
837 + <?php }
838 + if( $wppm_deafault_time_duration_task==1){ ?>
839 + <th class="wppm_table_header" style="background-color:<?php echo esc_attr($appearance_settings['list-header-background-color'])?>">
840 + <span id="wppm_task_duration_th" style="color:<?php echo esc_attr($appearance_settings['list-header-text-color'])?>"><?php echo esc_html_e('Duration','taskbuilder'); ?></span>
841 + <img width="16" height="16" style = "<?php echo ($sort_by == 'TIMESTAMPDIFF(SECOND, Task.start_date, Task.end_date)' && $order == 'DESC') ? 'display:inline': 'display:none;'?>" onclick="wppm_sort_up_task_list('TIMESTAMPDIFF(SECOND, Task.start_date, Task.end_date)','ASC','<?php echo esc_attr($page); ?>')" class="wppm_chevron_img" id="wppm_chevron_sort_up_task_duration_img" src="<?php echo esc_url( WPPM_PLUGIN_URL . 'asset/images/sort_up_icon.svg'); ?>" alt="chevron_sort_up_icon">
842 + <img width="16" height="16" style = "<?php echo ($sort_by == 'TIMESTAMPDIFF(SECOND, Task.start_date, Task.end_date)' && $order == 'ASC') ? 'display:inline': 'display:none;'?>" onclick="wppm_sort_up_task_list('TIMESTAMPDIFF(SECOND, Task.start_date, Task.end_date)','DESC','<?php echo esc_attr($page); ?>')" class="wppm_chevron_img" id="wppm_chevron_sort_down_task_duration_img" src="<?php echo esc_url( WPPM_PLUGIN_URL . 'asset/images/sort_down_icon.svg'); ?>" alt="chevron_sort_down_icon">
843 + </th>
844 + <?php }?>
845 + <th class="wppm_table_header" style="background-color:<?php echo esc_attr($appearance_settings['list-header-background-color'])?>">
846 + <span style="color:<?php echo esc_attr($appearance_settings['list-header-text-color'])?>"><?php echo esc_html_e('Assign To','taskbuilder'); ?></span>
847 + </th>
848 + <th class="wppm_table_header" style="background-color:<?php echo esc_attr($appearance_settings['list-header-background-color'])?>">
849 + <span style="color:<?php echo esc_attr($appearance_settings['list-header-text-color'])?>"><?php echo esc_html_e('Progress','taskbuilder'); ?></span>
850 + </th>
851 + <?php do_action('wppm_table_header');?>
852 + </tr>
853 + </thead>
854 + <tbody>
855 + <?php
856 + $task_index = 0;
857 + $statuses = $wpdb->get_results(
858 + "SELECT * FROM {$wpdb->prefix}wppm_task_statuses",
859 + OBJECT_K
860 + );
861 +
862 + $priorities = $wpdb->get_results(
863 + "SELECT * FROM {$wpdb->prefix}wppm_task_priorities",
864 + OBJECT_K
865 + );
866 + $projects = $wpdb->get_results( "SELECT * FROM {$wpdb->prefix}wppm_project", OBJECT_K) ;
867 + $task_ids = wp_list_pluck($wppm_task_fillter, 'id');
868 + $checklist_counts = [];
869 + if (!empty($task_ids)) {
870 + $task_ids_sql = implode(',', array_map('absint', $task_ids));
871 + $checklist_results = $wpdb->get_results(" SELECT checklist.task_id,
872 + COUNT(Items.id) AS total_items,
873 + SUM(CASE WHEN Items.checked = 1 THEN 1 ELSE 0 END) AS checked_items
874 + FROM {$wpdb->prefix}wppm_checklist_items AS Items
875 + LEFT JOIN {$wpdb->prefix}wppm_checklist AS checklist
876 + ON Items.checklist_id = checklist.id
877 + WHERE checklist.task_id IN ($task_ids_sql)
878 + GROUP BY checklist.task_id"
879 + );
880 + foreach ($checklist_results as $row) {
881 + $checklist_counts[$row->task_id] = [
882 + 'total' => (int) $row->total_items,
883 + 'checked' => (int) $row->checked_items,
884 + ];
885 + }
886 + }
887 + if(!empty($wppm_task_fillter)){
888 + foreach($wppm_task_fillter as $task) {
889 + $task_id = absint($task->id);
890 + $wppm_task_duration = $wppmfunction->wppm_get_duration($task->start_date,$task->end_date);
891 + $checklists = $wpdb->get_results( $wpdb->prepare("SELECT * FROM {$wpdb->prefix}wppm_checklist where task_id = %d",$task_id) );
892 + if(!empty($task)){
893 + $taskdata = $wppmfunction->get_task($task->id);
894 + $project_data = $wppmfunction->get_project($task->project);
895 + $task_index++;
896 + $total = $checklist_counts[$task_id]['total'] ?? 0;
897 + $total_checked_items = $checklist_counts[$task_id]['checked'] ?? 0;
898 + if(isset($task->status)){
899 + $tstatus = absint($task->status);
900 + $status = $statuses[$task->status] ?? null;
901 + }
902 + if(!empty($task->priority)){
903 + $tpriority = absint($task->priority);
904 + $priority = $priorities[$task->priority] ?? null;
905 + }
906 + if(isset($task->project)){
907 + $tproj = absint($task->project);
908 + $project = $projects[$task->project] ?? null;
909 + }
910 + if($wppm_task_time == 1){
911 + $tsDate = new DateTime($task->start_date);
912 + $teDate = new DateTime($task->end_date);
913 + if($task->start_date=='0000-00-00 00:00:00'){
914 + if($wppm_date_setting=='Y-m-d H:i:s'){
915 + $task_start_date = '0000-00-00 00:00:00';
916 + }elseif($wppm_date_setting=='d-m-Y H:i:s'){
917 + $task_start_date = '00-00-0000 00:00:00';
918 + }elseif($wppm_date_setting=='m-d-Y H:i:s'){
919 + $task_start_date = '00-00-0000 00:00:00';
920 + }else{
921 + $task_start_date = '0000-00-00 00:00:00';
922 + }
923 + }if($task->end_date=='0000-00-00 00:00:00'){
924 + if($wppm_date_setting=='Y-m-d H:i:s'){
925 + $task_end_date = '0000-00-00 00:00:00';
926 + }elseif($wppm_date_setting=='d-m-Y H:i:s'){
927 + $task_end_date = '00-00-0000 00:00:00';
928 + }elseif($wppm_date_setting=='m-d-Y H:i:s'){
929 + $task_end_date = '00-00-0000 00:00:00';
930 + }else{
931 + $task_end_date = '0000-00-00 00:00:00';
932 + }
933 + }if($task->start_date!='0000-00-00 00:00:00'){
934 + if(!empty($wppm_date_setting)){
935 + $task_start_date = $tsDate->format($wppm_date_setting);
936 + } else {
937 + $task_start_date = isset($task->start_date)? $task->start_date:"";
938 + }
939 + }if($task->end_date!='0000-00-00 00:00:00'){
940 + if(!empty($wppm_date_setting)){
941 + $task_end_date = $teDate->format($wppm_date_setting);
942 + }else{
943 + $task_end_date = isset($task->end_date) ? $task->end_date: "" ;
944 + }
945 + }
946 + } elseif($wppm_task_time == 0){
947 + $tsDate = new DateTime($task->start_date);
948 + $teDate = new DateTime($task->end_date);
949 + $task_start_date = $tsDate->format('Y-m-d');
950 + $task_end_date = $teDate->format('Y-m-d');
951 + if($task->start_date=='0000-00-00 00:00:00'){
952 + if($wppm_date_setting=='Y-m-d H:i:s'){
953 + $task_start_date = '0000-00-00';
954 + }elseif($wppm_date_setting=='d-m-Y H:i:s'){
955 + $task_start_date = '00-00-0000';
956 + }elseif($wppm_date_setting=='m-d-Y H:i:s'){
957 + $task_start_date = '00-00-0000';
958 + }else{
959 + $task_start_date = '0000-00-00';
960 + }
961 + }
962 + if($task->end_date=='0000-00-00 00:00:00'){
963 + if($wppm_date_setting=='Y-m-d H:i:s'){
964 + $task_end_date = '0000-00-00';
965 + }elseif($wppm_date_setting=='d-m-Y H:i:s'){
966 + $task_end_date = '00-00-0000';
967 + }elseif($wppm_date_setting=='m-d-Y H:i:s'){
968 + $task_end_date = '00-00-0000';
969 + }else{
970 + $task_end_date = '0000-00-00';
971 + }
972 + }
973 + if($task->start_date!='0000-00-00 00:00:00'){
974 + if($wppm_date_setting=='Y-m-d H:i:s'){
975 + $task_start_date = $tsDate->format('Y-m-d');
976 + }elseif($wppm_date_setting=='d-m-Y H:i:s'){
977 + $task_start_date = $tsDate->format('d-m-Y');
978 + }elseif($wppm_date_setting=='m-d-Y H:i:s'){
979 + $task_start_date = $tsDate->format('m-d-Y');
980 + }else{
981 + $task_start_date = $tsDate->format('Y-m-d');
982 + }
983 + }
984 + if($task->end_date!='0000-00-00 00:00:00'){
985 + if($wppm_date_setting=='Y-m-d H:i:s'){
986 + $task_end_date = $teDate->format('Y-m-d');
987 + }elseif($wppm_date_setting=='d-m-Y H:i:s'){
988 + $task_end_date = $teDate->format('d-m-Y');
989 + }elseif($wppm_date_setting=='m-d-Y H:i:s'){
990 + $task_end_date = $teDate->format('m-d-Y');
991 + }else{
992 + $task_end_date = $teDate->format('Y-m-d');
993 + }
994 + }
995 + }
996 + $url = $wppmfunction->get_task_url( $task->id, $is_frontend );
997 + ?>
998 + <tr onclick= "if(link)wppm_tl_handle_click(event, <?php echo esc_attr($task->id) ?>, '<?php echo esc_url( $url ); ?>',<?php echo esc_attr($project_id) ?>)" >
999 + <td class="bulk-selector" onmouseover="link=false;" onmouseout="link=true;">
1000 + <div class="wppm-pl-item-selector">
1001 + <div class="checkbox-container">
1002 + <input id="wppm_bulk_select_<?php echo esc_attr($task->id) ?>" class="wppm-task-bulk-select" type="checkbox" onchange="wppm_bulk_task_item_select_change();" value="<?php echo esc_attr( $task->id ); ?>"/>
1003 + <label for="wppm_bulk_select_<?php echo esc_attr($task->id) ?>"></label>
1004 + </div>
1005 + </div>
1006 + </td>
1007 + <td onmouseover="link=true;">
1008 + <?php echo esc_html($task->task_name) ?>
1009 + <?php $wppm_row_subtask_progress = $wppmfunction->get_subtask_progress($task->id);
1010 + if($wppm_row_subtask_progress['total'] > 0){ ?>
1011 + <span class="wppm_subtask_badge" title="<?php esc_attr_e('Subtasks','taskbuilder'); ?>"><?php echo esc_html($wppm_row_subtask_progress['completed'].'/'.$wppm_row_subtask_progress['total']); ?></span>
1012 + <?php } ?>
1013 + </td>
1014 + <td onmouseover="link=true;">
1015 + <?php if(!empty($project->project_name)){
1016 + echo esc_html($project->project_name);
1017 + }
1018 + ?>
1019 + </td>
1020 + <td onmouseover="link=true;">
1021 + <?php if(!empty($task->status)){ ?>
1022 + <span class="wppm_td_task_status" style="background-color:<?php echo (isset($status->bg_color))? esc_attr($status->bg_color):"";?>; color: <?php echo (isset($status->color))? esc_attr($status->color):""; ?>"><?php echo (isset($status->name))? esc_html($status->name):"" ?></span>
1023 + <?php } ?>
1024 + </td>
1025 + <td onmouseover="link=true;">
1026 + <?php if(!empty($task->priority)){ ?>
1027 + <span class ="wppm_td_task_priority" style="background-color:<?php echo (isset($priority->bg_color))? esc_attr($priority->bg_color):"" ;?>; color: <?php echo (isset($priority->color))? esc_attr($priority->color):""; ?>"><?php echo (isset($priority->name))? esc_html($priority->name):"" ?></span>
1028 + <?php } ?>
1029 + </td>
1030 + <?php if($wppm_default_task_date == 1 && $wppm_deafault_time_duration_task==0) { ?>
1031 + <td onmouseover="link=true;">
1032 + <?php if(!empty($task_start_date)){ ?>
1033 + <?php echo esc_html($task_start_date);
1034 + } ?>
1035 + </td>
1036 + <td onmouseover="link=true;"><?php
1037 + if(!empty($task_end_date) && ($task->status!=4 && $task_end_date < $current_date && $task_end_date != '0000-00-00 00:00:00' && $task_end_date != '00-00-0000 00:00:00' && $task_end_date != '00-00-0000' && $task_end_date != '0000-00-00')){
1038 + $style = "color:#FF0000";
1039 + } else{
1040 + $style = "color:#2C3E50";
1041 + }?>
1042 + <span style="<?php echo esc_attr($style); ?>"><?php echo esc_html($task_end_date);?></span>
1043 + </td>
1044 + <?php } ?>
1045 + <?php if($wppm_deafault_time_duration_task==1){ ?>
1046 + <?php
1047 + if(!empty($task_end_date) && ($task->status!=4 && $task_end_date < $current_date && $task_end_date != '0000-00-00 00:00:00' && $task_end_date != '00-00-0000 00:00:00' && $task_end_date != '00-00-0000' && $task_end_date != '0000-00-00')){
1048 + $style = "color:#FF2222";
1049 + } else {
1050 + $style = "color:#2C3E50";
1051 + } ?>
1052 + <td onmouseover="link=true;" class="wppm_table_td"><span style="<?php echo esc_attr($style); ?>"><?php echo isset($wppm_task_duration) ? esc_html($wppm_task_duration):"" ?></span></td>
1053 + <?php } ?>
1054 + </td>
1055 + <td onmouseover="link=true;" style="text-align:center;">
1056 + <?php
1057 + $i=0;
1058 + if(!empty($project_data['users'])){
1059 + $proj_users = explode(',',$project_data['users']);
1060 + }
1061 + if(!empty($task->users)){
1062 + $users = explode(",",$task->users);
1063 + foreach($users as $user){
1064 + if( (!empty($proj_users)) && (in_array($user,$proj_users))){
1065 + $i++;
1066 + if( $i <= 4 ){
1067 + $userdata = get_userdata( $user );
1068 + if(!empty($userdata)){
1069 + ?>
1070 + <a href="#" title="<?php echo esc_attr($userdata->display_name); ?>">
1071 + <?php echo get_avatar($userdata->ID, 25, "mysteryman")?>
1072 + </a> <?php
1073 + }
1074 + }
1075 + }
1076 + }
1077 + }
1078 + if($i > 4){
1079 + ?>
1080 + <a href="#" class="wppm_avatar">
1081 + <span id="wppm_avatar" style="background-color:black;" class="avatar">+<?php echo esc_html($i-4) ?></span>
1082 + </a>
1083 + <?php } ?>
1084 + <?php
1085 + if($i==0){
1086 + echo esc_html_e('None','taskbuilder');
1087 + } ?>
1088 + </td>
1089 + <td onmouseover="link=true;">
1090 + <?php
1091 + $completion = 0;
1092 + if ($total != 0 && $total != NULL) {
1093 + $completion = intval($total_checked_items/$total*100);
1094 + }
1095 + echo esc_html($completion).'%';
1096 + ?>
1097 + </td>
1098 + <?php do_action('wppm_table_column');?>
1099 + </tr>
1100 + <?php }
1101 + }
1102 + }
1103 + ?>
1104 + </tbody>
1105 + </table>
1106 + <script>
1107 + function wppm_tl_handle_click(event, id, url,project_id) {
1108 + if ( ( event.ctrlKey || event.metaKey ) && url ) {
1109 + window.open(url, '_blank');
1110 + } else {
1111 + wppm_open_task(id,project_id);
1112 + }
1113 + }
1114 + </script>
1115 + <?php
1116 + $current_page=$page_no+1;
1117 + $total_pages=ceil($totalrows/$task_per_page);
1118 + $prev_page_no=$current_page-1;
1119 + $prev_class=($prev_page_no==0)?'disabled':'';
1120 + $next_page_no=($total_pages==$current_page)? $current_page-1:$current_page;
1121 + $next_class=($total_pages==$current_page)?'disabled':'';
1122 + ?>
1123 + <div class="row" style="background-color:#ffffff;">
1124 + <div class="col-sm-12">
1125 + <div class="wppm_task_result" style="<?php echo esc_attr($total_pages==0)? '':'display: none;';?>"><?php esc_html_e('Your search request returned no results.','taskbuilder');?></div>
1126 + <hr style="<?php echo esc_attr($total_pages==0)? '':'display: none;';?>">
1127 + </div>
1128 + <div>
1129 + </div>
1130 + </div>
1131 + <div class="row wppm_task_pagination_container">
1132 + <div class="col-sm-4">
1133 + <?php echo esc_html_e('Total:','taskbuilder'); ?>&nbsp;<?php echo esc_attr($task_index) ?>&nbsp;<?php echo esc_html_e('of','taskbuilder') ?>&nbsp;<?php echo esc_html($totalrows) ?>&nbsp;<?php echo esc_html_e('Tasks','taskbuilder')?>
1134 + </div>
1135 + <div class="wppm_task_pagination col-sm-4" style="<?php echo esc_attr($total_pages==0)? "display:none;":"display:flex;"?>">
1136 + <span class="wppm-pagination-txt">
1137 + <span><?php echo esc_html($current_page)?>&nbsp;<?php echo esc_html_e('of','taskbuilder');?>&nbsp;<?php echo esc_html($total_pages); ?>&nbsp;<?php echo esc_html_e('Page','taskbuilder'); ?></span>
1138 + </span>
1139 + <span <?php echo esc_attr($prev_class) ?>
1140 + style="<?php echo (isset($prev_class) && esc_attr($prev_class)== 'disabled') ? 'display:none;':'display:block;'?>cursor:pointer;">
1141 + <a class="wppm_pagination_prev" onclick="return wppm_load_prev_task_page(<?php echo esc_attr($prev_page_no) ?>,<?php echo esc_attr($page_no) ?>,'<?php echo esc_attr($sort_by)?>','<?php echo esc_attr($order) ?>');"><?php echo esc_html_e('PREV','taskbuilder');?></a>
1142 + </span>
1143 + <span <?php echo esc_attr($next_class) ?>
1144 + style="<?php echo (isset($next_class) && esc_attr($next_class) == 'disabled')?'display:none;':'display:block;'?>cursor:pointer;">
1145 + <a class="wppm_pagination_next" onclick="return wppm_load_next_task_page(<?php echo esc_attr($next_page_no) ?>,<?php echo esc_attr($page_no) ?>,'<?php echo esc_attr($sort_by)?>','<?php echo esc_attr($order) ?>');"><?php echo esc_html_e('NEXT','taskbuilder');?></a>
1146 + </span>
1147 + </div>
1148 + </div>
1149 +</form>
1150 +<style>
1151 + .select2-selection--single {
1152 + height: 30px!important;
1153 + }
1154 + .select2-dropdown:hover {
1155 + color: #23527c!important;;
1156 + }
1157 + .select2-results__options{
1158 + font:15px "Helvetica Neue",Arial,Helvetica,sans-serif !important;
1159 + margin: 0!important;
1160 + line-height: inherit!important;
1161 + }
1162 + .select2-selection__rendered{
1163 + font:15px "Helvetica Neue",Arial,Helvetica,sans-serif !important;
1164 + margin-top: 5px!important;
1165 + }
1166 + .select2-selection__rendered:hover{
1167 + color: #2271b1 !important;
1168 + }
1169 + .select2-container--default .select2-results__option--highlighted.select2-results__option--selectable{
1170 + background-color: #e85f08!important;
1171 + color: white !important;
1172 + }
1173 + .select2-container {
1174 + max-width: 150px !important;
1175 + min-width: 150px !important;
1176 + }
1177 +
1178 + .select2-selection--multiple {
1179 + max-width: 290px !important;
1180 + min-width: 290px !important;
1181 + }
1182 +
1183 + #wppm_task_filter{
1184 + min-height: 30px !important;
1185 + max-height: 35px !important;
1186 + }
1187 + #wppm_task_table tr:nth-child(even) td{
1188 + background-color:<?php echo esc_attr($appearance_settings['list-item-even-background-color'])?>;
1189 + color:<?php echo esc_attr($appearance_settings['list-item-even-text-color'])?>;
1190 + }
1191 + #wppm_task_table tr:nth-child(odd) td{
1192 + background-color:<?php echo esc_attr($appearance_settings['list-item-odd-background-color'])?>;
1193 + color:<?php echo esc_attr($appearance_settings['list-item-odd-text-color'])?>;
1194 + }
1195 + #wppm_task_table tr:hover td{
1196 + background-color:<?php echo esc_attr($appearance_settings['list-item-hover-background-color'])?>;
1197 + }
1198 + #wppm_task_table tr:hover td{
1199 + color: <?php echo esc_attr($appearance_settings['list-item-hover-text-color'])?>;
1200 + }
1201 + #wppm_add_new_task_btn_tl:hover{
1202 + background-color:<?php echo esc_attr($appearance_settings['list-header-button-hover-color'])?>!important;
1203 + }
1204 +</style>
1205 +<script type="text/javascript">
1206 + var link = true;
1207 + window.listFilters = window.listFilters || {
1208 + created_by: [],
1209 + assigned: [],
1210 + priority: [],
1211 + start_date: "",
1212 + end_date: ""
1213 + };
1214 +
1215 + var listFilters = window.listFilters;
1216 + jQuery( document ).ready( function( jQuery ) {
1217 + // SET VALUES AFTER INIT
1218 + let createdBy = <?php echo wp_json_encode(array_map('strval', $advanced_filter['created_by'] ?? [])); ?>;
1219 +
1220 + let assigned = <?php echo wp_json_encode(array_map('strval', $advanced_filter['assigned'] ?? [])); ?>;
1221 +
1222 + let priority = <?php echo wp_json_encode(array_map('strval', $advanced_filter['priority'] ?? [])); ?>;
1223 + jQuery('#tb-created-by').val(createdBy).trigger('change');
1224 + jQuery('#tb-assigned').val(assigned).trigger('change');
1225 + jQuery('#tb-priority').val(priority).trigger('change');
1226 + jQuery('#tb-start-date').val('<?php echo esc_attr($advanced_filter['start_date'] ?? ''); ?>');
1227 + jQuery('#tb-end-date').val('<?php echo esc_attr($advanced_filter['end_date'] ?? ''); ?>');
1228 + jQuery(document).off("click", "#tb-apply-filter").on("click", "#tb-apply-filter", function (e) {
1229 + e.preventDefault();
1230 + listFilters.created_by = jQuery("#tb-created-by").val() || [];
1231 + listFilters.assigned = jQuery("#tb-assigned").val() || [];
1232 + listFilters.priority = jQuery("#tb-priority").val() || [];
1233 + listFilters.start_date = jQuery("#tb-start-date").val() || "";
1234 + listFilters.end_date = jQuery("#tb-end-date").val() || "";
1235 + listFilters.id = "<?php echo esc_attr($project_id); ?>";
1236 + renderActiveFilters(listFilters);
1237 + setListFilterCookie(listFilters);
1238 + triggerFilter(1, listFilters,'list');
1239 + });
1240 + jQuery(document).on("click", ".tb-remove", function () {
1241 + let key = jQuery(this).attr("data-key");
1242 + let value = jQuery(this).attr("data-value");
1243 + // DATE REMOVE
1244 + if (key === "date") {
1245 + listFilters.start_date = "";
1246 + listFilters.end_date = "";
1247 + jQuery("#tb-start-date").val("");
1248 + jQuery("#tb-end-date").val("");
1249 + } else {
1250 + listFilters[key] = (listFilters[key] || [])
1251 + .map(String)
1252 + .filter(v => v !== String(value));
1253 + jQuery(`#tb-${key}`).val(listFilters[key]).trigger("change");
1254 + }
1255 + // REMOVE CHIP UI
1256 + jQuery(this).closest(".tb-chip").remove();
1257 + syncUIWithFilters(listFilters);
1258 + // save cookie
1259 + setListFilterCookie(listFilters);
1260 + // reload data
1261 + triggerFilter(1,listFilters,'list');
1262 + });
1263 + jQuery(document)
1264 + .off("click", "#tb-reset-filter").on("click", "#tb-reset-filter", function () {
1265 + resetFilters('list');
1266 + });
1267 + let saved = getListFilterCookie();
1268 + if (saved && typeof saved === "object") {
1269 + window.listFilters = {
1270 + created_by: saved.created_by || [],
1271 + assigned: saved.assigned || [],
1272 + priority: saved.priority || [],
1273 + start_date: saved.start_date || "",
1274 + end_date: saved.end_date || ""
1275 + };
1276 + listFilters = window.listFilters;
1277 + }
1278 + setTimeout(function () {
1279 + syncUIWithFilters(listFilters);
1280 + renderActiveFilters(listFilters);
1281 + }, 100);
1282 + jQuery("input[name='wppm_task_search_filter']").keypress(function(e) {
1283 + //Enter key
1284 + if (e.which == 13) {
1285 + wppm_task_search_filter('<?php echo esc_attr($page); ?>');
1286 + }
1287 + });
1288 + jQuery("#wppm_task_name_th").hover(function(){
1289 + jQuery('#wppm_chevron_sort_up_task_name_img').show();
1290 + jQuery('#wppm_chevron_sort_down_task_name_img').hide();
1291 + });
1292 + jQuery("#wppm_project_name_th").hover(function(){
1293 + jQuery('#wppm_chevron_sort_up_project_list_img').show();
1294 + jQuery('#wppm_chevron_sort_down_project_list_img').hide();
1295 + });
1296 + jQuery("#wppm_status_th").hover(function(){
1297 + jQuery('#wppm_chevron_sort_up_status_img').show();
1298 + jQuery('#wppm_chevron_sort_down_status_img').hide();
1299 + });
1300 + jQuery("#wppm_priority_th").hover(function(){
1301 + jQuery('#wppm_chevron_sort_up_priority_img').show();
1302 + jQuery('#wppm_chevron_sort_down_priority_img').hide();
1303 + });
1304 + jQuery("#wppm_start_date_th").hover(function(){
1305 + jQuery('#wppm_chevron_sort_up_start_date_img').show();
1306 + jQuery('#wppm_chevron_sort_down_start_date_img').hide();
1307 + });
1308 + jQuery("#wppm_end_date_th").hover(function(){
1309 + jQuery('#wppm_chevron_sort_up_end_date_img').show();
1310 + jQuery('#wppm_chevron_sort_down_end_date_img').hide();
1311 + });
1312 + jQuery("#wppm_task_duration_th").hover(function(){
1313 + jQuery('#wppm_chevron_sort_up_task_duration_img').show();
1314 + jQuery('#wppm_chevron_sort_down_task_duration_img').hide();
1315 + });
1316 +
1317 + })
1318 + jQuery('#wppm_task_list_proj_filter').select2({ dropdownAutoWidth: true, width: 'auto' });
1319 + jQuery('#wppm_task_list_proj_filter').val(<?php echo esc_attr($proj_filter) ?>);
1320 + jQuery('#tb-created-by').select2({ dropdownAutoWidth: true, width: '100%'});
1321 + jQuery('#tb-created-by').val(<?php echo wp_json_encode($advanced_filter['created_by'] ?? []); ?>).trigger('change');
1322 + jQuery('#tb-assigned').select2({ dropdownAutoWidth: true, width: '100%' });
1323 + jQuery('#tb-assigned').val(<?php echo wp_json_encode($advanced_filter['assigned'] ?? []); ?>).trigger('change');
1324 + jQuery('#tb-priority').select2({dropdownAutoWidth: true, width: '100%'});
1325 + jQuery('#tb-priority').val(<?php echo wp_json_encode($advanced_filter['priority'] ?? []); ?>).trigger('change');
1326 + /**
1327 + * Bulk item selector change
1328 + */
1329 + function wppm_bulk_task_item_select_change() {
1330 + jQuery("#wppm-task-bulk-actions-btn").show();
1331 + var items = jQuery(".wppm-task-bulk-select:checked");
1332 + var checked = items.length === 0 ? false : true;
1333 + if(checked){
1334 + jQuery(".wppm-bulk-selector").prop("checked", checked);
1335 + }else{
1336 + jQuery("#wppm-task-bulk-actions-btn").hide();
1337 + jQuery(".wppm-bulk-selector").prop("checked", false);
1338 + }
1339 + }
1340 + jQuery(document).off("click", "#tb-advanced-toggle").on("click", "#tb-advanced-toggle", function (e) {
1341 + e.stopPropagation();
1342 + jQuery("#tb-advanced-panel").toggleClass("tb-open");
1343 + });
1344 +
1345 + /* Close on backdrop click */
1346 + jQuery(document).on("click", "#tb-backdrop", function () {
1347 + jQuery("#tb-advanced-panel").removeClass("tb-open");
1348 + jQuery(this).removeClass("active");
1349 + });
1350 +
1351 + /* Close on outside (desktop only) */
1352 + jQuery(document).on("click", function (e) {
1353 + if (window.innerWidth > 768) {
1354 + if (!jQuery(e.target).closest("#tb-advanced-panel, #tb-advanced-toggle").length) {
1355 + jQuery("#tb-advanced-panel").removeClass("tb-open");
1356 + }
1357 + }
1358 + });jQuery(document).on("click", "#tb-close-filters", function () {
1359 + jQuery("#tb-advanced-panel").removeClass("tb-open");
1360 + jQuery("#tb-backdrop").removeClass("active");
1361 + });
1362 +</script>