| @@ -30,9 +30,12 @@ | ||
| 30 | 30 | if ( $auth_code && $auth_id == $auth_code ) { |
| 31 | 31 | $url_auth = true; |
| 32 | 32 | } |
| 33 | 33 | if (!(($current_user->ID && $current_user->has_cap('manage_options')) || ($wppmfunction->has_permission('view_task',$id)) || ($url_auth==true))) { ?> |
| 34 | - <div style="align-item:center;" ><h6><?php esc_attr_e( 'Unauthorized access!', 'taskbuilder' ); ?></h6></div> | |
| 34 | + <div style="text-align:center;padding:20px 0;"> | |
| 35 | + <h6><?php esc_attr_e( 'Unauthorized access!', 'taskbuilder' ); ?></h6> | |
| 36 | + <a href="<?php echo esc_url( admin_url('admin.php?page=wppm-tasks') ); ?>" class="btn btn-success btn-sm"><?php esc_html_e( 'Go to Task List', 'taskbuilder' ); ?></a> | |
| 37 | + </div> | |
| 35 | 38 | <?php |
| 36 | 39 | wp_die(); |
| 37 | 40 | } |
| 38 | 41 | $proj_id = isset($_POST) && isset($_POST['proj_id']) ? intval(sanitize_text_field(wp_unslash($_POST['proj_id']))) : 0; |
| @@ -229,9 +232,9 @@ | ||
| 229 | 232 | <span class="wppm-dashboard-btn" id="wppm_dashboard_btn" title="<?php esc_attr_e( 'Dashboard', 'taskbuilder' ); ?>" onclick="wppm_get_project_tasks(<?php echo esc_attr($proj_id) ?>)"> |
| 230 | 233 | <a href="<?php echo esc_url(admin_url('admin.php?page=wppm-dashboard')); ?>"><img src="<?php echo esc_url( WPPM_PLUGIN_URL . 'asset/images/dashboard-icon.svg'); ?>" alt="dashboard"></a> |
| 231 | 234 | </span> |
| 232 | 235 | <span class="wppm-delete_task_btn" id="wppm_delete_task_btn" title="Delete Task" onclick="wppm_get_delete_task(<?php echo esc_attr($id) ?>,<?php echo esc_attr($proj_id) ?>,<?php echo esc_attr($project_id) ?>)" style="<?php echo esc_attr($style) ?>"><img src="<?php echo esc_url( WPPM_PLUGIN_URL . 'asset/images/bin.svg'); ?>" alt="delete"></span> |
| 233 | - <div class="wppm-clone_task_btn" id="wppm_clone_task_btn" title="Clone Task" onclick="wppm_clone_task(<?php echo esc_attr($id) ?>,<?php echo esc_attr($proj_id)?>,<?php echo esc_attr($project_id) ?>)" style="<?php echo esc_attr($clone_style) ?>"><img src="<?php echo esc_url( WPPM_PLUGIN_URL . 'asset/images/duplicate.svg'); ?>" alt="clone"></div> | |
| 236 | + <span class="wppm-clone_task_btn" id="wppm_clone_task_btn" title="Clone Task" onclick="wppm_clone_task(<?php echo esc_attr($id) ?>,<?php echo esc_attr($proj_id)?>,<?php echo esc_attr($project_id) ?>)" style="<?php echo esc_attr($clone_style) ?>"><img src="<?php echo esc_url( WPPM_PLUGIN_URL . 'asset/images/duplicate.svg'); ?>" alt="clone"></span> | |
| 234 | 237 | <span class="wppm-print_task_btn" id="wppm_print_task_btn" title="Print Task" onclick="wppm_print_task(<?php echo esc_attr($id) ?>)"><img src="<?php echo esc_url( WPPM_PLUGIN_URL . 'asset/images/printer_menu.svg'); ?>" alt="print" style="<?php echo esc_attr($ar_css);?>"></span> |
| 235 | 238 | <span class="wppm-archieve_task_btn" id="wppm_archieve_task_btn" title="<?php echo ($task->is_archived==1 ) ? 'Restore Task' : 'Archive Task'; ?>" onclick="wppm_archive_task(<?php echo esc_attr($id) ?>,<?php echo esc_attr($task->is_archived) ?>,<?php echo esc_attr($project_id) ?>)" style="<?php echo esc_attr($archive_style) ?>"><img src="<?php echo esc_url( WPPM_PLUGIN_URL . 'asset/images/archive.svg'); ?>" alt="archive"></span> |
| 236 | 239 | <input type="hidden" name="wppm_archive_task_ajax_nonce" id="wppm_archive_task_ajax_nonce" value="<?php echo esc_attr( wp_create_nonce( 'wppm_archive_task_ajax_nonce' ) ); ?>"> |
| 237 | 240 | <div class="menu" id="wppmprint_menu" onclick="event.stopPropagation();"> |
| @@ -250,8 +253,23 @@ | ||
| 250 | 253 | <?php if (($wppmfunction->has_permission('change_task_details',$id) || $current_user->has_cap('manage_options') || $wppm_current_user_capability == 'wppm_admin') && $task->is_archived!=1) { ?> |
| 251 | 254 | <span id="wppm_individual_edit_task_subject" onclick="wppm_edit_task_details(<?php echo esc_attr($id) ?>,<?php echo esc_attr($proj_id) ?>,<?php echo esc_attr($project_id) ?>)" class="btn btn-sm wppm_action_btn" style="background-color:#FFFFFF !important;color:#000000 !important;"><img src="<?php echo esc_url( WPPM_PLUGIN_URL . 'asset/images/edit_01.svg'); ?>" alt="edit"></span> |
| 252 | 255 | <?php } ?> |
| 253 | 256 | </span> |
| 257 | + <?php if(!empty($task->parent_task_id)){ | |
| 258 | + $wppm_parent_task = $wpdb->get_row( $wpdb->prepare("SELECT id, task_name FROM {$wpdb->prefix}wppm_task where id=%d",absint($task->parent_task_id))); | |
| 259 | + if(!empty($wppm_parent_task)){ | |
| 260 | + $wppm_can_convert_subtask = (($current_user->has_cap('manage_options') || $wppmfunction->has_permission('delete_task',$id)) && $task->is_archived!=1); | |
| 261 | + ?> | |
| 262 | + <div class="wppm_subtask_parent_link"> | |
| 263 | + <?php echo esc_html_e('Subtask of','taskbuilder');?> | |
| 264 | + <a href="#" onclick="wppm_open_subtask(<?php echo esc_attr($wppm_parent_task->id) ?>,<?php echo esc_attr($proj_id) ?>);return false;"><?php echo esc_html($wppm_parent_task->task_name); ?></a> | |
| 265 | + <?php if($wppm_can_convert_subtask){ ?> | |
| 266 | + | <a href="#" onclick="wppm_convert_subtask_to_task(<?php echo esc_attr($id) ?>,<?php echo esc_attr($id) ?>,<?php echo esc_attr($proj_id) ?>);return false;"><?php echo esc_html_e('Convert to Task','taskbuilder');?></a> | |
| 267 | + <input type="hidden" name="wppm_convert_subtask_to_task_ajax_nonce" id="wppm_convert_subtask_to_task_ajax_nonce" value="<?php echo esc_attr( wp_create_nonce( 'wppm_convert_subtask_to_task' ) ); ?>"> | |
| 268 | + <?php } ?> | |
| 269 | + </div> | |
| 270 | + <?php } | |
| 271 | + } ?> | |
| 254 | 272 | </div> |
| 255 | 273 | </div> |
| 256 | 274 | <div class="row"> |
| 257 | 275 | <div class="col-sm-3"> |
| @@ -342,8 +360,168 @@ | ||
| 342 | 360 | </div> |
| 343 | 361 | </div> |
| 344 | 362 | <?php do_action('wppm_after_task_details_in_open_task',$task->id, $task->project);?> |
| 345 | 363 | </div> |
| 364 | + <?php if(empty($task->parent_task_id)){ | |
| 365 | + $wppm_subtasks = $wppmfunction->get_subtasks($task_id); | |
| 366 | + $wppm_subtask_progress = $wppmfunction->get_subtask_progress($task_id); | |
| 367 | + $wppm_default_task_status = get_option('wppm_default_task_status'); | |
| 368 | + $wppm_can_add_subtask = (($current_user->has_cap('manage_options') || $wppmfunction->has_permission('add_new_task',$task_id)) && $task->is_archived!=1 && $user_role != 3); | |
| 369 | + ?> | |
| 370 | + <div class="wppm_task_subtask_container" id="wppm_task_subtask_container"> | |
| 371 | + <div class="row"> | |
| 372 | + <div class="col-sm-8"> | |
| 373 | + <span class="wppm_checklist_label"><img src="<?php echo esc_url( WPPM_PLUGIN_URL . 'asset/images/task_list.svg'); ?>" alt="subtasks"><?php echo esc_html_e('Subtasks','taskbuilder');?></span> | |
| 374 | + </div> | |
| 375 | + </div> | |
| 376 | + <?php if($wppm_subtask_progress['total'] > 0){ | |
| 377 | + $wppm_subtask_percent = round(($wppm_subtask_progress['completed'] / $wppm_subtask_progress['total']) * 100); ?> | |
| 378 | + <div class="wppm_progress_bar_container row"> | |
| 379 | + <div class="col-sm-4"> | |
| 380 | + <span class="wppm_progressbar_label" id="wppm_subtask_progress_label"><?php echo esc_html($wppm_subtask_progress['completed'].'/'.$wppm_subtask_progress['total']); ?></span> | |
| 381 | + </div> | |
| 382 | + <div class="wppm_progress_bar col-sm-8"> | |
| 383 | + <div id="wppm_subtask_progressbar" class="wppm_checkprogress" role="progressbar" style="width: <?php echo esc_attr($wppm_subtask_percent); ?>%;background:#5ba4cf;" aria-valuemin="0" aria-valuemax="100"></div> | |
| 384 | + </div> | |
| 385 | + </div> | |
| 386 | + <?php } ?> | |
| 387 | + <input type="hidden" name="wppm_set_change_task_status_ajax_nonce" id="wppm_subtask_status_ajax_nonce" value="<?php echo esc_attr( wp_create_nonce( 'wppm_set_change_task_status' ) ); ?>"> | |
| 388 | + <input type="hidden" name="wppm_add_new_subtask_ajax_nonce" id="wppm_add_new_subtask_ajax_nonce" value="<?php echo esc_attr( wp_create_nonce( 'wppm_add_new_subtask' ) ); ?>"> | |
| 389 | + <input type="hidden" name="wppm_remove_subtask_ajax_nonce" id="wppm_remove_subtask_ajax_nonce" value="<?php echo esc_attr( wp_create_nonce( 'wppm_remove_subtask' ) ); ?>"> | |
| 390 | + <input type="hidden" name="wppm_convert_subtask_to_task_ajax_nonce" id="wppm_convert_subtask_to_task_ajax_nonce" value="<?php echo esc_attr( wp_create_nonce( 'wppm_convert_subtask_to_task' ) ); ?>"> | |
| 391 | + <ul id="wppm_subtask_items_container" class="wppm_checklist_items_container" style="list-style-type: none; padding-left:0px; margin-top:10px; margin-bottom:10px;"> | |
| 392 | + <?php if(!empty($wppm_subtasks)){ | |
| 393 | + foreach($wppm_subtasks as $subtask){ | |
| 394 | + $wppm_subtask_checked = ($subtask['status']==4) ? 'checked="checked"' : ''; | |
| 395 | + $wppm_subtask_users = !empty($subtask['users']) ? explode(",",$subtask['users']) : array(); | |
| 396 | + $wppm_subtask_can_change_status = ($current_user->has_cap('manage_options') || $wppmfunction->has_permission('change_status',$subtask['id'])) && $task->is_archived!=1; | |
| 397 | + $wppm_subtask_can_delete = ($current_user->has_cap('manage_options') || $wppmfunction->has_permission('delete_task',$subtask['id'])) && $task->is_archived!=1; | |
| 398 | + ?> | |
| 399 | + <li id="wppm_subtask_<?php echo esc_attr($subtask['id']) ?>" class="row wppm_checklist_item" style="margin-bottom:10px;font: 15px 'Helvetica Neue',Helvetica,Arial,sans-serif;"> | |
| 400 | + <div class="col-sm-8"> | |
| 401 | + <input id="wppm_subtask_checkbox_<?php echo esc_attr($subtask['id']) ?>" type="checkbox" onchange="wppm_toggle_subtask_status(<?php echo esc_attr($subtask['id']) ?>,<?php echo esc_attr($task_id) ?>,<?php echo esc_attr($proj_id) ?>,<?php echo esc_attr($wppm_default_task_status) ?>,this.checked)" <?php echo esc_attr($wppm_subtask_checked) ?> <?php echo $wppm_subtask_can_change_status ? '' : 'disabled'; ?> style="margin:5px;"> | |
| 402 | + <label style="padding-top: 5px;font-weight: normal;font: 13px 'Helvetica Neue',Helvetica,Arial,sans-serif;cursor:pointer;" onclick="wppm_open_subtask(<?php echo esc_attr($subtask['id']) ?>,<?php echo esc_attr($proj_id) ?>)"><?php echo esc_html($subtask['task_name']); ?></label> | |
| 403 | + </div> | |
| 404 | + <div class="col-sm-4" style="text-align:right;"> | |
| 405 | + <?php $wppm_subtask_avatar_count = 0; | |
| 406 | + $wppm_subtask_total_users = count( array_filter( $wppm_subtask_users ) ); | |
| 407 | + foreach($wppm_subtask_users as $wppm_subtask_user_id){ | |
| 408 | + if(!$wppm_subtask_user_id) continue; | |
| 409 | + $wppm_subtask_avatar_count++; | |
| 410 | + if($wppm_subtask_avatar_count > 3) break; | |
| 411 | + $wppm_subtask_user_data = get_userdata($wppm_subtask_user_id); | |
| 412 | + $wppm_subtask_user_name = !empty($wppm_subtask_user_data) ? $wppm_subtask_user_data->display_name : ''; | |
| 413 | + echo get_avatar($wppm_subtask_user_id, 20, "mysteryman", $wppm_subtask_user_name, array('extra_attr' => 'title="'.esc_attr($wppm_subtask_user_name).'"')); | |
| 414 | + } | |
| 415 | + $wppm_subtask_more_users = $wppm_subtask_total_users - 3; | |
| 416 | + if ( $wppm_subtask_more_users > 0 ) { | |
| 417 | + ?> | |
| 418 | + <span class="wppm_subtask_more_users" title="<?php echo esc_attr( sprintf( _n( '%d more user assigned', '%d more users assigned', $wppm_subtask_more_users, 'taskbuilder' ), $wppm_subtask_more_users ) ); ?>">+<?php echo esc_html( $wppm_subtask_more_users ); ?></span> | |
| 419 | + <?php | |
| 420 | + } ?> | |
| 421 | + <?php if($wppm_subtask_can_delete){ ?> | |
| 422 | + <a href="#" title="<?php echo esc_attr__('Convert to Task','taskbuilder'); ?>" onclick="wppm_convert_subtask_to_task(<?php echo esc_attr($subtask['id']) ?>,<?php echo esc_attr($task_id) ?>,<?php echo esc_attr($proj_id) ?>);return false;" style="font-size:11px;margin-right:8px;"><?php echo esc_html_e('Convert to Task','taskbuilder');?></a> | |
| 423 | + <span onclick="wppm_delete_subtask(<?php echo esc_attr($subtask['id']) ?>,<?php echo esc_attr($task_id) ?>,<?php echo esc_attr($proj_id) ?>)" style="cursor:pointer;"><img src="<?php echo esc_url( WPPM_PLUGIN_URL . 'asset/images/trash.svg'); ?>" alt="delete"></span> | |
| 424 | + <?php } ?> | |
| 425 | + </div> | |
| 426 | + </li> | |
| 427 | + <?php | |
| 428 | + } | |
| 429 | + } ?> | |
| 430 | + </ul> | |
| 431 | + <?php if($wppm_can_add_subtask){ | |
| 432 | + $wppm_all_task_statuses = $wpdb->get_results("SELECT * FROM {$wpdb->prefix}wppm_task_statuses ORDER BY load_order ASC"); | |
| 433 | + ?> | |
| 434 | + <div class="row"> | |
| 435 | + <div class="col-sm-12" style="padding-top:15px;"> | |
| 436 | + <a class="wppm_add_checklist" id="wppm_add_subtask_btn" onclick="wppm_show_add_subtask()"><?php echo esc_html_e('+ Add subtask','taskbuilder');?></a> | |
| 437 | + </div> | |
| 438 | + </div> | |
| 439 | + <div class="row"> | |
| 440 | + <div class="col-sm-12" style="display:none;" id="wppm_add_subtask_label_container"> | |
| 441 | + <div class="row"> | |
| 442 | + <div class="wppm_task_frm_fields col-sm-6"> | |
| 443 | + <span class="wppm_form_field_label"><b><?php echo esc_html_e('Subtask Name','taskbuilder');?></b> <span style="color:#ff0000;">*</span></span><br> | |
| 444 | + <input type="text" id="wppm_subtask_label" class="form-control" placeholder="<?php echo esc_attr__('Subtask name','taskbuilder') ?>" name="wppm_subtask_label"> | |
| 445 | + </div> | |
| 446 | + <div class="wppm_task_frm_fields col-sm-6"> | |
| 447 | + <span class="wppm_form_field_label"><b><?php echo esc_html_e('Status','taskbuilder');?></b></span><br> | |
| 448 | + <select id="wppm_subtask_status" name="wppm_subtask_status" class="form-control"> | |
| 449 | + <?php if(!empty($wppm_all_task_statuses)){ | |
| 450 | + foreach($wppm_all_task_statuses as $wppm_st){ ?> | |
| 451 | + <option value="<?php echo esc_attr($wppm_st->id) ?>" <?php selected($wppm_st->id, $wppm_default_task_status); ?>><?php echo esc_html($wppm_st->name) ?></option> | |
| 452 | + <?php } | |
| 453 | + } ?> | |
| 454 | + </select> | |
| 455 | + </div> | |
| 456 | + </div> | |
| 457 | + <div class="row"> | |
| 458 | + <div class="wppm_task_frm_fields col-sm-6"> | |
| 459 | + <span class="wppm_form_field_label"><b><?php echo esc_html_e('Due date','taskbuilder');?></b></span><br> | |
| 460 | + <input type="text" id="wppm_subtask_due_date" class="form-control" name="wppm_subtask_due_date" value="" autocomplete="off"> | |
| 461 | + </div> | |
| 462 | + <div class="wppm_task_frm_fields col-sm-6"> | |
| 463 | + <span class="wppm_form_field_label"><b><?php echo esc_html_e('Assignee','taskbuilder');?></b></span><br> | |
| 464 | + <input class="form-control wppm_subtask_assign_users ui-autocomplete-input" name="wppm_subtask_assign_users" type="text" autocomplete="off" placeholder="<?php echo esc_attr__('Search User...','taskbuilder');?>"> | |
| 465 | + </div> | |
| 466 | + </div> | |
| 467 | + <div class="row"> | |
| 468 | + <div class="col-sm-12"> | |
| 469 | + <ul class="wppm_subtask_filter_display_users_container" style="list-style:none;padding-left:0;"></ul> | |
| 470 | + </div> | |
| 471 | + </div> | |
| 472 | + <div class="row"> | |
| 473 | + <div class="wppm_task_frm_fields col-sm-12"> | |
| 474 | + <span class="wppm_form_field_label"><b><?php echo esc_html_e('Description','taskbuilder');?></b></span><br> | |
| 475 | + <textarea id="wppm_subtask_description" name="wppm_subtask_description" class="form-control" rows="3"></textarea> | |
| 476 | + </div> | |
| 477 | + </div> | |
| 478 | + <div class="row" style="padding-top:10px;"> | |
| 479 | + <div class="col-sm-12"> | |
| 480 | + <input type="button" value="<?php echo esc_attr__('Add','taskbuilder') ?>" class="btn btn-success btn-sm" onclick="wppm_add_new_subtask(<?php echo esc_attr($task_id)?>,<?php echo esc_attr($proj_id) ?>)"> | |
| 481 | + <button type="button" class="wppm_reset_btn" onclick="wppm_hide_add_subtask()"><?php echo esc_html_e('Cancel','taskbuilder');?></button> | |
| 482 | + </div> | |
| 483 | + </div> | |
| 484 | + </div> | |
| 485 | + </div> | |
| 486 | + <script type="text/javascript"> | |
| 487 | + jQuery(document).ready(function(){ | |
| 488 | + jQuery('#wppm_subtask_due_date').flatpickr({ | |
| 489 | + enableTime: true, | |
| 490 | + dateFormat: "Y-m-d H:i" | |
| 491 | + }); | |
| 492 | + jQuery('.wppm_subtask_assign_users').autocomplete({ | |
| 493 | + minLength: 1, | |
| 494 | + appendTo: jQuery('.wppm_subtask_assign_users').parent(), | |
| 495 | + source: function(request, response){ | |
| 496 | + jQuery.getJSON(wppm_admin.ajax_url, { | |
| 497 | + action: 'wppm_filter_autocomplete', | |
| 498 | + term: request.term, | |
| 499 | + field: 'task_users_by_project_name', | |
| 500 | + proj_id: <?php echo (int) $task->project; ?> | |
| 501 | + }, function(data){ response(data); }); | |
| 502 | + }, | |
| 503 | + select: function(event, ui){ | |
| 504 | + if(!ui.item.user_id){ return false; } | |
| 505 | + var html_str = '<li class="wppm_filter_display_element" style="list-style:none">' | |
| 506 | + +'<div class="flex-container">' | |
| 507 | + +'<div class="wppm_filter_display_text">' | |
| 508 | + + ui.item.label | |
| 509 | + + '<input type="hidden" name="wppm_subtask_user_names[]" value="'+ui.item.user_id+'">' | |
| 510 | + +'</div>' | |
| 511 | + +'<div class="wppm_filter_display_remove" onclick="wppm_remove_subtask_user(this);"><img src="<?php echo esc_url( WPPM_PLUGIN_URL . 'asset/images/cross.svg'); ?>" alt="delete"></div>' | |
| 512 | + +'</div>' | |
| 513 | + +'</li>'; | |
| 514 | + jQuery('.wppm_subtask_filter_display_users_container').append(html_str); | |
| 515 | + jQuery(this).val(''); | |
| 516 | + return false; | |
| 517 | + } | |
| 518 | + }).focus(function(){ jQuery(this).autocomplete("search", ""); }); | |
| 519 | + }); | |
| 520 | + </script> | |
| 521 | + <?php } ?> | |
| 522 | + </div> | |
| 523 | + <?php } ?> | |
| 346 | 524 | <div class="wppm_task_checklist_container" id="wppm_task_checklist_container"> |
| 347 | 525 | <div id="wppm_checklist_container"> |
| 348 | 526 | <?php |
| 349 | 527 | if(!empty($wppm_checklist)){ |