PluginProbe
Taskbuilder – Project Management & Task Management Tool With Kanban Board / trunk
Taskbuilder – Project Management & Task Management Tool With Kanban Board vtrunk
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 1.0.6 All 57 releases
taskbuilder / includes / admin / dashboard.php

dashboard.php in Taskbuilder – Project Management & Task Management Tool With Kanban Board trunk, at includes/admin/dashboard.php

967 lines 42.1 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;
6 $current_user_id = get_current_user_id();
7 $wppm_project_time = get_option('wppm_project_time');
8 $wppm_task_time = get_option('wppm_task_time');
9 $wppm_task_statuses = $wpdb->get_results("SELECT id,name,bg_color FROM {$wpdb->prefix}wppm_task_statuses");
10 $wppm_project_statuses = $wpdb->get_results("SELECT id,name,bg_color FROM {$wpdb->prefix}wppm_project_statuses");
11 $wppm_current_user_capability = get_user_meta( $current_user->ID, 'wppm_capability', true );
12 $is_admin = ( $wppm_current_user_capability === 'wppm_admin' || current_user_can('manage_options') ) ? 1 : 0;
13 $query = $wpdb->prepare(
14 "SELECT COUNT(DISTINCT p.id)
15 FROM {$wpdb->prefix}wppm_project p
16 LEFT JOIN {$wpdb->prefix}wppm_project_users pu
17 ON p.id = pu.proj_id
18 LEFT JOIN {$wpdb->prefix}wppm_project_meta pm
19 ON p.id = pm.project_id AND pm.meta_key = 'public_project'
20 WHERE (
21 FIND_IN_SET(%d, p.users)
22 OR p.created_by = %d
23 OR %d = 1
24 OR pm.meta_value = '1'
25 )
26 AND p.status != %d",
27 $current_user_id,
28 $current_user_id,
29 $is_admin,
30 4
31 );
32 $active_projects = $wpdb->get_var($query);
33 $query = $wpdb->prepare(
34 "SELECT DISTINCT Task.*
35 FROM {$wpdb->prefix}wppm_task AS Task
36 WHERE (
37 FIND_IN_SET(%d, Task.users)
38 OR Task.created_by = %d
39 )
40 AND Task.status != %d
41 AND Task.active = 1
42 AND Task.is_archived = 0
43 LIMIT 5",
44 $current_user_id, // for JOIN pu
45 $current_user_id, // role_id
46 4 // status
47 );
48 $tasks = $wpdb->get_results($query);
49 $query = $wpdb->prepare(
50 "SELECT DISTINCT Task.*
51 FROM {$wpdb->prefix}wppm_task AS Task
52 LEFT JOIN {$wpdb->prefix}wppm_project p
53 ON Task.project = p.id
54 LEFT JOIN {$wpdb->prefix}wppm_project_users pu
55 ON p.id = pu.proj_id AND pu.user_id = %d
56 LEFT JOIN {$wpdb->prefix}wppm_project_meta pm
57 ON p.id = pm.project_id AND pm.meta_key = 'public_project'
58 WHERE (
59 %d = 1
60 OR FIND_IN_SET(%d, Task.users)
61 OR Task.created_by = %d
62 OR p.created_by = %d
63 OR (FIND_IN_SET(%d, p.users) AND pu.role_id = %d)
64 OR pm.meta_value = '1'
65 )
66 AND Task.status = %d
67 AND Task.active = 1
68 AND Task.is_archived = 0
69 LIMIT 5",
70
71 $current_user_id, // 1 → pu.user_id
72 $is_admin, // 2
73 $current_user_id, // 3
74 $current_user_id, // 4
75 $current_user_id, // 5
76 $current_user_id, // 6
77 2, // 7 → role_id
78 4 // 8 → status
79 );
80 $completed_tasks = $wpdb->get_results($query);
81 $query = $wpdb->prepare(
82 "SELECT COUNT(DISTINCT Task.id)
83 FROM {$wpdb->prefix}wppm_task AS Task
84 LEFT JOIN {$wpdb->prefix}wppm_project p
85 ON Task.project = p.id
86 LEFT JOIN {$wpdb->prefix}wppm_project_users pu
87 ON p.id = pu.proj_id AND pu.user_id = %d
88 LEFT JOIN {$wpdb->prefix}wppm_project_meta pm
89 ON p.id = pm.project_id AND pm.meta_key = 'public_project'
90 WHERE (
91 %d = 1
92 OR FIND_IN_SET(%d, Task.users)
93 OR Task.created_by = %d
94 OR p.created_by = %d
95 OR (FIND_IN_SET(%d, p.users) AND pu.role_id = %d)
96 OR pm.meta_value = '1'
97 )
98 AND Task.status = %d
99 AND Task.active = 1
100 AND Task.is_archived = 0",
101
102 $current_user_id, // pu.user_id
103 $is_admin,
104 $current_user_id,
105 $current_user_id,
106 $current_user_id,
107 $current_user_id,
108 2, // role_id �
109 FIXED
110 4 // status
111 );
112 $completed_task_count = $wpdb->get_var($query);
113 $query = $wpdb->prepare(
114 "SELECT DISTINCT count(*) AS task_count
115 FROM {$wpdb->prefix}wppm_task AS Task
116 WHERE (
117 FIND_IN_SET(%d, Task.users)
118 OR Task.created_by = %d
119 )
120 AND Task.status != %d
121 AND Task.active = 1
122 AND Task.is_archived = 0
123 LIMIT 5",
124 $current_user_id, // for JOIN pu
125 $current_user_id, // role_id
126 4 // status
127 );
128 $task_count = $wpdb->get_var($query);
129 $query = $wpdb->prepare(
130 "SELECT DISTINCT Task.*,p.project_name
131 FROM {$wpdb->prefix}wppm_task AS Task
132 LEFT JOIN {$wpdb->prefix}wppm_project p
133 ON Task.project = p.id
134 LEFT JOIN {$wpdb->prefix}wppm_project_users pu
135 ON p.id = pu.proj_id AND pu.user_id = %d
136 LEFT JOIN {$wpdb->prefix}wppm_project_meta pm
137 ON p.id = pm.project_id AND pm.meta_key = 'public_project'
138 WHERE (
139 %d = 1
140 OR FIND_IN_SET(%d, Task.users)
141 OR Task.created_by = %d
142 OR p.created_by = %d
143 OR (FIND_IN_SET(%d, p.users) AND pu.role_id = %d)
144 OR pm.meta_value = '1'
145 )
146 AND DATE(Task.end_date) = CURDATE()
147 AND Task.status != %d
148 AND Task.active = 1
149 AND Task.is_archived = 0
150 LIMIT 5",
151 $current_user_id, // for JOIN pu
152 $is_admin,
153 $current_user_id,
154 $current_user_id,
155 $current_user_id,
156 $current_user_id,
157 2, // role_id
158 4 // status
159 );
160 $todays_tasks = $wpdb->get_results($query);
161 $status_counts = [];
162 $task_bg_color = [];
163 $project_status_counts = [];
164 $project_bg_color = [];
165 if(!empty($wppm_task_statuses)){
166 foreach($wppm_task_statuses as $key => $status){
167 $count = $wpdb->get_var($wpdb->prepare(
168 "SELECT DISTINCT COUNT(DISTINCT Task.id)
169 FROM {$wpdb->prefix}wppm_task AS Task
170 LEFT JOIN {$wpdb->prefix}wppm_project p
171 ON Task.project = p.id
172 LEFT JOIN {$wpdb->prefix}wppm_project_users pu
173 ON p.id = pu.proj_id AND pu.user_id = %d
174 LEFT JOIN {$wpdb->prefix}wppm_project_meta pm
175 ON p.id = pm.project_id AND pm.meta_key = 'public_project'
176 WHERE (
177 %d = 1
178 OR FIND_IN_SET(%d, Task.users)
179 OR Task.created_by = %d
180 OR p.created_by = %d
181 OR (FIND_IN_SET(%d, p.users) AND pu.role_id = %d)
182 OR pm.meta_value = '1'
183 )
184 AND Task.status = %d
185 AND Task.active = 1
186 AND Task.is_archived = 0
187 LIMIT 5",
188 $current_user_id, // for JOIN pu
189 $is_admin,
190 $current_user_id,
191 $current_user_id,
192 $current_user_id,
193 $current_user_id,
194 2, // role_id
195 $status->id // status
196 )
197 );
198 $status_counts[$status->name] = $count;
199 $task_bg_color[$status->name] = $status->bg_color;
200 }
201 }
202 if(!empty($wppm_project_statuses)){
203 foreach($wppm_project_statuses as $key => $status){
204 $count = $wpdb->get_var(
205 $wpdb->prepare(
206 "SELECT COUNT(DISTINCT p.id)
207 FROM {$wpdb->prefix}wppm_project p
208 LEFT JOIN {$wpdb->prefix}wppm_project_meta pm
209 ON p.id = pm.project_id
210 AND pm.meta_key = 'public_project'
211 WHERE (
212 FIND_IN_SET(%d, p.users)
213 OR p.created_by = %d
214 OR %d = 1
215 OR pm.meta_value = '1'
216 )
217 AND p.status = %d",
218 $current_user_id,
219 $current_user_id,
220 $is_admin,
221 $status->id
222 )
223 );
224 $project_status_counts[$status->name] = $count;
225 $project_bg_color[$status->name] = $status->bg_color;
226 }
227 }
228 $overdue = $wpdb->get_var(
229 $wpdb->prepare(
230 "SELECT COUNT(DISTINCT t.id)
231 FROM {$wpdb->prefix}wppm_task t
232 LEFT JOIN {$wpdb->prefix}wppm_project p
233 ON t.project = p.id
234 LEFT JOIN {$wpdb->prefix}wppm_project_users pu
235 ON p.id = pu.proj_id
236 AND pu.user_id = %d
237 LEFT JOIN {$wpdb->prefix}wppm_project_meta pm
238 ON p.id = pm.project_id
239 AND pm.meta_key = 'public_project'
240 WHERE
241 t.end_date < CURDATE()
242 AND t.status != 4
243 AND t.active = 1
244 AND t.is_archived = 0
245 AND (
246 %d = 1
247 OR FIND_IN_SET(%d, t.users)
248 OR t.created_by = %d
249 OR p.created_by = %d
250 OR pu.role_id = %d
251 OR pm.meta_value = '1'
252 )",
253 $current_user_id, // pu.user_id
254 $is_admin,
255 $current_user_id,
256 $current_user_id,
257 $current_user_id,
258 2 // role_id
259 )
260 );
261 $labels = array_keys($status_counts);
262 $data = array_values($status_counts);
263 $task_bg_colors = array_values($task_bg_color);
264 $project_overdue = $wpdb->get_var(
265 $wpdb->prepare(
266 "SELECT COUNT(DISTINCT p.id)
267 FROM {$wpdb->prefix}wppm_project p
268 LEFT JOIN {$wpdb->prefix}wppm_project_meta pm
269 ON p.id = pm.project_id
270 AND pm.meta_key = 'public_project'
271 WHERE (
272 FIND_IN_SET(%d, p.users)
273 OR p.created_by = %d
274 OR %d = 1
275 OR pm.meta_value = '1'
276 )
277 AND p.status != %d AND p.end_date < CURDATE()",
278 $current_user_id,
279 $current_user_id,
280 $is_admin,
281 4
282 )
283 );
284 $project_labels = array_keys($project_status_counts);
285 $project_data = array_values($project_status_counts);
286 $project_bg_colors = array_values($project_bg_color);
287 $labels[] = 'Overdue';
288 $data[] = $overdue;
289 $task_bg_colors [] = '#e74c3c';
290 $project_labels[] = 'Overdue';
291 $project_data[] = $project_overdue;
292 $project_bg_colors[] = '#e74c3c';
293 ?>
294 <div class="wppm-dashboard">
295 <div class="wppm-dashboard-top">
296 <div class="wppm-small-widget">
297 <div class="wppm-widget-icon">📁</div>
298 <h3><?php echo esc_html_e('Active Projects', 'taskbuilder'); ?></h3>
299 <span class="wppm-number"><?php echo intval($active_projects); ?></span>
300 </div>
301 <div class="wppm-small-widget">
302 <div class="wppm-widget-icon">📝</div>
303 <h3><?php echo esc_html_e('My Tasks', 'taskbuilder'); ?></h3>
304 <span class="wppm-number"><?php echo intval($task_count); ?></span>
305 </div>
306 <div class="wppm-small-widget">
307 <div class="wppm-widget-icon">�
308 </div>
309 <h3><?php echo esc_html_e('Completed Tasks', 'taskbuilder'); ?></h3>
310 <span class="wppm-number"><?php echo intval($completed_task_count); ?></span>
311 </div>
312 <div class="wppm-small-widget overdue">
313 <div class="wppm-widget-icon"></div>
314 <h3><?php echo esc_html_e('Overdue Tasks', 'taskbuilder'); ?></h3>
315 <span class="wppm-number"><?php echo intval($overdue); ?></span>
316 </div>
317 </div>
318 <div class="wppm-divider"></div>
319 <div class="wppm-row">
320 <div class="wppm-widget">
321 <h2><?php echo esc_html_e('Today\'s Tasks', 'taskbuilder'); ?><a href="<?php echo esc_url(admin_url('admin.php?page=wppm-tasks&wppm_task_filter=today')); ?>" class="wppm-view-all" target="_blank"><?php echo esc_html_e('View All', 'taskbuilder'); ?></a></h2>
322 <form id="wppm_get_my_tasks_frm" name="wppm_get_my_tasks_frm">
323 <div class="table-responsive">
324 <table id="tbl_todays_tasks" class="table table-striped table-bordered" cellspacing="0" width="100%">
325 <thead>
326 <tr>
327 <th class="wppm_table_header"><?php echo esc_html_e('Task Name','taskbuilder');?> </th>
328 <th class="wppm_table_header"><?php echo esc_html_e('Task Status','taskbuilder');?> </th>
329 <th class="wppm_table_header"><?php echo esc_html_e('Project','taskbuilder');?> </th>
330 <th class="wppm_table_header"><?php echo esc_html_e('Due date','taskbuilder');?> </th>
331 <th class="wppm_table_header"><?php echo esc_html_e('Progress','taskbuilder');?> </th>
332 </tr>
333 </thead>
334 <tbody>
335 <?php
336 if(!empty($todays_tasks)){
337 foreach ($todays_tasks as $task) {
338 $status = $wpdb->get_row( $wpdb->prepare( "SELECT * FROM {$wpdb->prefix}wppm_task_statuses WHERE id = %d", (int) $task->status ) );
339 $users = array();
340 if($task->users != null){
341 $users = explode(",",$task->users);
342 }
343 if(!empty($task->project)){
344 $project = $wpdb->get_row( $wpdb->prepare( "SELECT * FROM {$wpdb->prefix}wppm_project WHERE id = %d",(int) $task->project));
345 }
346 if($wppm_task_time == 1){
347 $task_end_date = $task->end_date;
348 } elseif($wppm_task_time == 0){
349 $teDate = new DateTime($task->end_date);
350 $task_end_date = $teDate->format('Y-m-d');
351 }
352 $priority_color = $wpdb->get_var(
353 $wpdb->prepare(
354 "SELECT bg_color
355 FROM {$wpdb->prefix}wppm_task_priorities
356 WHERE id = %d",
357 (int) $task->priority
358 )
359 );
360 // fallback color if not found
361 if(empty($priority_color)){
362 $priority_color = '#cccccc';
363 }
364 ?>
365 <tr onclick="wppm_open_task(<?php echo esc_attr($task->id); ?>)" class="wppm-task-row" data-task="<?php echo esc_attr($task->id); ?>" data-project="<?php echo esc_attr($task->project); ?>">
366 <td>
367 <span class="wppm-priority-dot" style="background: <?php echo esc_attr($priority_color); ?>;"></span>
368 <?php echo esc_html($task->task_name); ?>
369 </td>
370 <td>
371 <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>
372 </td>
373 <td>
374 <?php echo esc_html($project->project_name); ?>
375 </td>
376 <td>
377 <?php echo (isset($task_end_date))? esc_html($task_end_date):""?>
378 </td>
379 <td>
380 <?php
381 $checklists = $wpdb->get_results( $wpdb->prepare("SELECT * FROM {$wpdb->prefix}wppm_checklist where task_id = %d",$task->id) );
382 $row = $wpdb->get_row(
383 $wpdb->prepare(
384 "SELECT
385 COUNT(Items.id) as total,
386 SUM(CASE WHEN Items.checked = 1 THEN 1 ELSE 0 END) as completed
387 FROM {$wpdb->prefix}wppm_checklist_items AS Items
388 LEFT JOIN {$wpdb->prefix}wppm_checklist checklist
389 ON Items.checklist_id = checklist.id
390 WHERE checklist.task_id = %d",
391 $task->id
392 )
393 );
394 $total = $row->total;
395 $total_checked_items = intval($row->completed);
396 $progress = ($total > 0) ? round(($total_checked_items / $total) * 100) : 0;
397 $color = '#ef4444'; // red
398 if($progress >= 50){
399 $color = '#f59e0b'; // orange
400 }
401 if($progress >= 80){
402 $color = '#22c55e'; // green
403 }
404 ?>
405 <div class="dashboard-progress-wrapper">
406 <div class="dashboard-progress-bar">
407 <div class="dashboard-progress" style="width: <?php echo esc_attr($progress); ?>%; background: <?php echo esc_attr($color); ?>;"></div>
408 </div>
409 <span class="dashboard-progress-text"><?php echo esc_html($progress); ?>%</span>
410 </div>
411 </td>
412 </tr>
413 <?php }
414 }
415 ?>
416 </tbody>
417 </table>
418 </div>
419 </form>
420 </div>
421 <div class="wppm-widget">
422 <h2><?php echo esc_html__('Upcoming Tasks(Next 7 Days)', 'taskbuilder'); ?> <a href="<?php echo esc_url(admin_url('admin.php?page=wppm-tasks&wppm_task_filter=upcoming')); ?>" class="wppm-view-all" target="_blank"><?php echo esc_html__('View All','taskbuilder');?></a></h2>
423 <?php
424 $query = $wpdb->prepare(
425 "SELECT t.*, p.project_name
426 FROM {$wpdb->prefix}wppm_task t
427 LEFT JOIN {$wpdb->prefix}wppm_project p
428 ON t.project = p.id
429 LEFT JOIN {$wpdb->prefix}wppm_project_meta pm
430 ON p.id = pm.project_id
431 AND pm.meta_key = 'public_project'
432 WHERE
433 (
434 FIND_IN_SET(%d, t.users)
435 OR t.created_by = %d
436 OR %d = 1
437 OR pm.meta_value = '1'
438 OR t.project IN (
439 SELECT id FROM {$wpdb->prefix}wppm_project
440 WHERE created_by = %d
441 OR FIND_IN_SET(%d, users)
442 )
443 )
444 AND DATE(t.end_date) BETWEEN CURDATE()
445 AND DATE_ADD(CURDATE(), INTERVAL 7 DAY)
446 AND t.status != 4
447 AND t.active = 1
448 AND t.is_archived = 0
449
450 ORDER BY t.end_date ASC
451 LIMIT 5",
452 $current_user_id,
453 $current_user_id,
454 $is_admin,
455 $current_user_id,
456 $current_user_id
457 );
458 $upcoming_tasks = $wpdb->get_results($query);?>
459 <form id="wppm_get_upcoming_tasks_frm" name="wppm_get_upcoming_tasks_frm">
460 <div class="table-responsive">
461 <table id="tbl_upcoming_tasks" class="table table-striped table-bordered" cellspacing="0" width="100%">
462 <thead>
463 <tr>
464 <th class="wppm_table_header"><?php echo esc_html_e('Name','taskbuilder');?> </th>
465 <th class="wppm_table_header"><?php echo esc_html_e('Status','taskbuilder');?> </th>
466 <th class="wppm_table_header"><?php echo esc_html_e('Project','taskbuilder');?> </th>
467 <th class="wppm_table_header"><?php echo esc_html_e('Due date','taskbuilder');?> </th>
468 <th class="wppm_table_header"><?php echo esc_html_e('Progress','taskbuilder');?> </th>
469 </tr>
470 </thead>
471 <tbody>
472 <?php
473 if(!empty($upcoming_tasks)){
474 foreach ($upcoming_tasks as $task) {
475 $status = $wpdb->get_row( $wpdb->prepare( "SELECT * FROM {$wpdb->prefix}wppm_task_statuses WHERE id = %d", (int) $task->status ) );
476 $users = array();
477 if($task->users != null){
478 $users = explode(",",$task->users);
479 }
480 if(!empty($task->project)){
481 $project = $wpdb->get_row( $wpdb->prepare( "SELECT * FROM {$wpdb->prefix}wppm_project WHERE id = %d",(int) $task->project));
482 }
483 if($wppm_task_time == 1){
484 $task_end_date = $task->end_date;
485 } elseif($wppm_task_time == 0){
486 $teDate = new DateTime($task->end_date);
487 $task_end_date = $teDate->format('Y-m-d');
488 }
489 $priority_color = $wpdb->get_var(
490 $wpdb->prepare(
491 "SELECT bg_color
492 FROM {$wpdb->prefix}wppm_task_priorities
493 WHERE id = %d",
494 (int) $task->priority
495 )
496 );
497 // fallback color if not found
498 if(empty($priority_color)){
499 $priority_color = '#cccccc';
500 }
501 ?>
502 <tr onclick="wppm_open_task(<?php echo esc_attr($task->id);?>)" class="wppm-task-row" data-task="<?php echo esc_attr($task->id); ?>" data-project="<?php echo esc_attr($task->project); ?> ">
503 <td>
504 <span class="wppm-priority-dot" style="background: <?php echo esc_attr($priority_color); ?>;"></span>
505 <?php echo esc_html($task->task_name); ?>
506 </td>
507 <td>
508 <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>
509 </td>
510 <td>
511 <?php echo esc_html($project->project_name); ?>
512 </td>
513 <td>
514 <?php echo (isset($task_end_date))? esc_html($task_end_date):""?>
515 </td>
516 <td>
517 <?php
518 $checklists = $wpdb->get_results( $wpdb->prepare("SELECT * FROM {$wpdb->prefix}wppm_checklist where task_id = %d",$task->id) );
519 $row = $wpdb->get_row(
520 $wpdb->prepare(
521 "SELECT
522 COUNT(Items.id) as total,
523 SUM(CASE WHEN Items.checked = 1 THEN 1 ELSE 0 END) as completed
524 FROM {$wpdb->prefix}wppm_checklist_items AS Items
525 LEFT JOIN {$wpdb->prefix}wppm_checklist checklist
526 ON Items.checklist_id = checklist.id
527 WHERE checklist.task_id = %d",
528 $task->id
529 )
530 );
531
532 $total = $row->total;
533 $total_checked_items = intval($row->completed);
534
535 $progress = ($total > 0) ? round(($total_checked_items / $total) * 100) : 0;
536 $color = '#ef4444'; // red
537 if($progress >= 50){
538 $color = '#f59e0b'; // orange
539 }
540 if($progress >= 80){
541 $color = '#22c55e'; // green
542 }
543 ?>
544 <div class="dashboard-progress-wrapper">
545 <div class="dashboard-progress-bar">
546 <div class="dashboard-progress" style="width: <?php echo esc_attr($progress); ?>%; background: <?php echo esc_attr($color); ?>;"></div>
547 </div>
548 <span class="dashboard-progress-text"><?php echo esc_html($progress); ?>%</span>
549 </div>
550 </td>
551 </tr>
552 <?php }
553 }
554 ?>
555 </tbody>
556 </table>
557 </div>
558 </form>
559 </div>
560 </div>
561 <div class="wppm-row">
562 <div class="wppm-widget">
563 <h2><?php echo esc_html_e('My Tasks','taskbuilder'); ?> <a href="<?php echo esc_url(admin_url('admin.php?page=wppm-tasks&wppm_task_filter=mytasks')); ?>" class="wppm-view-all" target="_blank"><?php echo esc_html_e('View All','taskbuilder'); ?></a></h2>
564 <form id="wppm_get_my_tasks_frm" name="wppm_get_my_tasks_frm">
565 <div class="table-responsive">
566 <table id="tbl_my_tasks" class="table table-striped table-bordered" cellspacing="0" width="100%">
567 <thead>
568 <tr>
569 <th class="wppm_table_header"><?php echo esc_html_e('Task Name','taskbuilder');?> </th>
570 <th class="wppm_table_header"><?php echo esc_html_e('Task Status','taskbuilder');?> </th>
571 <th class="wppm_table_header"><?php echo esc_html_e('Project','taskbuilder');?> </th>
572 <th class="wppm_table_header"><?php echo esc_html_e('Due date','taskbuilder');?> </th>
573 <th class="wppm_table_header"><?php echo esc_html_e('Progress','taskbuilder');?> </th>
574 </tr>
575 </thead>
576 <tbody>
577 <?php
578 if(!empty($tasks)){
579 foreach ($tasks as $task) {
580 $status = $wpdb->get_row( $wpdb->prepare( "SELECT * FROM {$wpdb->prefix}wppm_task_statuses WHERE id = %d", (int) $task->status ) );
581 $users = array();
582 if($task->users != null){
583 $users = explode(",",$task->users);
584 }
585 if(!empty($task->project)){
586 $project = $wpdb->get_row( $wpdb->prepare( "SELECT * FROM {$wpdb->prefix}wppm_project WHERE id = %d",(int) $task->project));
587 }
588 if($wppm_task_time == 1){
589 $task_end_date = $task->end_date;
590 } elseif($wppm_task_time == 0){
591 $teDate = new DateTime($task->end_date);
592 $task_end_date = $teDate->format('Y-m-d');
593 }
594 $priority_color = $wpdb->get_var( $wpdb->prepare(
595 "SELECT bg_color
596 FROM {$wpdb->prefix}wppm_task_priorities
597 WHERE id = %d",
598 (int) $task->priority
599 )
600 );
601 // fallback color if not found
602 if(empty($priority_color)){
603 $priority_color = '#cccccc';
604 }
605 ?>
606 <tr class="wppm-task-row" data-task="<?php echo esc_attr($task->id); ?>" data-project="<?php echo esc_attr($task->project); ?>">
607 <td>
608 <span class="wppm-priority-dot" style="background: <?php echo esc_attr($priority_color); ?>;"></span>
609 <?php echo esc_html($task->task_name); ?>
610 </td>
611 <td>
612 <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>
613 </td>
614 <td>
615 <?php echo esc_html($project->project_name); ?>
616 </td>
617 <td>
618 <?php echo (isset($task_end_date))? esc_html($task_end_date):""?>
619 </td>
620 <td>
621 <?php
622 $checklists = $wpdb->get_results( $wpdb->prepare("SELECT * FROM {$wpdb->prefix}wppm_checklist where task_id = %d",$task->id) );
623 $row = $wpdb->get_row(
624 $wpdb->prepare(
625 "SELECT
626 COUNT(Items.id) as total,
627 SUM(CASE WHEN Items.checked = 1 THEN 1 ELSE 0 END) as completed
628 FROM {$wpdb->prefix}wppm_checklist_items AS Items
629 LEFT JOIN {$wpdb->prefix}wppm_checklist checklist
630 ON Items.checklist_id = checklist.id
631 WHERE checklist.task_id = %d",
632 $task->id
633 )
634 );
635 $total = $row->total;
636 $total_checked_items = intval($row->completed);
637
638 $progress = ($total > 0) ? round(($total_checked_items / $total) * 100) : 0;
639 $color = '#ef4444'; // red
640 if($progress >= 50){
641 $color = '#f59e0b'; // orange
642 }
643 if($progress >= 80){
644 $color = '#22c55e'; // green
645 }
646 ?>
647 <div class="dashboard-progress-wrapper">
648 <div class="dashboard-progress-bar">
649 <div class="dashboard-progress" style="width: <?php echo esc_attr($progress); ?>%; background: <?php echo esc_attr($color); ?>;"></div>
650 </div>
651 <span class="dashboard-progress-text"><?php echo esc_html($progress); ?>%</span>
652 </div>
653 </td>
654 </tr>
655 <?php }
656 }
657 ?>
658 </tbody>
659 </table>
660 </div>
661 </form>
662 </div>
663 <div class="wppm-widget">
664 <h2><?php echo esc_html_e('Active Projects','taskbuilder'); ?> <a href="<?php echo esc_url(admin_url('admin.php?page=wppm-projects&wppm_project_filter=active')); ?>" class="wppm-view-all" target="_blank"><?php echo esc_html_e('View All','taskbuilder'); ?></a></h2>
665 <?php
666 $query = $wpdb->prepare(
667 "SELECT
668 p.id,
669 p.project_name AS name,
670 ps.name AS status_name,
671 ps.bg_color AS status_color,
672 ps.color AS status_text_color,
673 p.end_date,
674 COUNT(t.id) AS total_tasks,
675 SUM(CASE WHEN t.status = '4' THEN 1 ELSE 0 END) AS completed_tasks
676 FROM {$wpdb->prefix}wppm_project p
677 LEFT JOIN {$wpdb->prefix}wppm_project_statuses ps
678 ON p.status = ps.id
679 LEFT JOIN {$wpdb->prefix}wppm_project_users pu
680 ON p.id = pu.proj_id
681 LEFT JOIN {$wpdb->prefix}wppm_task t
682 ON p.id = t.project
683 LEFT JOIN {$wpdb->prefix}wppm_project_meta pm
684 ON p.id = pm.project_id
685 AND pm.meta_key = 'public_project'
686 WHERE (FIND_IN_SET(%d, p.users) OR p.created_by = %d OR %d = 1 OR pm.meta_value = 1)
687 AND p.status != %d
688 GROUP BY p.id
689 ORDER BY p.end_date ASC
690 LIMIT 5",
691 $current_user_id,
692 $current_user_id,
693 $is_admin,
694 4
695 );
696 $projects = $wpdb->get_results($query);
697 ?>
698 <form id="wppm_get_active_projects_frm" name="wppm_get_active_projects_frm">
699 <div class="table-responsive">
700 <table id="tbl_active_projects" class="table table-striped table-bordered" cellspacing="0" width="100%">
701 <thead>
702 <tr>
703 <th class="wppm_table_header"><?php echo esc_html_e('Name','taskbuilder');?> </th>
704 <th class="wppm_table_header"><?php echo esc_html_e('Status','taskbuilder');?> </th>
705 <th class="wppm_table_header"><?php echo esc_html_e('Due date','taskbuilder');?> </th>
706 <th class="wppm_table_header"><?php echo esc_html_e('Progress','taskbuilder');?> </th>
707 </tr>
708 </thead>
709 <tbody>
710 <?php
711 if(!empty($projects)){
712 foreach ($projects as $project) {
713 if($wppm_project_time == 1){
714 $project_end_date = $project->end_date;
715 } elseif($wppm_project_time == 0){
716 $peDate = new DateTime($project->end_date);
717 $project_end_date = $peDate->format('Y-m-d');
718 }
719 ?>
720 <tr onclick= "wppm_open_project(<?php echo esc_attr($project->id) ?>)" class="wppm-project-row" data-project="<?php echo esc_attr($project->id); ?>">
721 <td>
722 <?php echo esc_html($project->name); ?>
723 </td>
724 <td>
725 <span class="wppm_td_project_status" style="background-color:<?php echo (isset($project->status_color))? esc_attr($project->status_color):"";?>; color: <?php echo (isset($project->status_text_color))? esc_attr($project->status_text_color):""; ?>"><?php echo (isset($project->status_name))? esc_html($project->status_name):"" ?></span>
726 </td>
727 <td>
728 <?php echo esc_html($project_end_date); ?>
729 </td>
730 <td>
731 <?php
732 $total = $project->total_tasks;
733 $completed = $project->completed_tasks;
734 if($total > 0){
735 $proj_progress = round(($completed / $total) * 100);
736 }else{
737 $proj_progress = 0;
738 }
739 $color = '#ef4444'; // red
740 if($proj_progress >= 50){
741 $color = '#f59e0b'; // orange
742 }
743 if($proj_progress >= 80){
744 $color = '#22c55e'; // green
745 }
746 ?>
747 <div class="dashboard-progress-wrapper">
748 <div class="dashboard-progress-bar">
749 <div class="dashboard-progress" style="width:<?php echo esc_attr($proj_progress); ?>%; background: <?php echo esc_attr($color); ?>;"></div>
750 </div>
751 <span class="dashboard-progress-text"><?php echo esc_html($proj_progress); ?>%</span>
752 </div>
753 </div>
754 </td>
755 </tr>
756 <?php }
757 }?>
758 </tbody>
759 </table>
760 </div>
761 </form>
762 </div>
763 </div>
764 <div class="wppm-row">
765 <div class="wppm-widget">
766 <h2><?php echo esc_html_e('Project Overview', 'taskbuilder'); ?></h2>
767 <canvas id="wppm_project_chart"></canvas>
768 </div>
769 <div class="wppm-widget">
770 <h2><?php echo esc_html_e('Task Overview', 'taskbuilder'); ?></h2>
771 <canvas id="wppm_task_chart"></canvas>
772 </div>
773 </div>
774 <div class="wppm-row">
775 <div class="wppm-widget">
776 <h2><?php echo esc_html_e('User Workload', 'taskbuilder'); ?></h2>
777 <?php
778 $query = $wpdb->prepare( "SELECT u.ID, u.display_name,
779 COUNT(DISTINCT t.id) AS total_tasks
780 FROM {$wpdb->users} u
781 INNER JOIN {$wpdb->prefix}wppm_project_users pu
782 ON u.ID = pu.user_id
783 INNER JOIN {$wpdb->prefix}wppm_task t
784 ON FIND_IN_SET(u.ID, t.users)
785 AND t.project = pu.proj_id AND pu.role_id!=3
786 WHERE
787 t.status != 4
788 AND t.active = 1
789 AND t.is_archived = 0
790 AND (
791 %d = 1
792 OR EXISTS (
793 SELECT 1
794 FROM {$wpdb->prefix}wppm_project_users current_pu
795 LEFT JOIN {$wpdb->prefix}wppm_project p
796 ON current_pu.proj_id = p.id
797 WHERE (current_pu.proj_id = pu.proj_id
798 AND current_pu.user_id = %d
799 AND current_pu.role_id != 3 OR p.created_by = %d )
800 )
801 )
802 GROUP BY u.ID
803 HAVING total_tasks > 0
804 ORDER BY total_tasks DESC
805 LIMIT 5",
806 $is_admin,
807 $current_user_id,
808 $current_user_id
809 );
810
811 $workloads = $wpdb->get_results($query);
812 // Get max task count
813 $max_tasks = 0;
814 if(!empty($workloads)){
815 foreach($workloads as $w){
816 if($w->total_tasks > $max_tasks){
817 $max_tasks = $w->total_tasks;
818 }
819 }
820 }
821 ?>
822 <ul class="wppm-workload-list">
823 <?php
824 if(!empty($workloads)){
825 foreach($workloads as $workload){
826 $percent = 0;
827 if($max_tasks > 0){
828 $percent = ($workload->total_tasks / $max_tasks) * 100;
829 }
830 $color = '#4CAF50';
831 if($percent > 80){
832 $color = '#ff4d4d';
833 }elseif($percent > 50){
834 $color = '#ffa500';
835 }?>
836 <li>
837 <span><?php echo esc_html($workload->display_name); ?></span>
838 <div class="wppm-workload-bar">
839 <div class="wppm-progress" style="width:<?php echo esc_attr($percent); ?>%; background:<?php echo esc_attr($color); ?>"></div>
840 </div>
841 <span><?php echo esc_html($workload->total_tasks); ?></span>
842 </li>
843 <?php }
844 }?>
845 </ul>
846 </div>
847 <div class="wppm-widget">
848 <h2><?php echo esc_html_e('Quick Actions', 'taskbuilder'); ?></h2>
849 <div class="wppm-quick-actions">
850 <a href="<?php echo esc_url(admin_url('admin.php?page=wppm-projects&action=add')); ?>" class="wppm-add-new-btn btn-primary" target="_blank"> <?php echo esc_html_e('Add New Project', 'taskbuilder'); ?></a>
851 <a href="<?php echo esc_url(admin_url('admin.php?page=wppm-projects&action=view')); ?>" class="wppm-add-new-btn btn-primary" target="_blank"> 📂 <?php echo esc_html_e('View Projects', 'taskbuilder'); ?></a>
852 <a href="<?php echo esc_url(admin_url('admin.php?page=wppm-tasks&action=add')); ?>" class="wppm-add-new-btn btn-primary" target="_blank"> �
853 <?php echo esc_html_e('Add New Task', 'taskbuilder'); ?></a>
854 <a href="<?php echo esc_url(admin_url('admin.php?page=wppm-tasks&action=view')); ?>" class="wppm-add-new-btn btn-primary" target="_blank"> 📋 <?php echo esc_html_e('View Tasks', 'taskbuilder'); ?></a>
855 </div>
856 </div>
857 </div>
858 </div>
859 </div>
860 <script type="text/javascript">
861 jQuery(document).ready(function() {
862 var table = jQuery('#tbl_my_tasks').DataTable({
863 "paging": false,
864 "ordering": false,
865 "info": false,
866 "searching": false,
867 "language": {
868 "emptyTable": "<?php echo esc_html_e('No tasks found','taskbuilder'); ?>"
869 }
870 });
871 var table = jQuery('#tbl_todays_tasks').DataTable({
872 "paging": false,
873 "ordering": false,
874 "info": false,
875 "searching": false,
876 "language": {
877 "emptyTable": "<?php echo esc_html_e('No tasks found','taskbuilder'); ?>"
878 }
879 });
880 var proj_table = jQuery('#tbl_active_projects').DataTable({
881 "paging": false,
882 "ordering": false,
883 "info": false,
884 "searching": false,
885 "language": {
886 "emptyTable": "<?php echo esc_html_e('No Projects found','taskbuilder'); ?>"
887 }
888 });
889 jQuery('div.dataTables_filter input', proj_table.table().container()).focus();
890 var upcoming_tasks_table = jQuery('#tbl_upcoming_tasks').DataTable({
891 "paging": false,
892 "ordering": false,
893 "info": false,
894 "searching": false,
895 "language": {
896 "emptyTable": "<?php echo esc_html_e('No Upcoming Tasks found','taskbuilder'); ?>"
897 }
898 });
899 //jQuery('div.dataTables_filter input', upcoming_tasks_table.table().container()).focus();
900 var ctx = document.getElementById('wppm_task_chart').getContext('2d');
901 new Chart(ctx, {
902 type: 'doughnut',
903 data: {
904 labels: <?php echo json_encode($labels); ?>,
905 datasets: [{
906 data:<?php echo json_encode($data); ?>,
907 backgroundColor: [
908 <?php
909 foreach($task_bg_colors as $color){
910 echo "'".esc_attr($color)."',";
911 }
912 ?>
913 ]
914 }]
915 },
916 options: {
917 responsive: true,
918 plugins: {
919 legend: {
920 position: 'bottom'
921 }
922 }
923 }
924 });
925 var ctx = document.getElementById('wppm_project_chart').getContext('2d');
926 new Chart(ctx, {
927 type: 'doughnut',
928 data: {
929 labels: <?php echo json_encode($project_labels); ?>,
930 datasets: [{
931 data: <?php echo json_encode($project_data); ?>,
932 backgroundColor: [
933 <?php
934 foreach($project_bg_colors as $color){
935 echo "'".esc_attr($color)."',";
936 }
937 ?>
938 ]
939 }]
940 },
941 options: {
942 responsive: true,
943 plugins: {
944 legend: {
945 position: 'bottom'
946 }
947 }
948 }
949 });
950 } );
951 jQuery(document).on('click','.wppm-task-row',function(){
952 var task_id = jQuery(this).data('task');
953 var project_id = jQuery(this).data('project');
954 event.stopPropagation();
955 window.location.href = '<?php echo admin_url("admin.php?page=wppm-tasks"); ?>' + '&task_id=' + task_id;
956 });
957 jQuery(document).on('click','.wppm-project-row',function(){
958 var project_id = jQuery(this).data('project');
959 event.stopPropagation();
960 window.location.href = '<?php echo admin_url("admin.php?page=wppm-projects"); ?>' + '&project_id=' + project_id;
961 });
962 </script>
963 <style type="text/css">
964 #wpfooter{
965 display: none;
966 }
967 </style>