PluginProbe
Taskbuilder – Project Management & Task Management Tool With Kanban Board / 6.0.2
Taskbuilder – Project Management & Task Management Tool With Kanban Board v6.0.2
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
taskbuilder / includes / admin / tasks / wppm_tasks_list.php

wppm_tasks_list.php in Taskbuilder – Project Management & Task Management Tool With Kanban Board 6.0.2, at includes/admin/tasks/wppm_tasks_list.php

1,343 lines 71.8 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
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 }
236
237 if(!empty($tl_advanced_filters['created_by'])){
238 $created_by_ids = array_map('intval', $tl_advanced_filters['created_by']);
239 $wppm_tl_filter .= " AND Task.created_by IN (" . implode(',', $created_by_ids) . ")";
240 }
241 if(!empty($tl_advanced_filters['assigned'])){
242 $assigned_ids = array_map('intval', $tl_advanced_filters['assigned']);
243 $assigned_sql = [];
244 foreach ($assigned_ids as $id) {
245 $assigned_sql[] = "FIND_IN_SET('$id', Task.users)";
246 }
247 $wppm_tl_filter .= " AND (" . implode(' OR ', $assigned_sql) . ")";
248 }
249 if(!empty($tl_advanced_filters['priority'])){
250 $priority = array_map('intval', $tl_advanced_filters['priority']);
251 $wppm_tl_filter .= " AND Task.priority IN (" . implode(',', $priority) . ")";
252 }
253 if(!empty($tl_advanced_filters['start_date'])){
254 $start_date = sanitize_text_field($tl_advanced_filters['start_date']);
255 $wppm_tl_filter .= " AND (CAST(Task.start_date AS DATE)) >= '$start_date'";
256 }
257 if(!empty($tl_advanced_filters['end_date'])){
258 $end_date = sanitize_text_field($tl_advanced_filters['end_date']);
259 $wppm_tl_filter .= " AND (CAST(Task.end_date AS DATE)) <= '$end_date'";
260 }
261
262 $advanced_conditions = [];
263 // Created By
264 if (!empty($advanced_filter['created_by'])) {
265 $created_by_ids = array_map('intval', $advanced_filter['created_by']);
266 $advanced_conditions[] = "Task.created_by IN (" . implode(',', $created_by_ids) . ")";
267 }
268 // Assigned Users
269 if (!empty($advanced_filter['assigned'])) {
270 $assigned_ids = array_map('intval', $advanced_filter['assigned']);
271 $assigned_sql = [];
272 foreach ($assigned_ids as $id) {
273 $assigned_sql[] = "FIND_IN_SET('$id', Task.users)";
274 }
275 $advanced_conditions[] = "(" . implode(' OR ', $assigned_sql) . ")";
276 }
277 // Priority
278 if (!empty($advanced_filter['priority'])) {
279 $priority = array_map('intval', $advanced_filter['priority']);
280 $advanced_conditions[] = "Task.priority IN (" . implode(',', $priority) . ")";
281 }
282 // Start Date
283 if (!empty($advanced_filter['start_date'])) {
284 $start_date = sanitize_text_field($advanced_filter['start_date']);
285 $advanced_conditions[] = "(CAST(Task.start_date AS DATE)) >= '$start_date'";
286 }
287 // End Date
288 if (!empty($advanced_filter['end_date'])) {
289 $end_date = sanitize_text_field($advanced_filter['end_date']);
290 $advanced_conditions[] = "(CAST(Task.end_date AS DATE)) <= '$end_date'";
291 }
292 if (!empty($advanced_conditions)) {
293 $wppm_tl_filter .= " AND " . implode(" AND ", $advanced_conditions);
294 }
295 //setcookie('wppm_advanced_filters',wp_json_encode( $advanced_filter ),time() + 3600);
296 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))){
297 foreach($wppm_hide_task_statuses_from_frontend as $status){
298 $wppm_tl_filter .= " AND Task.status != '$status'";
299 }
300 }
301 if ( $proj_filter != 0 || $project_id != 0 ) {
302 if ( $project_id != 0 ) {
303 $proj_filter = $project_id;
304 }
305 $proj_filter = absint( $proj_filter );
306 $wppm_task_by_proj_filter = $wpdb->prepare(
307 "Task.project = %d",
308 $proj_filter
309 );
310 } else {
311 $wppm_task_by_proj_filter = "1=1";
312 }
313 $wppm_default_task_date = get_option('wppm_default_task_date');
314 $search_tag_text = "";
315 if(!empty($search_tag)){
316 $search_tag_text = '%'.$wpdb->esc_like($search_tag).'%';
317 $query = ("SELECT Task.*
318 FROM {$wpdb->prefix}wppm_task AS Task
319 Left join {$wpdb->prefix}wppm_project proj ON Task.project = proj.id
320 Left join {$wpdb->prefix}wppm_task_statuses task_statuses ON Task.status = task_statuses.id
321 Left join {$wpdb->prefix}wppm_task_priorities task_priorities ON Task.priority = task_priorities.id
322 Left join {$wpdb->prefix}wppm_project_users proj_users ON Task.project = proj_users.proj_id
323 Left join {$wpdb->base_prefix}users user ON (FIND_IN_SET(user.ID,Task.users)>0)
324 Left join {$wpdb->prefix}wppm_project_meta proj_meta ON Task.project = proj_meta.project_id");
325 }
326 else{
327 if($current_user->has_cap('manage_options') || $wppm_current_user_capability == 'wppm_admin'){
328 if($sort_by=='task_name'|| $sort_by=='start_date' || $sort_by=='end_date'){
329 $query = ( "SELECT Task.* FROM {$wpdb->prefix}wppm_task AS Task
330 Left join {$wpdb->prefix}wppm_project proj ON Task.project = proj.id
331 Left join {$wpdb->prefix}wppm_project_meta proj_meta ON Task.project = proj_meta.project_id
332 ");
333 } else{
334 $query = ( "SELECT Task.* FROM {$wpdb->prefix}wppm_task AS Task
335 Left join {$wpdb->prefix}wppm_project proj ON Task.project = proj.id
336 Left join {$wpdb->prefix}wppm_task_statuses task_statuses ON Task.status = task_statuses.id
337 Left join {$wpdb->prefix}wppm_task_priorities task_priorities ON Task.priority = task_priorities.id
338 Left join {$wpdb->prefix}wppm_project_meta proj_meta ON Task.project = proj_meta.project_id
339 ");
340 }
341 }else{
342 $query = ( "SELECT Task.*
343 FROM {$wpdb->prefix}wppm_task AS Task
344 Left join {$wpdb->prefix}wppm_project proj ON Task.project = proj.id
345 Left join {$wpdb->prefix}wppm_project_users proj_users ON Task.project = proj_users.proj_id
346 Left join {$wpdb->prefix}wppm_task_statuses task_statuses ON Task.status = task_statuses.id
347 Left join {$wpdb->prefix}wppm_task_priorities task_priorities ON Task.priority = task_priorities.id
348 Left join {$wpdb->prefix}wppm_project_meta proj_meta ON Task.project = proj_meta.project_id
349 ");
350 }
351 }
352 $no_of_rows = ( "SELECT count(*) FROM ($query");
353 if(!empty($search_tag )){
354 if($current_user->has_cap('manage_options') || $wppm_current_user_capability == 'wppm_admin'){
355 if(!empty($public_projects)){
356 //$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 ";
357 $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
358 AND (
359 Task.task_name LIKE %s
360 OR proj.project_name LIKE %s
361 OR task_statuses.name LIKE %s
362 OR task_priorities.name LIKE %s
363 OR user.display_name LIKE %s
364 ) $wppm_proj_attr",
365 $search_tag_text,
366 $search_tag_text,
367 $search_tag_text,
368 $search_tag_text,
369 $search_tag_text
370 );
371 }else{
372 $where = $wpdb->prepare(
373 " WHERE $wppm_tl_filter
374 AND $wppm_task_by_proj_filter
375 AND (
376 Task.task_name LIKE %s
377 OR proj.project_name LIKE %s
378 OR task_statuses.name LIKE %s
379 OR task_priorities.name LIKE %s
380 OR user.display_name LIKE %s
381 )
382 $wppm_proj_attr",
383 $search_tag_text,
384 $search_tag_text,
385 $search_tag_text,
386 $search_tag_text,
387 $search_tag_text
388 );
389 }
390 } else{
391 if(!empty($public_projects)){
392 $where = $wpdb->prepare(
393 " WHERE
394 (proj_meta.meta_key='public_project' AND proj_meta.meta_value=1) AND (proj.is_archived = 0)
395 AND $wppm_tl_filter
396 AND $wppm_task_by_proj_filter
397 AND (
398 (
399 FIND_IN_SET(%d, Task.users) > 0
400 OR Task.created_by = %d
401 OR (
402 proj_users.user_id = %d
403 AND proj_users.role_id = 1
404 AND FIND_IN_SET(%d, proj.users) > 0
405 )
406 OR (
407 Task.project = proj_meta.project_id
408 AND proj_meta.meta_key='public_project'
409 AND proj_meta.meta_value=1
410 )
411 OR (
412 proj.created_by = %d
413 AND FIND_IN_SET(%d, proj.users) > 0
414 )
415 )
416 AND (
417 Task.task_name LIKE %s
418 OR proj.project_name LIKE %s
419 OR task_statuses.name LIKE %s
420 OR task_priorities.name LIKE %s
421 OR user.display_name LIKE %s
422 )
423 )
424 $wppm_proj_attr",
425 $current_user->ID,
426 $cu_id,
427 $cu_id,
428 $current_user->ID,
429 $cu_id,
430 $current_user->ID,
431 $search_tag_text,
432 $search_tag_text,
433 $search_tag_text,
434 $search_tag_text,
435 $search_tag_text
436 );
437 }else{
438 $where = $wpdb->prepare(
439 " WHERE
440 (proj.is_archived = 0)
441 AND $wppm_tl_filter
442 AND $wppm_task_by_proj_filter
443 AND (
444 (
445 FIND_IN_SET(%d, Task.users) > 0
446 OR Task.created_by = %d
447 OR (
448 proj_users.user_id = %d
449 AND proj_users.role_id = 1
450 AND FIND_IN_SET(%d, proj.users) > 0
451 )
452 OR (
453 Task.project = proj_meta.project_id
454 AND proj_meta.meta_key='public_project'
455 AND proj_meta.meta_value=1
456 )
457 OR (
458 proj.created_by = %d
459 AND FIND_IN_SET(%d, proj.users) > 0
460 )
461 )
462 AND (
463 Task.task_name LIKE %s
464 OR proj.project_name LIKE %s
465 OR task_statuses.name LIKE %s
466 OR task_priorities.name LIKE %s
467 OR user.display_name LIKE %s
468 )
469 )
470 $wppm_proj_attr",
471 $current_user->ID,
472 $cu_id,
473 $cu_id,
474 $current_user->ID,
475 $cu_id,
476 $current_user->ID,
477 $search_tag_text,
478 $search_tag_text,
479 $search_tag_text,
480 $search_tag_text,
481 $search_tag_text
482 );
483 }
484 }
485 }else{
486 if($current_user->has_cap('manage_options') || $wppm_current_user_capability == 'wppm_admin'){
487 if(!empty($public_projects)){
488 $where = $wpdb->prepare(
489 " WHERE
490 (proj_meta.meta_key = %s AND proj_meta.meta_value = %d)
491 AND (proj.is_archived = 0)
492 AND $wppm_tl_filter
493 AND $wppm_task_by_proj_filter
494 $wppm_proj_attr",
495 'public_project',
496 1
497 );
498 }else{
499 $where = " where (proj.is_archived = 0) AND $wppm_tl_filter AND $wppm_task_by_proj_filter $wppm_proj_attr";
500 }
501 } else{
502 if(!empty($public_projects)){
503 $where = $wpdb->prepare(
504 " WHERE
505 (
506 proj_meta.meta_key = %s
507 AND proj_meta.meta_value = %d
508 )
509 AND (proj.is_archived = 0)
510 AND $wppm_tl_filter
511 AND $wppm_task_by_proj_filter
512 $wppm_proj_attr",
513 'public_project',
514 1
515 );
516 }else{
517 $where = $wpdb->prepare(
518 " WHERE
519 (proj.is_archived = 0)
520 AND $wppm_tl_filter
521 AND $wppm_task_by_proj_filter
522 AND (
523 (
524 FIND_IN_SET(%d, Task.users) > 0
525 )
526 OR (
527 Task.created_by = %d
528 )
529 OR (
530 proj_users.user_id = %d
531 AND proj_users.role_id = %d
532 AND FIND_IN_SET(%d, proj.users) > 0
533 )
534 OR (
535 Task.project = proj_meta.project_id
536 AND proj_meta.meta_key = %s
537 AND proj_meta.meta_value = %d
538 )
539 OR (
540 proj.created_by = %d
541 AND FIND_IN_SET(%d, proj.users) > 0
542 )
543 )
544 $wppm_proj_attr",
545 $current_user->ID,
546 $cu_id,
547 $cu_id,
548 1,
549 $current_user->ID,
550 'public_project',
551 1,
552 $cu_id,
553 $current_user->ID
554 );
555 }
556 }
557 }
558 $query = apply_filters('wppm_task_list_list_view_query',$query,$search_tag_text);
559 $no_of_rows= apply_filters('wppm_task_list_number_of_rows_query',$no_of_rows,$search_tag_text);
560 $where = apply_filters('wppm_task_list_query_where',$where, $wppm_tl_filter,$search_tag_text);
561 if($filter_by != 'archived'){
562 $where .= $archived_where;
563 }
564 $no_of_rows_where = $where." Group by Task.id) AS Task";
565 $no_of_rows .= $no_of_rows_where;
566 $no_of_rows = apply_filters('wppm_task_list_no_of_rows',$no_of_rows,$wppm_tl_filter,$search_tag_text);
567 $totalrows = $wpdb->get_var($no_of_rows);
568 $query .= $where." Group by Task.id ORDER BY ".$sort_by." ".$order."";
569 $query = apply_filters('wppm_task_list_query',$query);
570 $limit_start=$page_no*$task_per_page;
571 $limit="\n LIMIT ".$limit_start.",".$task_per_page." ";
572 $task_id_array = array();
573 $query = $query.$limit;
574 $wppm_task_fillter = $wpdb->get_results($query);
575 $flag = false;
576 $project_creator = $wpdb->get_var($wpdb->prepare("SELECT created_by FROM {$wpdb->prefix}wppm_project WHERE created_by = %d",$cu_id));
577 if(!empty($wppm_task_fillter)){
578 foreach($wppm_task_fillter as $key_filter=>$val_filter){
579 $val_array = (array) $val_filter;
580 $tusers = $val_array['users'];
581 $tusers_arr = explode(',',$tusers);
582 $tproject_id = esc_sql($val_array['project']);
583 if(!empty($tusers) && in_array($current_user->ID,$tusers_arr)){
584 $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));
585 $project_users = $wpdb->get_var($wpdb->prepare("SELECT users FROM {$wpdb->prefix}wppm_project WHERE id = %d",$tproject_id));
586 $project_users_arr = explode(',',(string)$project_users);
587 if(((!empty($project_user_role)) && ($project_user_role == 1) && in_array($current_user->ID,$project_users_arr))){
588 $flag= true;
589 break;
590 }
591 }
592 }
593 }
594 if(($current_user->has_cap('manage_options') || $wppmfunction->has_permission('add_new_task',0) || ($flag==true) || ($project_creator!="")) && (isset($page) && $page != 'wppm-archived-tasks' )){
595 $style = "display:inline;";
596 }else{
597 $style = "display:none;";
598 }
599 $style = apply_filters('wppm_tl_add_new_task_btn_style',$style);
600 if($current_user->has_cap('manage_options') || $wppm_current_user_capability == ('wppm_admin') || ($flag==true) || ($wppmfunction->has_permission('change_task_status',0))!="" || ($project_creator!="")){
601 $cs_style = "display:flex;";
602 }else{
603 $cs_style = "display:none;";
604 }
605 if ( isset($page) && $page === 'wppm-archived-tasks' ) {
606 $ar_filter_style = "display:none;";
607 } else {
608 $ar_filter_style = "display:flex;";
609 }
610 $todo_status_name = $wpdb->get_var( "SELECT name FROM {$wpdb->prefix}wppm_task_statuses where id='".esc_sql(1)."'" );
611 $inp_status_name = $wpdb->get_var( "SELECT name FROM {$wpdb->prefix}wppm_task_statuses where id='".esc_sql(2)."'" );
612 $hold_status_name = $wpdb->get_var( "SELECT name FROM {$wpdb->prefix}wppm_task_statuses where id='".esc_sql(3)."'" );
613 $completed_status_name = $wpdb->get_var( "SELECT name FROM {$wpdb->prefix}wppm_task_statuses where id='".esc_sql(4)."'" );
614 $todo_status_style = (!empty($todo_status_name))? "display:inline" :"display:none;";
615 $inp_status_style = (!empty($inp_status_name))? "display:inline" :"display:none;";
616 $hold_status_style = (!empty($hold_status_name))? "display:inline" :"display:none;";
617 $completed_status_style = (!empty($completed_status_name))? "display:inline" :"display:none;";
618 if( isset($page) && $page === 'wppm-tasks'){
619 $arch_filter_style = "display:inline;";
620 }else{
621 $arch_filter_style = "display:none;";
622 }
623 ?>
624 <form id="wppm_task_list_frm">
625 <div id="wppm_task_list_container" class="wppm_bootstrap">
626 <div class="row">
627 <div class="col-sm-12" id="wppm_heading_inline">
628 <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>
629 <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>
630 <!-- Dashboard Button -->
631 <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') ); ?>"
632 style="margin-right:10px;" title="<?php echo esc_attr_e('Go to Dashboard','taskbuilder'); ?>">
633 <img src="<?php echo esc_url( WPPM_PLUGIN_URL . 'asset/images/dashboard.svg'); ?>" alt="dashboard_icon">
634 <?php esc_html_e('Dashboard','taskbuilder'); ?>
635 </a>
636 </span>
637 </div>
638 </div>
639 <div>
640 <div style="display:flex;flex-wrap: wrap;min-width: 0; max-width: 100%;margin-top: 20px;">
641 <div id="wppm_task_filter_container">
642 <div class="wppm-bulk-actions"style="margin-left: -14px !important;">
643 <button
644 id="wppm-task-bulk-actions-btn"
645 class="wppm-button small secondary"
646 type="button"
647 style="display:none;margin: 14px -20px 0px 22px; padding:14px;font: 13px Helvetica Neue, Arial, Helvetica, sans-serif !important;"
648 data-popover="wppm-task-bulk-actions">
649 <?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">
650 </button>
651 <div id="wppm-task-bulk-actions" class="gpopover wppm-popover-menu wppm-proj-bulk-actions">
652 <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' ) ); ?>');">
653 <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>
654 </div>
655 <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' ) ); ?>');">
656 <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>
657 </div>
658 <div class="wppm-popover-menu-item" onclick="wppm_bulk_delete_task('<?php echo esc_attr( wp_create_nonce( 'wppm_bulk_delete_task' ) ); ?>');">
659 <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>
660 </div>
661 </div>
662 <div class="wppm-filter-item">
663 <label for="wppm_task_filter" style="margin-left:20px;"> <?php echo esc_html_e('Filter','taskbuilder');?></label>
664 <select id="wppm_task_filter" name="wppm_task_filter" onchange="wppm_apply_task_filter('<?php echo esc_attr($page); ?>')" style="margin-left:20px;">
665 <option value="all"<?php echo ($filter_by == "all")? 'selected':""?>><?php echo esc_html_e('All','taskbuilder');?></option>
666 <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>
667 <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>
668 <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>
669 <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>
670 <option value="mine" <?php echo ($filter_by == "mine")? 'selected':""?>><?php echo esc_html_e('Mine','taskbuilder');?></option>
671 <option value="unassigned" <?php echo ($filter_by == "unassigned")? 'selected':""?>><?php echo esc_html_e('Unassigned','taskbuilder');?></option>
672 <option value="overdue" <?php echo ($filter_by == "overdue")? 'selected':""?>><?php echo esc_html_e('Overdue','taskbuilder');?></option>
673 <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>
674 </select>
675 </div>
676 </div>
677 </div>
678 <div class="wppm-filter-item wppm_project_autocomplete_container" style="margin: 0 0 0 20px;">
679 <label for="wppm_task_list_proj_filter">
680 <?php echo esc_html_e('Project','taskbuilder');?>
681 </label><br>
682 <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;">
683 <option value="0" <?php echo ($proj_filter == 0)? 'selected':""?>><?php echo esc_html_e('All','taskbuilder');?></option>
684 <?php
685 if(!empty($projects)){
686 foreach($projects as $proj) {
687 ?><option value="<?php echo esc_attr($proj->id)?>" <?php echo ($proj_filter == $proj->id)? 'selected':""?>><?php echo esc_html($proj->project_name,'taskbuilder');?></option>
688 <?php }
689 } ?>
690 </select>
691 </div>
692 <!-- FILTER BUTTON -->
693 <div class="tb-filters" class="wppm-filter-item" style="display:flex;margin-left: 4px;">
694 <div class="tb-filter-bar">
695 <span id="tb-advanced-toggle" class="tb-btn" style="margin-top:0px!important;">
696 <?php echo esc_html_e('⚙️ Filters', 'taskbuilder'); ?>
697 </span>
698
699 <!-- ACTIVE FILTER CHIPS -->
700 <div id="tb-active-filters" class="tb-chips"></div>
701
702 <!-- POPOVER -->
703 <div id="tb-advanced-panel" class="tb-popover">
704 <div class="tb-mobile-header">
705 <span><?php echo esc_html_e('Filters', 'taskbuilder'); ?></span>
706 <button type="button" id="tb-close-filters"></button>
707 </div>
708 <div class="tb-arrow"></div>
709
710 <div class="tb-section">
711 <h4> <?php echo esc_html_e('Created By', 'taskbuilder'); ?></h4>
712 <select id="tb-created-by" class="form-control" multiple>
713 <?php
714 if(!empty($users)){
715 foreach($users as $user): ?>
716 <option value="<?php echo esc_attr($user->ID); ?>"><?php echo esc_html($user->display_name); ?></option>
717 <?php endforeach; ?>
718 <?php } ?>
719 </select>
720 <h4> <?php echo esc_html_e('Assigned To', 'taskbuilder'); ?></h4>
721 <select id="tb-assigned" multiple>
722 <?php
723 if(!empty($all_assigned)){
724 foreach($all_assigned as $uid){
725 $user = get_userdata($uid);
726 if($user){ ?>
727 <option value="<?php echo esc_attr($uid); ?>">
728 <?php echo esc_html($user->display_name); ?>
729 </option>
730 <?php }
731 }
732 }
733 ?>
734 </select>
735 </div>
736 <div class="tb-section">
737 <h4> <?php echo esc_html_e('Priority', 'taskbuilder'); ?></h4>
738 <select id="tb-priority" class="form-control" multiple>
739 <?php if(!empty($priorities)) {
740 foreach($priorities as $priority){ ?>
741 <option value="<?php echo esc_attr($priority->id); ?>">
742 <?php echo esc_html($priority->name); ?>
743 </option>
744 <?php } } ?>
745 </select>
746 </div>
747 <div class="tb-section">
748 <h4> <?php echo esc_html_e('Date', 'taskbuilder'); ?></h4>
749 <input type="date" class="form-control" id="tb-start-date">
750 <input type="date" class="form-control"id="tb-end-date">
751 </div>
752 <div id="tb-filter-actions">
753 <button class="wppm-submit-btn" id="tb-apply-filter" type="button"> <?php echo esc_html_e('Apply', 'taskbuilder'); ?></button>
754 <button class="wppm_reset_btn" id="tb-reset-filter" type="button"> <?php echo esc_html_e('Reset', 'taskbuilder'); ?></button>
755 </div>
756 </div>
757 </div>
758 <div id="tb-backdrop"></div>
759 </div>
760 <div class="wppm_display_submit" style="margin: 0 0 -5px 10px;">
761 <div class="wppm-filter-actions">
762 <span class="wppm-link" onclick="wppm_tl_reset_filter('<?php echo esc_attr($page); ?>')"> <?php echo esc_html_e('Reset','taskbuilder');?></span>
763 </div>
764 </div>
765 <div id="wppm_task_search" style="display:flex;justify-content:flex-end;margin-left: auto;">
766 <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">
767 <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) : "" ?>">
768 </div>
769 </div>
770 </div>
771 </div>
772 <div style="display:flex;justify-content:flex-end;margin-right: 10px;">
773 <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>
774 </div>
775 </div>
776 <script>
777 jQuery('#wppm-more-actions-btn, #wppm-task-bulk-actions-btn').gpopover({width: 200});
778 </script>
779 <div id="wppm_task_table_container" class="wppm_task_table_container table-responsive" style="padding: 0 15px 15px 15px;">
780 <table id="wppm_task_table" class="wppm_table table">
781 <thead>
782 <tr>
783 <th style="background-color:<?php echo esc_attr($appearance_settings['list-header-background-color'])?>" onchange="wppm_task_bulk_select_change()">
784 <div class="checkbox-container">
785 <input id="wppm_task_bulk_select_option" class="wppm-bulk-selector" type="checkbox" onchange="wppm_task_bulk_select_change();"/>
786 <label for="wppm_task_bulk_select_option"></label>
787 </div>
788 </th>
789 <th class="wppm_table_header" style="background-color:<?php echo esc_attr($appearance_settings['list-header-background-color'])?>">
790 <div id="wppm_task_name_container">
791 <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>
792 <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">
793 <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">
794 </div>
795 </th>
796 <th class="wppm_table_header" style="background-color:<?php echo esc_attr($appearance_settings['list-header-background-color'])?>">
797 <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>
798 <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">
799 <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">
800 </th>
801 <th class="wppm_table_header" style="background-color:<?php echo esc_attr($appearance_settings['list-header-background-color'])?>">
802 <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>
803 <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">
804 <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">
805 </th>
806 <th class="wppm_table_header" style="background-color:<?php echo esc_attr($appearance_settings['list-header-background-color'])?>">
807 <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>
808 <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">
809 <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">
810 </th>
811 <?php if($wppm_default_task_date == 1 && $wppm_deafault_time_duration_task==0) { ?>
812 <th class="wppm_table_header" style="background-color:<?php echo esc_attr($appearance_settings['list-header-background-color'])?>">
813 <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>
814 <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">
815 <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">
816 </th>
817 <th class="wppm_table_header" style="background-color:<?php echo esc_attr($appearance_settings['list-header-background-color'])?>">
818 <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>
819 <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">
820 <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">
821 </th>
822 <?php }
823 if( $wppm_deafault_time_duration_task==1){ ?>
824 <th class="wppm_table_header" style="background-color:<?php echo esc_attr($appearance_settings['list-header-background-color'])?>">
825 <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>
826 <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">
827 <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">
828 </th>
829 <?php }?>
830 <th class="wppm_table_header" style="background-color:<?php echo esc_attr($appearance_settings['list-header-background-color'])?>">
831 <span style="color:<?php echo esc_attr($appearance_settings['list-header-text-color'])?>"><?php echo esc_html_e('Assign To','taskbuilder'); ?></span>
832 </th>
833 <th class="wppm_table_header" style="background-color:<?php echo esc_attr($appearance_settings['list-header-background-color'])?>">
834 <span style="color:<?php echo esc_attr($appearance_settings['list-header-text-color'])?>"><?php echo esc_html_e('Progress','taskbuilder'); ?></span>
835 </th>
836 <?php do_action('wppm_table_header');?>
837 </tr>
838 </thead>
839 <tbody>
840 <?php
841 $task_index = 0;
842 $statuses = $wpdb->get_results(
843 "SELECT * FROM {$wpdb->prefix}wppm_task_statuses",
844 OBJECT_K
845 );
846
847 $priorities = $wpdb->get_results(
848 "SELECT * FROM {$wpdb->prefix}wppm_task_priorities",
849 OBJECT_K
850 );
851 $projects = $wpdb->get_results( "SELECT * FROM {$wpdb->prefix}wppm_project", OBJECT_K) ;
852 $task_ids = wp_list_pluck($wppm_task_fillter, 'id');
853 $checklist_counts = [];
854 if (!empty($task_ids)) {
855 $task_ids_sql = implode(',', array_map('absint', $task_ids));
856 $checklist_results = $wpdb->get_results(" SELECT checklist.task_id,
857 COUNT(Items.id) AS total_items,
858 SUM(CASE WHEN Items.checked = 1 THEN 1 ELSE 0 END) AS checked_items
859 FROM {$wpdb->prefix}wppm_checklist_items AS Items
860 LEFT JOIN {$wpdb->prefix}wppm_checklist AS checklist
861 ON Items.checklist_id = checklist.id
862 WHERE checklist.task_id IN ($task_ids_sql)
863 GROUP BY checklist.task_id"
864 );
865 foreach ($checklist_results as $row) {
866 $checklist_counts[$row->task_id] = [
867 'total' => (int) $row->total_items,
868 'checked' => (int) $row->checked_items,
869 ];
870 }
871 }
872 if(!empty($wppm_task_fillter)){
873 foreach($wppm_task_fillter as $task) {
874 $task_id = absint($task->id);
875 $wppm_task_duration = $wppmfunction->wppm_get_duration($task->start_date,$task->end_date);
876 $checklists = $wpdb->get_results( $wpdb->prepare("SELECT * FROM {$wpdb->prefix}wppm_checklist where task_id = %d",$task_id) );
877 if(!empty($task)){
878 $taskdata = $wppmfunction->get_task($task->id);
879 $project_data = $wppmfunction->get_project($task->project);
880 $task_index++;
881 $total = $checklist_counts[$task_id]['total'] ?? 0;
882 $total_checked_items = $checklist_counts[$task_id]['checked'] ?? 0;
883 if(isset($task->status)){
884 $tstatus = absint($task->status);
885 $status = $statuses[$task->status] ?? null;
886 }
887 if(!empty($task->priority)){
888 $tpriority = absint($task->priority);
889 $priority = $priorities[$task->priority] ?? null;
890 }
891 if(isset($task->project)){
892 $tproj = absint($task->project);
893 $project = $projects[$task->project] ?? null;
894 }
895 if($wppm_task_time == 1){
896 $tsDate = new DateTime($task->start_date);
897 $teDate = new DateTime($task->end_date);
898 if($task->start_date=='0000-00-00 00:00:00'){
899 if($wppm_date_setting=='Y-m-d H:i:s'){
900 $task_start_date = '0000-00-00 00:00:00';
901 }elseif($wppm_date_setting=='d-m-Y H:i:s'){
902 $task_start_date = '00-00-0000 00:00:00';
903 }elseif($wppm_date_setting=='m-d-Y H:i:s'){
904 $task_start_date = '00-00-0000 00:00:00';
905 }else{
906 $task_start_date = '0000-00-00 00:00:00';
907 }
908 }if($task->end_date=='0000-00-00 00:00:00'){
909 if($wppm_date_setting=='Y-m-d H:i:s'){
910 $task_end_date = '0000-00-00 00:00:00';
911 }elseif($wppm_date_setting=='d-m-Y H:i:s'){
912 $task_end_date = '00-00-0000 00:00:00';
913 }elseif($wppm_date_setting=='m-d-Y H:i:s'){
914 $task_end_date = '00-00-0000 00:00:00';
915 }else{
916 $task_end_date = '0000-00-00 00:00:00';
917 }
918 }if($task->start_date!='0000-00-00 00:00:00'){
919 if(!empty($wppm_date_setting)){
920 $task_start_date = $tsDate->format($wppm_date_setting);
921 } else {
922 $task_start_date = isset($task->start_date)? $task->start_date:"";
923 }
924 }if($task->end_date!='0000-00-00 00:00:00'){
925 if(!empty($wppm_date_setting)){
926 $task_end_date = $teDate->format($wppm_date_setting);
927 }else{
928 $task_end_date = isset($task->end_date) ? $task->end_date: "" ;
929 }
930 }
931 } elseif($wppm_task_time == 0){
932 $tsDate = new DateTime($task->start_date);
933 $teDate = new DateTime($task->end_date);
934 $task_start_date = $tsDate->format('Y-m-d');
935 $task_end_date = $teDate->format('Y-m-d');
936 if($task->start_date=='0000-00-00 00:00:00'){
937 if($wppm_date_setting=='Y-m-d H:i:s'){
938 $task_start_date = '0000-00-00';
939 }elseif($wppm_date_setting=='d-m-Y H:i:s'){
940 $task_start_date = '00-00-0000';
941 }elseif($wppm_date_setting=='m-d-Y H:i:s'){
942 $task_start_date = '00-00-0000';
943 }else{
944 $task_start_date = '0000-00-00';
945 }
946 }
947 if($task->end_date=='0000-00-00 00:00:00'){
948 if($wppm_date_setting=='Y-m-d H:i:s'){
949 $task_end_date = '0000-00-00';
950 }elseif($wppm_date_setting=='d-m-Y H:i:s'){
951 $task_end_date = '00-00-0000';
952 }elseif($wppm_date_setting=='m-d-Y H:i:s'){
953 $task_end_date = '00-00-0000';
954 }else{
955 $task_end_date = '0000-00-00';
956 }
957 }
958 if($task->start_date!='0000-00-00 00:00:00'){
959 if($wppm_date_setting=='Y-m-d H:i:s'){
960 $task_start_date = $tsDate->format('Y-m-d');
961 }elseif($wppm_date_setting=='d-m-Y H:i:s'){
962 $task_start_date = $tsDate->format('d-m-Y');
963 }elseif($wppm_date_setting=='m-d-Y H:i:s'){
964 $task_start_date = $tsDate->format('m-d-Y');
965 }else{
966 $task_start_date = $tsDate->format('Y-m-d');
967 }
968 }
969 if($task->end_date!='0000-00-00 00:00:00'){
970 if($wppm_date_setting=='Y-m-d H:i:s'){
971 $task_end_date = $teDate->format('Y-m-d');
972 }elseif($wppm_date_setting=='d-m-Y H:i:s'){
973 $task_end_date = $teDate->format('d-m-Y');
974 }elseif($wppm_date_setting=='m-d-Y H:i:s'){
975 $task_end_date = $teDate->format('m-d-Y');
976 }else{
977 $task_end_date = $teDate->format('Y-m-d');
978 }
979 }
980 }
981 $url = $wppmfunction->get_task_url( $task->id, $is_frontend );
982 ?>
983 <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) ?>)" >
984 <td class="bulk-selector" onmouseover="link=false;" onmouseout="link=true;">
985 <div class="wppm-pl-item-selector">
986 <div class="checkbox-container">
987 <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 ); ?>"/>
988 <label for="wppm_bulk_select_<?php echo esc_attr($task->id) ?>"></label>
989 </div>
990 </div>
991 </td>
992 <td onmouseover="link=true;">
993 <?php echo esc_html($task->task_name) ?>
994 </td>
995 <td onmouseover="link=true;">
996 <?php if(!empty($project->project_name)){
997 echo esc_html($project->project_name);
998 }
999 ?>
1000 </td>
1001 <td onmouseover="link=true;">
1002 <?php if(!empty($task->status)){ ?>
1003 <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>
1004 <?php } ?>
1005 </td>
1006 <td onmouseover="link=true;">
1007 <?php if(!empty($task->priority)){ ?>
1008 <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>
1009 <?php } ?>
1010 </td>
1011 <?php if($wppm_default_task_date == 1 && $wppm_deafault_time_duration_task==0) { ?>
1012 <td onmouseover="link=true;">
1013 <?php if(!empty($task_start_date)){ ?>
1014 <?php echo esc_html($task_start_date);
1015 } ?>
1016 </td>
1017 <td onmouseover="link=true;"><?php
1018 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')){
1019 $style = "color:#FF0000";
1020 } else{
1021 $style = "color:#2C3E50";
1022 }?>
1023 <span style="<?php echo esc_attr($style); ?>"><?php echo esc_html($task_end_date);?></span>
1024 </td>
1025 <?php } ?>
1026 <?php if($wppm_deafault_time_duration_task==1){ ?>
1027 <?php
1028 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')){
1029 $style = "color:#FF2222";
1030 } else {
1031 $style = "color:#2C3E50";
1032 } ?>
1033 <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>
1034 <?php } ?>
1035 </td>
1036 <td onmouseover="link=true;" style="text-align:center;">
1037 <?php
1038 $i=0;
1039 if(!empty($project_data['users'])){
1040 $proj_users = explode(',',$project_data['users']);
1041 }
1042 if(!empty($task->users)){
1043 $users = explode(",",$task->users);
1044 foreach($users as $user){
1045 if( (!empty($proj_users)) && (in_array($user,$proj_users))){
1046 $i++;
1047 if( $i <= 4 ){
1048 $userdata = get_userdata( $user );
1049 if(!empty($userdata)){
1050 ?>
1051 <a href="#" title="<?php echo esc_attr($userdata->display_name); ?>">
1052 <?php echo get_avatar($userdata->ID, 25, "mysteryman")?>
1053 </a> <?php
1054 }
1055 }
1056 }
1057 }
1058 }
1059 if($i > 4){
1060 ?>
1061 <a href="#" class="wppm_avatar">
1062 <span id="wppm_avatar" style="background-color:black;" class="avatar">+<?php echo esc_html($i-4) ?></span>
1063 </a>
1064 <?php } ?>
1065 <?php
1066 if($i==0){
1067 echo esc_html_e('None','taskbuilder');
1068 } ?>
1069 </td>
1070 <td onmouseover="link=true;">
1071 <?php
1072 $completion = 0;
1073 if ($total != 0 && $total != NULL) {
1074 $completion = intval($total_checked_items/$total*100);
1075 }
1076 echo esc_html($completion).'%';
1077 ?>
1078 </td>
1079 <?php do_action('wppm_table_column');?>
1080 </tr>
1081 <?php }
1082 }
1083 }
1084 ?>
1085 </tbody>
1086 </table>
1087 <script>
1088 function wppm_tl_handle_click(event, id, url,project_id) {
1089 if ( ( event.ctrlKey || event.metaKey ) && url ) {
1090 window.open(url, '_blank');
1091 } else {
1092 wppm_open_task(id,project_id);
1093 }
1094 }
1095 </script>
1096 <?php
1097 $current_page=$page_no+1;
1098 $total_pages=ceil($totalrows/$task_per_page);
1099 $prev_page_no=$current_page-1;
1100 $prev_class=($prev_page_no==0)?'disabled':'';
1101 $next_page_no=($total_pages==$current_page)? $current_page-1:$current_page;
1102 $next_class=($total_pages==$current_page)?'disabled':'';
1103 ?>
1104 <div class="row" style="background-color:#ffffff;">
1105 <div class="col-sm-12">
1106 <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>
1107 <hr style="<?php echo esc_attr($total_pages==0)? '':'display: none;';?>">
1108 </div>
1109 <div>
1110 </div>
1111 </div>
1112 <div class="row wppm_task_pagination_container">
1113 <div class="col-sm-4">
1114 <?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')?>
1115 </div>
1116 <div class="wppm_task_pagination col-sm-4" style="<?php echo esc_attr($total_pages==0)? "display:none;":"display:flex;"?>">
1117 <span class="wppm-pagination-txt">
1118 <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>
1119 </span>
1120 <span <?php echo esc_attr($prev_class) ?>
1121 style="<?php echo (isset($prev_class) && esc_attr($prev_class)== 'disabled') ? 'display:none;':'display:block;'?>cursor:pointer;">
1122 <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>
1123 </span>
1124 <span <?php echo esc_attr($next_class) ?>
1125 style="<?php echo (isset($next_class) && esc_attr($next_class) == 'disabled')?'display:none;':'display:block;'?>cursor:pointer;">
1126 <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>
1127 </span>
1128 </div>
1129 </div>
1130 </form>
1131 <style>
1132 .select2-selection--single {
1133 height: 30px!important;
1134 }
1135 .select2-dropdown:hover {
1136 color: #23527c!important;;
1137 }
1138 .select2-results__options{
1139 font:15px "Helvetica Neue",Arial,Helvetica,sans-serif !important;
1140 margin: 0!important;
1141 line-height: inherit!important;
1142 }
1143 .select2-selection__rendered{
1144 font:15px "Helvetica Neue",Arial,Helvetica,sans-serif !important;
1145 margin-top: 5px!important;
1146 }
1147 .select2-selection__rendered:hover{
1148 color: #2271b1 !important;
1149 }
1150 .select2-container--default .select2-results__option--highlighted.select2-results__option--selectable{
1151 background-color: #e85f08!important;
1152 color: white !important;
1153 }
1154 .select2-container {
1155 max-width: 150px !important;
1156 min-width: 150px !important;
1157 }
1158
1159 .select2-selection--multiple {
1160 max-width: 290px !important;
1161 min-width: 290px !important;
1162 }
1163
1164 #wppm_task_filter{
1165 min-height: 30px !important;
1166 max-height: 35px !important;
1167 }
1168 #wppm_task_table tr:nth-child(even) td{
1169 background-color:<?php echo esc_attr($appearance_settings['list-item-even-background-color'])?>;
1170 color:<?php echo esc_attr($appearance_settings['list-item-even-text-color'])?>;
1171 }
1172 #wppm_task_table tr:nth-child(odd) td{
1173 background-color:<?php echo esc_attr($appearance_settings['list-item-odd-background-color'])?>;
1174 color:<?php echo esc_attr($appearance_settings['list-item-odd-text-color'])?>;
1175 }
1176 #wppm_task_table tr:hover td{
1177 background-color:<?php echo esc_attr($appearance_settings['list-item-hover-background-color'])?>;
1178 }
1179 #wppm_task_table tr:hover td{
1180 color: <?php echo esc_attr($appearance_settings['list-item-hover-text-color'])?>;
1181 }
1182 #wppm_add_new_task_btn_tl:hover{
1183 background-color:<?php echo esc_attr($appearance_settings['list-header-button-hover-color'])?>!important;
1184 }
1185 </style>
1186 <script type="text/javascript">
1187 var link = true;
1188 window.listFilters = window.listFilters || {
1189 created_by: [],
1190 assigned: [],
1191 priority: [],
1192 start_date: "",
1193 end_date: ""
1194 };
1195
1196 var listFilters = window.listFilters;
1197 jQuery( document ).ready( function( jQuery ) {
1198 // SET VALUES AFTER INIT
1199 let createdBy = <?php echo wp_json_encode(array_map('strval', $advanced_filter['created_by'] ?? [])); ?>;
1200
1201 let assigned = <?php echo wp_json_encode(array_map('strval', $advanced_filter['assigned'] ?? [])); ?>;
1202
1203 let priority = <?php echo wp_json_encode(array_map('strval', $advanced_filter['priority'] ?? [])); ?>;
1204 jQuery('#tb-created-by').val(createdBy).trigger('change');
1205 jQuery('#tb-assigned').val(assigned).trigger('change');
1206 jQuery('#tb-priority').val(priority).trigger('change');
1207 jQuery('#tb-start-date').val('<?php echo esc_attr($advanced_filter['start_date'] ?? ''); ?>');
1208 jQuery('#tb-end-date').val('<?php echo esc_attr($advanced_filter['end_date'] ?? ''); ?>');
1209 jQuery(document).off("click", "#tb-apply-filter").on("click", "#tb-apply-filter", function (e) {
1210 e.preventDefault();
1211 listFilters.created_by = jQuery("#tb-created-by").val() || [];
1212 listFilters.assigned = jQuery("#tb-assigned").val() || [];
1213 listFilters.priority = jQuery("#tb-priority").val() || [];
1214 listFilters.start_date = jQuery("#tb-start-date").val() || "";
1215 listFilters.end_date = jQuery("#tb-end-date").val() || "";
1216 listFilters.id = "<?php echo esc_attr($project_id); ?>";
1217 renderActiveFilters(listFilters);
1218 setListFilterCookie(listFilters);
1219 triggerFilter(1, listFilters,'list');
1220 });
1221 jQuery(document).on("click", ".tb-remove", function () {
1222 let key = jQuery(this).attr("data-key");
1223 let value = jQuery(this).attr("data-value");
1224 // DATE REMOVE
1225 if (key === "date") {
1226 listFilters.start_date = "";
1227 listFilters.end_date = "";
1228 jQuery("#tb-start-date").val("");
1229 jQuery("#tb-end-date").val("");
1230 } else {
1231 listFilters[key] = (listFilters[key] || [])
1232 .map(String)
1233 .filter(v => v !== String(value));
1234 jQuery(`#tb-${key}`).val(listFilters[key]).trigger("change");
1235 }
1236 // REMOVE CHIP UI
1237 jQuery(this).closest(".tb-chip").remove();
1238 syncUIWithFilters(listFilters);
1239 // save cookie
1240 setListFilterCookie(listFilters);
1241 // reload data
1242 triggerFilter(1,listFilters,'list');
1243 });
1244 jQuery(document)
1245 .off("click", "#tb-reset-filter").on("click", "#tb-reset-filter", function () {
1246 resetFilters('list');
1247 });
1248 let saved = getListFilterCookie();
1249 if (saved && typeof saved === "object") {
1250 window.listFilters = {
1251 created_by: saved.created_by || [],
1252 assigned: saved.assigned || [],
1253 priority: saved.priority || [],
1254 start_date: saved.start_date || "",
1255 end_date: saved.end_date || ""
1256 };
1257 listFilters = window.listFilters;
1258 }
1259 setTimeout(function () {
1260 syncUIWithFilters(listFilters);
1261 renderActiveFilters(listFilters);
1262 }, 100);
1263 jQuery("input[name='wppm_task_search_filter']").keypress(function(e) {
1264 //Enter key
1265 if (e.which == 13) {
1266 wppm_task_search_filter('<?php echo esc_attr($page); ?>');
1267 }
1268 });
1269 jQuery("#wppm_task_name_th").hover(function(){
1270 jQuery('#wppm_chevron_sort_up_task_name_img').show();
1271 jQuery('#wppm_chevron_sort_down_task_name_img').hide();
1272 });
1273 jQuery("#wppm_project_name_th").hover(function(){
1274 jQuery('#wppm_chevron_sort_up_project_list_img').show();
1275 jQuery('#wppm_chevron_sort_down_project_list_img').hide();
1276 });
1277 jQuery("#wppm_status_th").hover(function(){
1278 jQuery('#wppm_chevron_sort_up_status_img').show();
1279 jQuery('#wppm_chevron_sort_down_status_img').hide();
1280 });
1281 jQuery("#wppm_priority_th").hover(function(){
1282 jQuery('#wppm_chevron_sort_up_priority_img').show();
1283 jQuery('#wppm_chevron_sort_down_priority_img').hide();
1284 });
1285 jQuery("#wppm_start_date_th").hover(function(){
1286 jQuery('#wppm_chevron_sort_up_start_date_img').show();
1287 jQuery('#wppm_chevron_sort_down_start_date_img').hide();
1288 });
1289 jQuery("#wppm_end_date_th").hover(function(){
1290 jQuery('#wppm_chevron_sort_up_end_date_img').show();
1291 jQuery('#wppm_chevron_sort_down_end_date_img').hide();
1292 });
1293 jQuery("#wppm_task_duration_th").hover(function(){
1294 jQuery('#wppm_chevron_sort_up_task_duration_img').show();
1295 jQuery('#wppm_chevron_sort_down_task_duration_img').hide();
1296 });
1297
1298 })
1299 jQuery('#wppm_task_list_proj_filter').select2({ dropdownAutoWidth: true, width: 'auto' });
1300 jQuery('#wppm_task_list_proj_filter').val(<?php echo esc_attr($proj_filter) ?>);
1301 jQuery('#tb-created-by').select2({ dropdownAutoWidth: true, width: '100%'});
1302 jQuery('#tb-created-by').val(<?php echo wp_json_encode($advanced_filter['created_by'] ?? []); ?>).trigger('change');
1303 jQuery('#tb-assigned').select2({ dropdownAutoWidth: true, width: '100%' });
1304 jQuery('#tb-assigned').val(<?php echo wp_json_encode($advanced_filter['assigned'] ?? []); ?>).trigger('change');
1305 jQuery('#tb-priority').select2({dropdownAutoWidth: true, width: '100%'});
1306 jQuery('#tb-priority').val(<?php echo wp_json_encode($advanced_filter['priority'] ?? []); ?>).trigger('change');
1307 /**
1308 * Bulk item selector change
1309 */
1310 function wppm_bulk_task_item_select_change() {
1311 jQuery("#wppm-task-bulk-actions-btn").show();
1312 var items = jQuery(".wppm-task-bulk-select:checked");
1313 var checked = items.length === 0 ? false : true;
1314 if(checked){
1315 jQuery(".wppm-bulk-selector").prop("checked", checked);
1316 }else{
1317 jQuery("#wppm-task-bulk-actions-btn").hide();
1318 jQuery(".wppm-bulk-selector").prop("checked", false);
1319 }
1320 }
1321 jQuery(document).off("click", "#tb-advanced-toggle").on("click", "#tb-advanced-toggle", function (e) {
1322 e.stopPropagation();
1323 jQuery("#tb-advanced-panel").toggleClass("tb-open");
1324 });
1325
1326 /* Close on backdrop click */
1327 jQuery(document).on("click", "#tb-backdrop", function () {
1328 jQuery("#tb-advanced-panel").removeClass("tb-open");
1329 jQuery(this).removeClass("active");
1330 });
1331
1332 /* Close on outside (desktop only) */
1333 jQuery(document).on("click", function (e) {
1334 if (window.innerWidth > 768) {
1335 if (!jQuery(e.target).closest("#tb-advanced-panel, #tb-advanced-toggle").length) {
1336 jQuery("#tb-advanced-panel").removeClass("tb-open");
1337 }
1338 }
1339 });jQuery(document).on("click", "#tb-close-filters", function () {
1340 jQuery("#tb-advanced-panel").removeClass("tb-open");
1341 jQuery("#tb-backdrop").removeClass("active");
1342 });
1343 </script>