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 / projects / open_project / wppm_view_project_tasks.php

wppm_view_project_tasks.php in Taskbuilder – Project Management & Task Management Tool With Kanban Board 6.0.2, at includes/admin/projects/open_project/wppm_view_project_tasks.php

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