Changeset 3457050
- Timestamp:
- 02/09/2026 12:31:53 PM (7 weeks ago)
- Location:
- taskbuilder
- Files:
-
- 28 edited
- 1 copied
-
tags/5.0.3 (copied) (copied from taskbuilder/trunk)
-
tags/5.0.3/asset/css/admin.css (modified) (1 diff)
-
tags/5.0.3/includes/admin/projects/open_project/wppm_submit_project_comment.php (modified) (1 diff)
-
tags/5.0.3/includes/admin/projects/open_project/wppm_view_project_tasks.php (modified) (3 diffs)
-
tags/5.0.3/includes/admin/projects/projects_list.php (modified) (9 diffs)
-
tags/5.0.3/includes/admin/projects/wppm_open_project.php (modified) (3 diffs)
-
tags/5.0.3/includes/admin/settings/wppm_get_general_settings.php (modified) (2 diffs)
-
tags/5.0.3/includes/admin/settings/wppm_set_general_settings.php (modified) (1 diff)
-
tags/5.0.3/includes/admin/tasks/open_task/wppm_open_task.php (modified) (3 diffs)
-
tags/5.0.3/includes/admin/tasks/open_task/wppm_submit_task_comment.php (modified) (2 diffs)
-
tags/5.0.3/includes/admin/tasks/wppm_tasks_list.php (modified) (9 diffs)
-
tags/5.0.3/includes/class-wppm-functions.php (modified) (3 diffs)
-
tags/5.0.3/includes/wppm-install.php (modified) (1 diff)
-
tags/5.0.3/readme.txt (modified) (2 diffs)
-
tags/5.0.3/taskbuilder.php (modified) (2 diffs)
-
trunk/asset/css/admin.css (modified) (1 diff)
-
trunk/includes/admin/projects/open_project/wppm_submit_project_comment.php (modified) (1 diff)
-
trunk/includes/admin/projects/open_project/wppm_view_project_tasks.php (modified) (3 diffs)
-
trunk/includes/admin/projects/projects_list.php (modified) (9 diffs)
-
trunk/includes/admin/projects/wppm_open_project.php (modified) (3 diffs)
-
trunk/includes/admin/settings/wppm_get_general_settings.php (modified) (2 diffs)
-
trunk/includes/admin/settings/wppm_set_general_settings.php (modified) (1 diff)
-
trunk/includes/admin/tasks/open_task/wppm_open_task.php (modified) (3 diffs)
-
trunk/includes/admin/tasks/open_task/wppm_submit_task_comment.php (modified) (2 diffs)
-
trunk/includes/admin/tasks/wppm_tasks_list.php (modified) (9 diffs)
-
trunk/includes/class-wppm-functions.php (modified) (3 diffs)
-
trunk/includes/wppm-install.php (modified) (1 diff)
-
trunk/readme.txt (modified) (2 diffs)
-
trunk/taskbuilder.php (modified) (2 diffs)
Legend:
- Unmodified
- Added
- Removed
-
taskbuilder/tags/5.0.3/asset/css/admin.css
r3431170 r3457050 1185 1185 } 1186 1186 1187 #wppm_chevron_sort_down_task_name_img, #wppm_chevron_sort_down_project_list_img, #wppm_chevron_sort_down_status_img, #wppm_chevron_sort_down_priority_img, #wppm_chevron_sort_down_start_date_img, #wppm_chevron_sort_down_end_date_img {1187 #wppm_chevron_sort_down_task_name_img, #wppm_chevron_sort_down_project_list_img, #wppm_chevron_sort_down_status_img, #wppm_chevron_sort_down_priority_img, #wppm_chevron_sort_down_start_date_img, #wppm_chevron_sort_down_end_date_img,#wppm_chevron_sort_down_task_duration_img{ 1188 1188 margin-right:-19px; 1189 1189 } -
taskbuilder/tags/5.0.3/includes/admin/projects/open_project/wppm_submit_project_comment.php
r3210469 r3457050 8 8 } 9 9 $proj_id = isset($_POST['proj_id']) ? intval(sanitize_text_field($_POST['proj_id'])) : '' ; 10 if(!$wppmfunction->has_project_permission('add_proj_comment',$proj_id)){ 11 wp_send_json_error( 'Unauthorised request!', 403 ); 12 } 10 13 $cu_id = $current_user->ID; 14 $project_data = $wppmfunction->get_project($proj_id); 15 if (empty($project_data)) { 16 wp_send_json_error( 'Project not found', 404 ); 17 } 11 18 $comment = isset($_POST['comment_body']) ? ($_POST['comment_body']) : '' ; 12 19 $allowed_tags = array( 'br' => array(), 'abbr' => array('title' => array(),), 'p' => array(), 'strong' => array(), 'a' => array('href' => array(), 'title' => array(), 'rel'=> array(), 'target'=> array()),'em' =>array(),'span' =>array(), 'blockquote'=>array('cite' => array(),),'div' => array('class' => array(),'title' => array(),'style' => array(),),'ul'=>array(),'li'=>array(),'ol'=>array(),'img' => array( 'alt'=> array(),'class' => array(),'height' => array(),'src'=> array(),'width'=> array(),)); 13 $comment_body = wp_kses( htmlspecialchars_decode($comment, ENT_QUOTES),$allowed_tags);20 $comment_body = wp_kses($comment,$allowed_tags); 14 21 $attachments = !empty($_POST['wppm_proj_comment_attachment']) ? $wppmfunction->sanitize_array($_POST['wppm_proj_comment_attachment']) : []; 15 22 $attachment_ids = implode(",",$attachments); -
taskbuilder/tags/5.0.3/includes/admin/projects/open_project/wppm_view_project_tasks.php
r3431170 r3457050 22 22 $wppm_hide_completed_status_task = get_option('wppm_hide_completed_status_task'); 23 23 $wppm_hide_task_statuses_from_frontend = get_option('wppm_hide_task_statuses_from_frontend'); 24 $wppm_deafault_time_duration_task = get_option('wppm_display_time_duration_task'); 24 25 if(!empty($wppm_hide_task_statuses_from_frontend)){ 25 26 $wppm_hide_task_statuses_from_frontend = explode(",",$wppm_hide_task_statuses_from_frontend); … … 346 347 foreach($tasks as $task){ 347 348 $total_tasks++; 349 $wppm_task_duration = $wppmfunction->wppm_get_duration($task->start_date,$task->end_date); 348 350 if((!empty($task)) && $task->status==$status->id){ 349 351 $task_per_status = true; … … 427 429 </div> 428 430 <div> 429 <div class="wppm_task_due_date_grid_view" style="margin-left: 5px;"> 430 <?php $style = ($task->status!=4 && $task->end_date < $current_date) ? "color:#FF0000":"color:#2C3E50"; ?> 431 <small style="<?php echo esc_attr($style); ?>"><?php echo (isset($task_end_date))? esc_html_e($task_end_date,'taskbuilder') :"" ?></small> 432 </div> 431 <?php if($wppm_deafault_time_duration_task==0) { ?> 432 <div class="wppm_task_due_date_grid_view" style="margin-left: 5px;"> 433 <?php $style = ($task->status!=4 && $task->end_date < $current_date) ? "color:#FF0000":"color:#2C3E50"; ?> 434 <small style="<?php echo esc_attr($style); ?>"><?php echo (isset($task_end_date))? esc_html_e($task_end_date,'taskbuilder') :"" ?></small> 435 </div> 436 <?php }elseif( $wppm_deafault_time_duration_task==1){ ?> 437 <div class="wppm_task_due_date_grid_view" style="margin-left: 5px;"> 438 <?php $style = ($task->status!=4 && $task->end_date < $current_date) ? "color:#FF0000":"color:#2C3E50"; ?> 439 <small style="<?php echo esc_attr($style); ?>"><?php echo (isset($wppm_task_duration))? esc_html_e($wppm_task_duration,'taskbuilder') :"" ?></small> 440 </div> 441 <?php } ?> 433 442 <div class="wppm_card_task_users" style="text-align:right;"> 434 443 <?php -
taskbuilder/tags/5.0.3/includes/admin/projects/projects_list.php
r3329577 r3457050 8 8 $appearance_settings = get_option("wppm-ap-project-list"); 9 9 $wppm_date_setting = get_option('wppm_date_setting'); 10 $wppm_deafault_time_duration_project = get_option('wppm_display_time_duration_project'); 10 11 $wppm_current_user_capability = get_user_meta( $current_user->ID, 'wppm_capability', true ); 11 12 $proj_per_page = 20; … … 52 53 ); 53 54 setcookie('wppm_proj_filters',wp_json_encode( $filters ),time() + 3600); 54 if($pl_filters_arr['sort_by']=='status'){ 55 $sort_by = 'proj_statuses.name'; 56 } 57 if($pl_filters_arr['sort_by']=='category'){ 58 $sort_by = 'proj_categories.name'; 59 } 60 if($pl_filters_arr['sort_by']=='start_date'){ 61 $sort_by = 'start_date'; 62 } 63 if($pl_filters_arr['sort_by']=='end_date'){ 64 $sort_by = 'end_date'; 65 } 66 if($sort_by=='category'){ 67 $sort_by = 'proj_categories.name'; 68 } 55 56 $allowed_sort_by = [ 57 'project_name' => 'project_name', 58 'status' => 'proj_statuses.name', 59 'category' => 'proj_categories.name', 60 'start_date' => 'start_date', 61 'end_date' => 'end_date', 62 'TIMESTAMPDIFF(SECOND, start_date, end_date)'=> 'TIMESTAMPDIFF(SECOND, start_date, end_date)' 63 ]; 64 // Resolve sort_by safely 65 $sort_key = isset($pl_filters_arr['sort_by']) 66 ? sanitize_text_field($pl_filters_arr['sort_by']) 67 : 'project_name'; 68 69 $sort_by = $allowed_sort_by[$sort_key] ?? 'project_name'; 70 $order = ( isset($pl_filters_arr['order']) && strtoupper($pl_filters_arr['order']) === 'ASC' ) 71 ? 'ASC' 72 : 'DESC'; 69 73 if($filter_by=='all'){ 70 74 if($wppm_hide_completed_status_proj == 0){ … … 134 138 $no_of_rows = apply_filters('wppm_project_list_no_of_rows',$no_of_rows,$wppm_pl_filter,$search_tag); 135 139 $where = apply_filters('wppm_project_list_query_where',$where, $wppm_pl_filter,$search_tag); 136 $sort_by = esc_sql($sort_by);137 $order = esc_sql($order);138 140 $query .= $where." Group by Project.id ORDER BY $sort_by $order"; 139 141 $no_of_rows .= $where." Group by Project.id) AS Project"; … … 247 249 <img width="16" height="16" onclick="wppm_sort_up_project_list('category','DESC')" style = "<?php echo ($sort_by == 'proj_categories.name' && $order == 'ASC') ? 'display:inline': 'display:none;'?>" class="wppm_chevron_img" id="wppm_chevron_sort_down_project_cat_img" class="wppm_chevron_img" src="<?php echo esc_url( WPPM_PLUGIN_URL . 'asset/images/sort_down_icon.svg'); ?>" alt="chevron_sort_down_icon"> 248 250 </th> 249 <?php if($wppm_default_project_date==1 ){ ?>251 <?php if($wppm_default_project_date==1 && $wppm_deafault_time_duration_project==0){ ?> 250 252 <th class="wppm_table_header" style="background-color:<?php echo esc_attr($appearance_settings['list-header-background-color'])?>"> 251 253 <span id="wppm_project_start_date_th" style="color:<?php echo esc_attr($appearance_settings['list-header-text-color'])?>"><?php echo esc_html_e('Start Date','taskbuilder'); ?></span> … … 258 260 <img width="16" height="16" onclick="wppm_sort_up_project_list('end_date','DESC')" style = "<?php echo ($sort_by == 'end_date' && $order == 'ASC') ? 'display:inline': 'display:none;'?>" class="wppm_chevron_img" id="wppm_chevron_sort_down_project_end_date_img" class="wppm_chevron_img" src="<?php echo esc_url( WPPM_PLUGIN_URL . 'asset/images/sort_down_icon.svg'); ?>" alt="chevron_sort_down_icon"> 259 261 </th> 260 <?php } ?> 262 <?php } 263 if( $wppm_deafault_time_duration_project==1){ ?> 264 <th class="wppm_table_header" style="background-color:<?php echo esc_attr($appearance_settings['list-header-background-color'])?>"> 265 <span id="wppm_project_time_duration_th" style="color:<?php echo esc_attr($appearance_settings['list-header-text-color'])?>"><?php echo esc_html_e('Duration','taskbuilder'); ?></span> 266 <img width="16" height="16" onclick="wppm_sort_up_project_list('TIMESTAMPDIFF(SECOND, start_date, end_date)','ASC')" style = "<?php echo ($sort_by == 'TIMESTAMPDIFF(SECOND, start_date, end_date)' && $order == 'DESC') ? 'display:inline': 'display:none;'?>" class="wppm_chevron_img" id="wppm_chevron_sort_up_project_time_duration_img" src="<?php echo esc_url( WPPM_PLUGIN_URL . 'asset/images/sort_up_icon.svg'); ?>" alt="chevron_sort_up_icon"> 267 <img width="16" height="16" onclick="wppm_sort_up_project_list('TIMESTAMPDIFF(SECOND, start_date, end_date)','DESC')" style = "<?php echo ($sort_by == 'TIMESTAMPDIFF(SECOND, start_date, end_date)' && $order == 'ASC') ? 'display:inline': 'display:none;'?>" class="wppm_chevron_img" id="wppm_chevron_sort_down_project_time_duration_img" class="wppm_chevron_img" src="<?php echo esc_url( WPPM_PLUGIN_URL . 'asset/images/sort_down_icon.svg'); ?>" alt="chevron_sort_down_icon"> 268 </th> 269 <?php }?> 261 270 <th class="wppm_table_header" style="background-color:<?php echo esc_attr($appearance_settings['list-header-background-color'])?>"><span style="color:<?php echo esc_attr($appearance_settings['list-header-text-color'])?>"><?php echo esc_html_e('No. of tasks','taskbuilder'); ?></span></th> 262 271 <th class="wppm_table_header" style="background-color:<?php echo esc_attr($appearance_settings['list-header-background-color'])?>"></th> … … 270 279 $total_projects++; 271 280 $proejctdata = $wppmfunction->get_project($project->id); 281 $wppm_proj_duration = $wppmfunction->wppm_get_duration($project->start_date,$project->end_date); 272 282 $pstatus= esc_sql($project->status); 273 283 $status = $wpdb->get_row( "SELECT * FROM {$wpdb->prefix}wppm_project_statuses where id='$pstatus'" ); … … 420 430 </td> 421 431 <td onmouseover="link=true;" class="wppm_table_td"><?php echo isset($category) ? esc_html_e($category,'taskbuilder'): "" ?></td> 422 <?php if($wppm_default_project_date==1){ 423 ?> 432 <?php if($wppm_default_project_date==1 && $wppm_deafault_time_duration_project==0){ ?> 424 433 <td onmouseover="link=true;" class="wppm_table_td"><?php echo isset($proj_start_date) ? esc_html($proj_start_date): "" ?></td> 425 434 <?php … … 430 439 } ?> 431 440 <td onmouseover="link=true;" class="wppm_table_td"><span style="<?php echo esc_attr($style); ?>"><?php echo isset($proj_end_date) ? esc_html($proj_end_date):"" ?></span></td> 441 <?php } ?> 442 <?php if($wppm_deafault_time_duration_project==1){ ?> 443 <?php 444 if(!empty($proj_end_date) && $project->status!=4 && $proj_end_date < $current_date && ($proj_end_date != '0000-00-00 00:00:00' && $proj_end_date != '00-00-0000 00:00:00' && $proj_end_date != '00-00-0000' && $proj_end_date != '0000-00-00')) { 445 $style = "color:#FF0000"; 446 } else { 447 $style = "color:#2C3E50"; 448 } ?> 449 <td onmouseover="link=true;" class="wppm_table_td"><span style="<?php echo esc_attr($style); ?>"><?php echo isset($wppm_proj_duration) ? esc_html($wppm_proj_duration):"" ?></span></td> 432 450 <?php } ?> 433 451 <td onmouseover="link=true;" class="wppm_table_td"><?php echo isset($no_of_tasks) ? esc_html($no_of_tasks):"" ?></td> … … 524 542 jQuery('#wppm_chevron_sort_down_project_end_date_img').hide(); 525 543 }); 544 jQuery("#wppm_project_time_duration_th").hover(function(){ 545 jQuery('#wppm_chevron_sort_up_project_time_duration_img').show(); 546 jQuery('#wppm_chevron_sort_down_project_time_duration_img').hide(); 547 }); 526 548 jQuery(".wppm_delete_action").on("click", function(e){ 527 549 e.preventDefault(); -
taskbuilder/tags/5.0.3/includes/admin/projects/wppm_open_project.php
r3358435 r3457050 15 15 $wppm_proj_hide_comment_section = get_option('wppm_proj_hide_comment_section'); 16 16 $wppm_current_user_capability = get_user_meta( $current_user->ID, 'wppm_capability', true ); 17 $wppm_deafault_time_duration_project = get_option('wppm_display_time_duration_project'); 17 18 $current_date = date('Y-m-d'); 18 19 $id = isset($_POST) && isset($_POST['id']) ? intval(sanitize_text_field($_POST['id'])) : 0; … … 199 200 </div> 200 201 </div> 201 <?php if($wppm_default_project_date==1 ) { ?>202 <?php if($wppm_default_project_date==1 && $wppm_deafault_time_duration_project==0) { ?> 202 203 <div class="row"> 203 204 <div class="col-sm-3"> … … 221 222 <input type="hidden" name="wppm_edit_pend_date_ajax_nonce" id="wppm_edit_pend_date_ajax_nonce" value="<?php echo esc_attr( wp_create_nonce( 'wppm_set_change_proj_end_date' ) ); ?>"> 222 223 </div> 223 <?php } ?> 224 <?php } if($wppm_deafault_time_duration_project==1){ 225 $wppm_proj_duration = $wppmfunction->wppm_get_duration($project->start_date,$project->end_date); 226 $pstatus = isset($project->status) ? $project->status :""; 227 $style = (!empty($proj_end_date) && $pstatus!=4 && $proj_end_date < $current_date && ($proj_end_date != '0000-00-00 00:00:00' && $proj_end_date != '00-00-0000 00:00:00' && $proj_end_date != '00-00-0000' && $proj_end_date != '0000-00-00')) ? "color:#FF0000":"color:#2C3E50"; ?> 228 <div class="row"> 229 <div class="col-sm-3"> 230 <span class="wppm_project_details_label"><?php echo esc_html_e('Project Duration:','taskbuilder');?></span> 231 </div> 232 <div class="col-sm-9"> 233 <span class="wppm_project_details" id="wppm_edit_proj_duration" style="<?php echo esc_attr($style); ?>"><?php echo (isset($wppm_proj_duration))? esc_html($wppm_proj_duration): "" ?></span> 234 </div> 235 </div> <?php 236 }?> 224 237 <div class="row"> 225 238 <div class="col-sm-3"> -
taskbuilder/tags/5.0.3/includes/admin/settings/wppm_get_general_settings.php
r3342822 r3457050 26 26 $wppm_proj_hide_comment_section = get_option('wppm_proj_hide_comment_section'); 27 27 $wppm_task_hide_comment_section = get_option('wppm_task_hide_comment_section'); 28 $wppm_deafault_time_duration_project = get_option('wppm_display_time_duration_project'); 29 $wppm_deafault_time_duration_task = get_option('wppm_display_time_duration_task'); 28 30 ?> 29 31 <form id="wppm_frm_general_settings" method="post" action="javascript:wppm_set_general_settings();"> … … 40 42 <input type="radio" name="wppm_task_list_view" value="0" <?php echo ((esc_attr($wppm_default_task_list_view))==0)?'checked="checked"':'';?>> 41 43 <span style="padding-left: 10px;"><?php echo esc_html_e('Card View','taskbuilder');?></span> 44 <hr> 45 <span> 46 <label><?php echo esc_html_e('Show project duration instead of start and end dates in the project list.','taskbuilder');?></label> 47 </span><br> 48 <p class="help-block"><?php echo esc_html_e('Default show/hide time duration of project.','taskbuilder');?></p> 49 <input type="radio" name="wppm_display_time_duration_project" style="margin-top: 0px;" value="1" <?php echo ((esc_attr($wppm_deafault_time_duration_project))==1) ?'checked="checked"':'';?>> 50 <span style="padding-left: 10px;"><?php echo esc_html_e('Show','taskbuilder');?></span> 51 <br> 52 <input type="radio" name="wppm_display_time_duration_project" value="0" <?php echo ((esc_attr($wppm_deafault_time_duration_project))==0)?'checked="checked"':'';?>> 53 <span style="padding-left: 10px;"><?php echo esc_html_e('Hide','taskbuilder');?></span> 54 <hr> 55 <span> 56 <label><?php echo esc_html_e('Show task duration instead of start and end dates in the task list.','taskbuilder');?></label> 57 </span><br> 58 <p class="help-block"><?php echo esc_html_e('Default show/hide time duration of task.','taskbuilder');?></p> 59 <input type="radio" name="wppm_display_time_duration_task" style="margin-top: 0px;" value="1" <?php echo ((esc_attr($wppm_deafault_time_duration_task))==1) ?'checked="checked"':'';?>> 60 <span style="padding-left: 10px;"><?php echo esc_html_e('Show','taskbuilder');?></span> 61 <br> 62 <input type="radio" name="wppm_display_time_duration_task" value="0" <?php echo ((esc_attr($wppm_deafault_time_duration_task))==0)?'checked="checked"':'';?>> 63 <span style="padding-left: 10px;"><?php echo esc_html_e('Hide','taskbuilder');?></span> 42 64 <hr> 43 65 <span> -
taskbuilder/tags/5.0.3/includes/admin/settings/wppm_set_general_settings.php
r3329577 r3457050 13 13 $wppm_task_list_view = isset($_POST) && isset(($_POST['wppm_task_list_view'])) ? sanitize_text_field($_POST['wppm_task_list_view']) : ''; 14 14 update_option('wppm_default_task_list_view',$wppm_task_list_view); 15 $wppm_display_time_duration_project = isset($_POST) && isset(($_POST['wppm_display_time_duration_project'])) ? sanitize_text_field($_POST['wppm_display_time_duration_project']) : '0'; 16 update_option('wppm_display_time_duration_project',$wppm_display_time_duration_project); 17 $wppm_display_time_duration_task = isset($_POST) && isset(($_POST['wppm_display_time_duration_task'])) ? sanitize_text_field($_POST['wppm_display_time_duration_task']) : '0'; 18 update_option('wppm_display_time_duration_task',$wppm_display_time_duration_task); 15 19 $wppm_project_time = isset($_POST) && isset(($_POST['wppm_project_time'])) ? sanitize_text_field($_POST['wppm_project_time']) : '1'; 16 20 update_option('wppm_project_time',$wppm_project_time); -
taskbuilder/tags/5.0.3/includes/admin/tasks/open_task/wppm_open_task.php
r3431170 r3457050 16 16 $wppm_date_setting = get_option('wppm_date_setting'); 17 17 $wppm_task_hide_comment_section = get_option('wppm_task_hide_comment_section'); 18 $wppm_deafault_time_duration_task = get_option('wppm_display_time_duration_task'); 18 19 $url_auth = false; 19 20 $auth_id = $wppmfunction->wppm_get_auth_code($id); … … 278 279 </div> 279 280 </div> 280 <?php if($wppm_default_task_date == 1 ){ ?>281 <?php if($wppm_default_task_date == 1 && $wppm_deafault_time_duration_task==0){ ?> 281 282 <div class="row"> 282 283 <div class="col-sm-3"> … … 298 299 <input type="hidden" name="wppm_edit_tend_date_ajax_nonce" id="wppm_edit_tend_date_ajax_nonce" value="<?php echo esc_attr( wp_create_nonce( 'wppm_set_change_task_end_date' ) ); ?>"> 299 300 </div> 300 <?php } ?> 301 <?php } 302 if($wppm_deafault_time_duration_task==1){ 303 $wppm_task_duration = $wppmfunction->wppm_get_duration($task->start_date,$task->end_date); 304 $tstatus = isset($task->status) ? $task->status :""; 305 $style = (!empty($task->end_date) && $tstatus!=4 && $task->end_date < $current_date && ($task->end_date != '0000-00-00 00:00:00' && $task->end_date != '00-00-0000 00:00:00' && $task->end_date != '00-00-0000' && $task->end_date != '0000-00-00')) ? "color:#FF1111":"color:#2C3E51"; ?> 306 <div class="row"> 307 <div class="col-sm-3"> 308 <span class="wppm_task_details_label"><?php echo esc_html_e('Task Duration:','taskbuilder');?></span> 309 </div> 310 <div class="col-sm-9"> 311 <span class="wppm_task_details" id="wppm_edit_task_duration" style="<?php echo esc_attr($style); ?>"><?php echo (isset($wppm_task_duration))? esc_html($wppm_task_duration): "" ?></span> 312 </div> 313 </div> <?php 314 }?> 301 315 <div class="row"> 302 316 <div class="col-sm-3"> -
taskbuilder/tags/5.0.3/includes/admin/tasks/open_task/wppm_submit_task_comment.php
r3210469 r3457050 8 8 } 9 9 $task_id = isset($_POST['task_id']) ? intval(sanitize_text_field($_POST['task_id'])) : '' ; 10 if(!$wppmfunction->has_permission('add_task_comment',$task_id)){ exit; } 10 11 $comment = isset($_POST['comment_body']) ? ($_POST['comment_body']) : '' ; 11 12 $allowed_tags = array( 'br' => array(), 'abbr' => array('title' => array(),), 'p' => array(), 'strong' => array(), 'a' => array('href' => array(), 'title' => array(), 'rel'=> array(), 'target'=> array()),'em' =>array(),'span' =>array(), 'blockquote'=>array('cite' => array(),),'div' => array('class' => array(),'title' => array(),'style' => array(),),'ul'=>array(),'li'=>array(),'ol'=>array(),'img' => array( 'alt'=> array(),'class' => array(),'height' => array(),'src'=> array(),'width'=> array(),)); 12 $comment_body = wp_kses( htmlspecialchars_decode($comment, ENT_QUOTES),$allowed_tags);13 $comment_body = wp_kses($comment,$allowed_tags); 13 14 $attachments = !empty($_POST['wppm_comment_attachment']) ? $wppmfunction->sanitize_array($_POST['wppm_comment_attachment']) : []; 14 15 $attachment_ids = implode(",",$attachments); … … 30 31 $wpdb->insert($wpdb->prefix . 'wppm_task_comment_meta',$task_log_values); 31 32 do_action('wppm_after_submit_task_comment', $task_id,$comment_id); 32 -
taskbuilder/tags/5.0.3/includes/admin/tasks/wppm_tasks_list.php
r3431170 r3457050 20 20 $wppm_hide_completed_status_task = get_option('wppm_hide_completed_status_task'); 21 21 $wppm_hide_task_statuses_from_frontend = get_option('wppm_hide_task_statuses_from_frontend'); 22 $wppm_deafault_time_duration_task = get_option('wppm_display_time_duration_task'); 22 23 if(!empty($wppm_hide_task_statuses_from_frontend)){ 23 24 $wppm_hide_task_statuses_from_frontend = explode(",",$wppm_hide_task_statuses_from_frontend); … … 101 102 setcookie('wppm_filters',wp_json_encode( $filters ),time() + 3600); 102 103 103 if($tl_filters_arr['sort_by']=='project'){ 104 $sort_by = 'proj.project_name'; 105 } 106 if($tl_filters_arr['sort_by']=='start_date'){ 107 $sort_by = 'Task.start_date'; 108 } 109 if($tl_filters_arr['sort_by']=='end_date'){ 110 $sort_by = 'Task.end_date'; 111 } 112 if($tl_filters_arr['sort_by']=='status'){ 113 $sort_by = 'task_statuses.name'; 114 } 115 if($tl_filters_arr['sort_by']=='priority'){ 116 $sort_by='task_priorities.name'; 117 } 104 // Allowed sort columns 105 $allowed_sort_by = [ 106 'project' => 'proj.project_name', 107 'status' => 'task_statuses.name', 108 'priority' => 'task_priorities.name', 109 'start_date' => 'Task.start_date', 110 'end_date' => 'Task.end_date', 111 'TIMESTAMPDIFF(SECOND, Task.start_date, Task.end_date)' => 'TIMESTAMPDIFF(SECOND, Task.start_date, Task.end_date)', 112 ]; 113 114 // Resolve sort_by safely 115 $sort_key = isset($_POST['sort_by']) 116 ? sanitize_text_field($_POST['sort_by']) 117 : ($tl_filters_arr['sort_by'] ?? 'task_name'); 118 119 $sort_by = $allowed_sort_by[$sort_key] ?? 'task_name'; 120 121 // Resolve order safely 122 $order = (isset($_POST['order']) && strtoupper($_POST['order']) === 'ASC') 123 ? 'ASC' 124 : 'DESC'; 125 118 126 if($filter_by=='all'){ 119 127 if($wppm_hide_completed_status_task == 0){ … … 228 236 $no_of_rows = apply_filters('wppm_task_list_no_of_rows',$no_of_rows,$wppm_tl_filter,$search_tag_text); 229 237 $totalrows = $wpdb->get_var($no_of_rows); 230 $sort_by = esc_sql($sort_by);231 $order = esc_sql($order);232 238 $query .= $where." Group by Task.id ORDER BY ".$sort_by." ".$order.""; 233 239 $query = apply_filters('wppm_task_list_query',$query); … … 399 405 <img width="16" height="16" style = "<?php echo ($sort_by == ('task_priorities.name') && $order == 'ASC') ? 'display:inline': 'display:none;'?>" onclick="wppm_sort_up_task_list('priority','DESC','<?php echo esc_attr($page); ?>')" class="wppm_chevron_img" id="wppm_chevron_sort_down_priority_img" src="<?php echo esc_url( WPPM_PLUGIN_URL . 'asset/images/sort_down_icon.svg'); ?>" alt="chevron_sort_down_icon"> 400 406 </th> 401 <?php if($wppm_default_task_date == 1 ) { ?>407 <?php if($wppm_default_task_date == 1 && $wppm_deafault_time_duration_task==0) { ?> 402 408 <th class="wppm_table_header" style="background-color:<?php echo esc_attr($appearance_settings['list-header-background-color'])?>"> 403 409 <span id="wppm_start_date_th" style="color:<?php echo esc_attr($appearance_settings['list-header-text-color'])?>"><?php echo esc_html_e('Start date','taskbuilder'); ?></span> … … 410 416 <img width="16" height="16" style = "<?php echo ($sort_by == 'Task.end_date' && $order == 'ASC') ? 'display:inline': 'display:none;'?>" onclick="wppm_sort_up_task_list('end_date','DESC','<?php echo esc_attr($page); ?>')" class="wppm_chevron_img" id="wppm_chevron_sort_down_end_date_img" src="<?php echo esc_url( WPPM_PLUGIN_URL . 'asset/images/sort_down_icon.svg'); ?>" alt="chevron_sort_down_icon"> 411 417 </th> 412 <?php } ?> 418 <?php } 419 if( $wppm_deafault_time_duration_task==1){ ?> 420 <th class="wppm_table_header" style="background-color:<?php echo esc_attr($appearance_settings['list-header-background-color'])?>"> 421 <span id="wppm_task_duration_th" style="color:<?php echo esc_attr($appearance_settings['list-header-text-color'])?>"><?php echo esc_html_e('Duration','taskbuilder'); ?></span> 422 <img width="16" height="16" style = "<?php echo ($sort_by == 'TIMESTAMPDIFF(SECOND, Task.start_date, Task.end_date)' && $order == 'DESC') ? 'display:inline': 'display:none;'?>" onclick="wppm_sort_up_task_list('TIMESTAMPDIFF(SECOND, Task.start_date, Task.end_date)','ASC','<?php echo esc_attr($page); ?>')" class="wppm_chevron_img" id="wppm_chevron_sort_up_task_duration_img" src="<?php echo esc_url( WPPM_PLUGIN_URL . 'asset/images/sort_up_icon.svg'); ?>" alt="chevron_sort_up_icon"> 423 <img width="16" height="16" style = "<?php echo ($sort_by == 'TIMESTAMPDIFF(SECOND, Task.start_date, Task.end_date)' && $order == 'ASC') ? 'display:inline': 'display:none;'?>" onclick="wppm_sort_up_task_list('TIMESTAMPDIFF(SECOND, Task.start_date, Task.end_date)','DESC','<?php echo esc_attr($page); ?>')" class="wppm_chevron_img" id="wppm_chevron_sort_down_task_duration_img" src="<?php echo esc_url( WPPM_PLUGIN_URL . 'asset/images/sort_down_icon.svg'); ?>" alt="chevron_sort_down_icon"> 424 </th> 425 <?php }?> 413 426 <th class="wppm_table_header" style="background-color:<?php echo esc_attr($appearance_settings['list-header-background-color'])?>"> 414 427 <span style="color:<?php echo esc_attr($appearance_settings['list-header-text-color'])?>"><?php echo esc_html_e('Assign To','taskbuilder'); ?></span> … … 426 439 foreach($wppm_task_fillter as $task) { 427 440 $task_id = esc_sql($task->id); 441 $wppm_task_duration = $wppmfunction->wppm_get_duration($task->start_date,$task->end_date); 428 442 $checklists = $wpdb->get_results( "SELECT * FROM {$wpdb->prefix}wppm_checklist where task_id = '$task_id'" ); 429 443 if(!empty($task)){ … … 569 583 <?php } ?> 570 584 </td> 571 <?php if($wppm_default_task_date == 1 ) { ?>585 <?php if($wppm_default_task_date == 1 && $wppm_deafault_time_duration_task==0) { ?> 572 586 <td onmouseover="link=true;"> 573 587 <?php if(!empty($task_start_date)){ ?> … … 583 597 <span style="<?php echo esc_attr($style); ?>"><?php echo esc_html_e($task_end_date,'taskbuilder');?></span> 584 598 </td> 599 <?php } ?> 600 <?php if($wppm_deafault_time_duration_task==1){ ?> 601 <?php 602 if(!empty($task_end_date) && ($task->status!=4 && $task_end_date < $current_date && $task_end_date != '0000-00-00 00:00:00' && $task_end_date != '00-00-0000 00:00:00' && $task_end_date != '00-00-0000' && $task_end_date != '0000-00-00')){ 603 $style = "color:#FF2222"; 604 } else { 605 $style = "color:#2C3E50"; 606 } ?> 607 <td onmouseover="link=true;" class="wppm_table_td"><span style="<?php echo esc_attr($style); ?>"><?php echo isset($wppm_task_duration) ? esc_html($wppm_task_duration):"" ?></span></td> 585 608 <?php } ?> 586 609 </td> … … 762 785 jQuery('#wppm_chevron_sort_down_end_date_img').hide(); 763 786 }); 787 jQuery("#wppm_task_duration_th").hover(function(){ 788 jQuery('#wppm_chevron_sort_up_task_duration_img').show(); 789 jQuery('#wppm_chevron_sort_down_task_duration_img').hide(); 790 }); 764 791 765 792 }) -
taskbuilder/tags/5.0.3/includes/class-wppm-functions.php
r3312666 r3457050 259 259 case 'change_status': 260 260 case 'view_task': 261 ((!empty($co_worker_array)) && (in_array($current_user->ID,$co_worker_array )) )|| ($current_user->ID == $task_data['created_by']) || $public_proj_meta==1 || ($flag==true) ? $response = true: $response = false; 261 case 'add_task_comment': 262 ((!empty($co_worker_array)) && (in_array($current_user->ID,$co_worker_array )) )|| ($current_user->ID == $task_data['created_by']) || $public_proj_meta==1 || ($flag==true) || $current_user->has_cap('manage_options') ? $response = true: $response = false; 262 263 break; 263 264 case 'change_task_details': … … 384 385 $co_worker_array = explode(",",(string)$co_worker); 385 386 } 387 if(!empty($project_id)){ 388 $public_proj_meta = $wpdb->get_var( "SELECT meta_value FROM {$wpdb->prefix}wppm_project_meta where project_id= '$project_id' AND meta_key='public_project'"); 389 }else{ 390 $public_proj_meta =""; 391 } 392 386 393 switch ($permission) { 387 394 case 'view_project': 388 395 ((!empty($co_worker_array)) && (in_array($current_user->ID,$co_worker_array )) )? $response = true: $response = false; 396 break; 397 case 'add_proj_comment': 398 ( ((!empty($co_worker_array)) && (in_array($current_user->ID,$co_worker_array )) ) || ( $public_proj_meta == '1') || $current_user->has_cap('manage_options')|| $wppm_current_user_capability == 'wppm_admin' || $wppm_current_user_capability == 'wppm_manager')? $response = true: $response = false; 389 399 break; 390 400 case 'change_project_status': … … 1128 1138 <?php 1129 1139 } 1140 1141 public function wppm_get_duration($start_date, $end_date){ 1142 if ( empty($start_date) || empty($end_date) || $start_date=='0000-00-00 00:00:00' || $end_date =='0000-00-00 00:00:00') { 1143 return ''; 1144 } 1145 1146 $start_ts = strtotime($start_date); 1147 $end_ts = strtotime($end_date); 1148 1149 if ( $end_ts <= $start_ts ) { 1150 return '0 min'; 1151 } 1152 1153 $diff = $end_ts - $start_ts; 1154 1155 $days = floor($diff / 86400); 1156 $hours = floor(($diff % 86400) / 3600); 1157 $minutes = floor(($diff % 3600) / 60); 1158 1159 $duration = []; 1160 1161 if ($days > 0) $duration[] = $days . 'd'; 1162 if ($hours > 0) $duration[] = $hours . 'h'; 1163 if ($minutes > 0 || empty($duration)) $duration[] = $minutes . 'm'; 1164 1165 return implode(' ', $duration); 1166 1167 } 1130 1168 } 1131 1169 endif; -
taskbuilder/tags/5.0.3/includes/wppm-install.php
r3431170 r3457050 502 502 } 503 503 } 504 if($installed_version < '5.0.3'){ 505 update_option('wppm_display_time_duration_project',0); 506 update_option('wppm_display_time_duration_task',0); 507 508 } 504 509 // update wppm_version option to plugin version 505 510 update_option( 'wppm_version', WPPM_VERSION ); -
taskbuilder/tags/5.0.3/readme.txt
r3431170 r3457050 1 === Taskbuilder - Wordpress Project Management & Task Management ===1 === Taskbuilder - Wordpress Project Management & Task Management,kanban view === 2 2 Contributors: taskbuilder 3 3 Donate link: https://taskbuilder.net 4 Tags: project ,project management,task management,task manager,Kanban4 Tags: project management,task management,task manager,booking,calendar 5 5 Requires at least: 4.4 6 6 Tested up to: 6.9 7 Stable tag: 5.0. 27 Stable tag: 5.0.3 8 8 License: GPL v3 9 9 … … 120 120 121 121 == Changelog == 122 = V 5.0.3(Feb 9,2026) = 123 * Fix: Vulnerability: Missing Authorization to Authenticated (Subscriber+) Arbitrary Project/Task Comment Creation. 124 * Fix: Vulnerability: Authenticated (Subscriber+) SQL Injection via 'order' and 'sort_by' Parameters. 125 * New: Setting to set Duration in days,months,hours instead start and end date for project. 126 * New: Setting to set Duration in days,months,hours instead start and end date for task. 127 122 128 = V 5.0.2(January 2,2026) = 123 129 * New (Pro feature): Email Piping add-on. Email Piping is a feature that lets users create project tasks simply by sending emails. -
taskbuilder/tags/5.0.3/taskbuilder.php
r3450259 r3457050 4 4 * Plugin URI: https://taskbuilder.net/ 5 5 * Description: Wordpress Project Management & Task Management plugin. Easy to keep track of projects & tasks! 6 * Version: 5.0. 26 * Version: 5.0.3 7 7 * Author: Taskbuilder Team 8 8 * Author URI: https://taskbuilder.net/ … … 20 20 21 21 final class WP_Taskbuilder { 22 public $version = '5.0. 2';22 public $version = '5.0.3'; 23 23 public function __construct() { 24 24 // define global constants -
taskbuilder/trunk/asset/css/admin.css
r3431170 r3457050 1185 1185 } 1186 1186 1187 #wppm_chevron_sort_down_task_name_img, #wppm_chevron_sort_down_project_list_img, #wppm_chevron_sort_down_status_img, #wppm_chevron_sort_down_priority_img, #wppm_chevron_sort_down_start_date_img, #wppm_chevron_sort_down_end_date_img {1187 #wppm_chevron_sort_down_task_name_img, #wppm_chevron_sort_down_project_list_img, #wppm_chevron_sort_down_status_img, #wppm_chevron_sort_down_priority_img, #wppm_chevron_sort_down_start_date_img, #wppm_chevron_sort_down_end_date_img,#wppm_chevron_sort_down_task_duration_img{ 1188 1188 margin-right:-19px; 1189 1189 } -
taskbuilder/trunk/includes/admin/projects/open_project/wppm_submit_project_comment.php
r3210469 r3457050 8 8 } 9 9 $proj_id = isset($_POST['proj_id']) ? intval(sanitize_text_field($_POST['proj_id'])) : '' ; 10 if(!$wppmfunction->has_project_permission('add_proj_comment',$proj_id)){ 11 wp_send_json_error( 'Unauthorised request!', 403 ); 12 } 10 13 $cu_id = $current_user->ID; 14 $project_data = $wppmfunction->get_project($proj_id); 15 if (empty($project_data)) { 16 wp_send_json_error( 'Project not found', 404 ); 17 } 11 18 $comment = isset($_POST['comment_body']) ? ($_POST['comment_body']) : '' ; 12 19 $allowed_tags = array( 'br' => array(), 'abbr' => array('title' => array(),), 'p' => array(), 'strong' => array(), 'a' => array('href' => array(), 'title' => array(), 'rel'=> array(), 'target'=> array()),'em' =>array(),'span' =>array(), 'blockquote'=>array('cite' => array(),),'div' => array('class' => array(),'title' => array(),'style' => array(),),'ul'=>array(),'li'=>array(),'ol'=>array(),'img' => array( 'alt'=> array(),'class' => array(),'height' => array(),'src'=> array(),'width'=> array(),)); 13 $comment_body = wp_kses( htmlspecialchars_decode($comment, ENT_QUOTES),$allowed_tags);20 $comment_body = wp_kses($comment,$allowed_tags); 14 21 $attachments = !empty($_POST['wppm_proj_comment_attachment']) ? $wppmfunction->sanitize_array($_POST['wppm_proj_comment_attachment']) : []; 15 22 $attachment_ids = implode(",",$attachments); -
taskbuilder/trunk/includes/admin/projects/open_project/wppm_view_project_tasks.php
r3431170 r3457050 22 22 $wppm_hide_completed_status_task = get_option('wppm_hide_completed_status_task'); 23 23 $wppm_hide_task_statuses_from_frontend = get_option('wppm_hide_task_statuses_from_frontend'); 24 $wppm_deafault_time_duration_task = get_option('wppm_display_time_duration_task'); 24 25 if(!empty($wppm_hide_task_statuses_from_frontend)){ 25 26 $wppm_hide_task_statuses_from_frontend = explode(",",$wppm_hide_task_statuses_from_frontend); … … 346 347 foreach($tasks as $task){ 347 348 $total_tasks++; 349 $wppm_task_duration = $wppmfunction->wppm_get_duration($task->start_date,$task->end_date); 348 350 if((!empty($task)) && $task->status==$status->id){ 349 351 $task_per_status = true; … … 427 429 </div> 428 430 <div> 429 <div class="wppm_task_due_date_grid_view" style="margin-left: 5px;"> 430 <?php $style = ($task->status!=4 && $task->end_date < $current_date) ? "color:#FF0000":"color:#2C3E50"; ?> 431 <small style="<?php echo esc_attr($style); ?>"><?php echo (isset($task_end_date))? esc_html_e($task_end_date,'taskbuilder') :"" ?></small> 432 </div> 431 <?php if($wppm_deafault_time_duration_task==0) { ?> 432 <div class="wppm_task_due_date_grid_view" style="margin-left: 5px;"> 433 <?php $style = ($task->status!=4 && $task->end_date < $current_date) ? "color:#FF0000":"color:#2C3E50"; ?> 434 <small style="<?php echo esc_attr($style); ?>"><?php echo (isset($task_end_date))? esc_html_e($task_end_date,'taskbuilder') :"" ?></small> 435 </div> 436 <?php }elseif( $wppm_deafault_time_duration_task==1){ ?> 437 <div class="wppm_task_due_date_grid_view" style="margin-left: 5px;"> 438 <?php $style = ($task->status!=4 && $task->end_date < $current_date) ? "color:#FF0000":"color:#2C3E50"; ?> 439 <small style="<?php echo esc_attr($style); ?>"><?php echo (isset($wppm_task_duration))? esc_html_e($wppm_task_duration,'taskbuilder') :"" ?></small> 440 </div> 441 <?php } ?> 433 442 <div class="wppm_card_task_users" style="text-align:right;"> 434 443 <?php -
taskbuilder/trunk/includes/admin/projects/projects_list.php
r3329577 r3457050 8 8 $appearance_settings = get_option("wppm-ap-project-list"); 9 9 $wppm_date_setting = get_option('wppm_date_setting'); 10 $wppm_deafault_time_duration_project = get_option('wppm_display_time_duration_project'); 10 11 $wppm_current_user_capability = get_user_meta( $current_user->ID, 'wppm_capability', true ); 11 12 $proj_per_page = 20; … … 52 53 ); 53 54 setcookie('wppm_proj_filters',wp_json_encode( $filters ),time() + 3600); 54 if($pl_filters_arr['sort_by']=='status'){ 55 $sort_by = 'proj_statuses.name'; 56 } 57 if($pl_filters_arr['sort_by']=='category'){ 58 $sort_by = 'proj_categories.name'; 59 } 60 if($pl_filters_arr['sort_by']=='start_date'){ 61 $sort_by = 'start_date'; 62 } 63 if($pl_filters_arr['sort_by']=='end_date'){ 64 $sort_by = 'end_date'; 65 } 66 if($sort_by=='category'){ 67 $sort_by = 'proj_categories.name'; 68 } 55 56 $allowed_sort_by = [ 57 'project_name' => 'project_name', 58 'status' => 'proj_statuses.name', 59 'category' => 'proj_categories.name', 60 'start_date' => 'start_date', 61 'end_date' => 'end_date', 62 'TIMESTAMPDIFF(SECOND, start_date, end_date)'=> 'TIMESTAMPDIFF(SECOND, start_date, end_date)' 63 ]; 64 // Resolve sort_by safely 65 $sort_key = isset($pl_filters_arr['sort_by']) 66 ? sanitize_text_field($pl_filters_arr['sort_by']) 67 : 'project_name'; 68 69 $sort_by = $allowed_sort_by[$sort_key] ?? 'project_name'; 70 $order = ( isset($pl_filters_arr['order']) && strtoupper($pl_filters_arr['order']) === 'ASC' ) 71 ? 'ASC' 72 : 'DESC'; 69 73 if($filter_by=='all'){ 70 74 if($wppm_hide_completed_status_proj == 0){ … … 134 138 $no_of_rows = apply_filters('wppm_project_list_no_of_rows',$no_of_rows,$wppm_pl_filter,$search_tag); 135 139 $where = apply_filters('wppm_project_list_query_where',$where, $wppm_pl_filter,$search_tag); 136 $sort_by = esc_sql($sort_by);137 $order = esc_sql($order);138 140 $query .= $where." Group by Project.id ORDER BY $sort_by $order"; 139 141 $no_of_rows .= $where." Group by Project.id) AS Project"; … … 247 249 <img width="16" height="16" onclick="wppm_sort_up_project_list('category','DESC')" style = "<?php echo ($sort_by == 'proj_categories.name' && $order == 'ASC') ? 'display:inline': 'display:none;'?>" class="wppm_chevron_img" id="wppm_chevron_sort_down_project_cat_img" class="wppm_chevron_img" src="<?php echo esc_url( WPPM_PLUGIN_URL . 'asset/images/sort_down_icon.svg'); ?>" alt="chevron_sort_down_icon"> 248 250 </th> 249 <?php if($wppm_default_project_date==1 ){ ?>251 <?php if($wppm_default_project_date==1 && $wppm_deafault_time_duration_project==0){ ?> 250 252 <th class="wppm_table_header" style="background-color:<?php echo esc_attr($appearance_settings['list-header-background-color'])?>"> 251 253 <span id="wppm_project_start_date_th" style="color:<?php echo esc_attr($appearance_settings['list-header-text-color'])?>"><?php echo esc_html_e('Start Date','taskbuilder'); ?></span> … … 258 260 <img width="16" height="16" onclick="wppm_sort_up_project_list('end_date','DESC')" style = "<?php echo ($sort_by == 'end_date' && $order == 'ASC') ? 'display:inline': 'display:none;'?>" class="wppm_chevron_img" id="wppm_chevron_sort_down_project_end_date_img" class="wppm_chevron_img" src="<?php echo esc_url( WPPM_PLUGIN_URL . 'asset/images/sort_down_icon.svg'); ?>" alt="chevron_sort_down_icon"> 259 261 </th> 260 <?php } ?> 262 <?php } 263 if( $wppm_deafault_time_duration_project==1){ ?> 264 <th class="wppm_table_header" style="background-color:<?php echo esc_attr($appearance_settings['list-header-background-color'])?>"> 265 <span id="wppm_project_time_duration_th" style="color:<?php echo esc_attr($appearance_settings['list-header-text-color'])?>"><?php echo esc_html_e('Duration','taskbuilder'); ?></span> 266 <img width="16" height="16" onclick="wppm_sort_up_project_list('TIMESTAMPDIFF(SECOND, start_date, end_date)','ASC')" style = "<?php echo ($sort_by == 'TIMESTAMPDIFF(SECOND, start_date, end_date)' && $order == 'DESC') ? 'display:inline': 'display:none;'?>" class="wppm_chevron_img" id="wppm_chevron_sort_up_project_time_duration_img" src="<?php echo esc_url( WPPM_PLUGIN_URL . 'asset/images/sort_up_icon.svg'); ?>" alt="chevron_sort_up_icon"> 267 <img width="16" height="16" onclick="wppm_sort_up_project_list('TIMESTAMPDIFF(SECOND, start_date, end_date)','DESC')" style = "<?php echo ($sort_by == 'TIMESTAMPDIFF(SECOND, start_date, end_date)' && $order == 'ASC') ? 'display:inline': 'display:none;'?>" class="wppm_chevron_img" id="wppm_chevron_sort_down_project_time_duration_img" class="wppm_chevron_img" src="<?php echo esc_url( WPPM_PLUGIN_URL . 'asset/images/sort_down_icon.svg'); ?>" alt="chevron_sort_down_icon"> 268 </th> 269 <?php }?> 261 270 <th class="wppm_table_header" style="background-color:<?php echo esc_attr($appearance_settings['list-header-background-color'])?>"><span style="color:<?php echo esc_attr($appearance_settings['list-header-text-color'])?>"><?php echo esc_html_e('No. of tasks','taskbuilder'); ?></span></th> 262 271 <th class="wppm_table_header" style="background-color:<?php echo esc_attr($appearance_settings['list-header-background-color'])?>"></th> … … 270 279 $total_projects++; 271 280 $proejctdata = $wppmfunction->get_project($project->id); 281 $wppm_proj_duration = $wppmfunction->wppm_get_duration($project->start_date,$project->end_date); 272 282 $pstatus= esc_sql($project->status); 273 283 $status = $wpdb->get_row( "SELECT * FROM {$wpdb->prefix}wppm_project_statuses where id='$pstatus'" ); … … 420 430 </td> 421 431 <td onmouseover="link=true;" class="wppm_table_td"><?php echo isset($category) ? esc_html_e($category,'taskbuilder'): "" ?></td> 422 <?php if($wppm_default_project_date==1){ 423 ?> 432 <?php if($wppm_default_project_date==1 && $wppm_deafault_time_duration_project==0){ ?> 424 433 <td onmouseover="link=true;" class="wppm_table_td"><?php echo isset($proj_start_date) ? esc_html($proj_start_date): "" ?></td> 425 434 <?php … … 430 439 } ?> 431 440 <td onmouseover="link=true;" class="wppm_table_td"><span style="<?php echo esc_attr($style); ?>"><?php echo isset($proj_end_date) ? esc_html($proj_end_date):"" ?></span></td> 441 <?php } ?> 442 <?php if($wppm_deafault_time_duration_project==1){ ?> 443 <?php 444 if(!empty($proj_end_date) && $project->status!=4 && $proj_end_date < $current_date && ($proj_end_date != '0000-00-00 00:00:00' && $proj_end_date != '00-00-0000 00:00:00' && $proj_end_date != '00-00-0000' && $proj_end_date != '0000-00-00')) { 445 $style = "color:#FF0000"; 446 } else { 447 $style = "color:#2C3E50"; 448 } ?> 449 <td onmouseover="link=true;" class="wppm_table_td"><span style="<?php echo esc_attr($style); ?>"><?php echo isset($wppm_proj_duration) ? esc_html($wppm_proj_duration):"" ?></span></td> 432 450 <?php } ?> 433 451 <td onmouseover="link=true;" class="wppm_table_td"><?php echo isset($no_of_tasks) ? esc_html($no_of_tasks):"" ?></td> … … 524 542 jQuery('#wppm_chevron_sort_down_project_end_date_img').hide(); 525 543 }); 544 jQuery("#wppm_project_time_duration_th").hover(function(){ 545 jQuery('#wppm_chevron_sort_up_project_time_duration_img').show(); 546 jQuery('#wppm_chevron_sort_down_project_time_duration_img').hide(); 547 }); 526 548 jQuery(".wppm_delete_action").on("click", function(e){ 527 549 e.preventDefault(); -
taskbuilder/trunk/includes/admin/projects/wppm_open_project.php
r3358435 r3457050 15 15 $wppm_proj_hide_comment_section = get_option('wppm_proj_hide_comment_section'); 16 16 $wppm_current_user_capability = get_user_meta( $current_user->ID, 'wppm_capability', true ); 17 $wppm_deafault_time_duration_project = get_option('wppm_display_time_duration_project'); 17 18 $current_date = date('Y-m-d'); 18 19 $id = isset($_POST) && isset($_POST['id']) ? intval(sanitize_text_field($_POST['id'])) : 0; … … 199 200 </div> 200 201 </div> 201 <?php if($wppm_default_project_date==1 ) { ?>202 <?php if($wppm_default_project_date==1 && $wppm_deafault_time_duration_project==0) { ?> 202 203 <div class="row"> 203 204 <div class="col-sm-3"> … … 221 222 <input type="hidden" name="wppm_edit_pend_date_ajax_nonce" id="wppm_edit_pend_date_ajax_nonce" value="<?php echo esc_attr( wp_create_nonce( 'wppm_set_change_proj_end_date' ) ); ?>"> 222 223 </div> 223 <?php } ?> 224 <?php } if($wppm_deafault_time_duration_project==1){ 225 $wppm_proj_duration = $wppmfunction->wppm_get_duration($project->start_date,$project->end_date); 226 $pstatus = isset($project->status) ? $project->status :""; 227 $style = (!empty($proj_end_date) && $pstatus!=4 && $proj_end_date < $current_date && ($proj_end_date != '0000-00-00 00:00:00' && $proj_end_date != '00-00-0000 00:00:00' && $proj_end_date != '00-00-0000' && $proj_end_date != '0000-00-00')) ? "color:#FF0000":"color:#2C3E50"; ?> 228 <div class="row"> 229 <div class="col-sm-3"> 230 <span class="wppm_project_details_label"><?php echo esc_html_e('Project Duration:','taskbuilder');?></span> 231 </div> 232 <div class="col-sm-9"> 233 <span class="wppm_project_details" id="wppm_edit_proj_duration" style="<?php echo esc_attr($style); ?>"><?php echo (isset($wppm_proj_duration))? esc_html($wppm_proj_duration): "" ?></span> 234 </div> 235 </div> <?php 236 }?> 224 237 <div class="row"> 225 238 <div class="col-sm-3"> -
taskbuilder/trunk/includes/admin/settings/wppm_get_general_settings.php
r3342822 r3457050 26 26 $wppm_proj_hide_comment_section = get_option('wppm_proj_hide_comment_section'); 27 27 $wppm_task_hide_comment_section = get_option('wppm_task_hide_comment_section'); 28 $wppm_deafault_time_duration_project = get_option('wppm_display_time_duration_project'); 29 $wppm_deafault_time_duration_task = get_option('wppm_display_time_duration_task'); 28 30 ?> 29 31 <form id="wppm_frm_general_settings" method="post" action="javascript:wppm_set_general_settings();"> … … 40 42 <input type="radio" name="wppm_task_list_view" value="0" <?php echo ((esc_attr($wppm_default_task_list_view))==0)?'checked="checked"':'';?>> 41 43 <span style="padding-left: 10px;"><?php echo esc_html_e('Card View','taskbuilder');?></span> 44 <hr> 45 <span> 46 <label><?php echo esc_html_e('Show project duration instead of start and end dates in the project list.','taskbuilder');?></label> 47 </span><br> 48 <p class="help-block"><?php echo esc_html_e('Default show/hide time duration of project.','taskbuilder');?></p> 49 <input type="radio" name="wppm_display_time_duration_project" style="margin-top: 0px;" value="1" <?php echo ((esc_attr($wppm_deafault_time_duration_project))==1) ?'checked="checked"':'';?>> 50 <span style="padding-left: 10px;"><?php echo esc_html_e('Show','taskbuilder');?></span> 51 <br> 52 <input type="radio" name="wppm_display_time_duration_project" value="0" <?php echo ((esc_attr($wppm_deafault_time_duration_project))==0)?'checked="checked"':'';?>> 53 <span style="padding-left: 10px;"><?php echo esc_html_e('Hide','taskbuilder');?></span> 54 <hr> 55 <span> 56 <label><?php echo esc_html_e('Show task duration instead of start and end dates in the task list.','taskbuilder');?></label> 57 </span><br> 58 <p class="help-block"><?php echo esc_html_e('Default show/hide time duration of task.','taskbuilder');?></p> 59 <input type="radio" name="wppm_display_time_duration_task" style="margin-top: 0px;" value="1" <?php echo ((esc_attr($wppm_deafault_time_duration_task))==1) ?'checked="checked"':'';?>> 60 <span style="padding-left: 10px;"><?php echo esc_html_e('Show','taskbuilder');?></span> 61 <br> 62 <input type="radio" name="wppm_display_time_duration_task" value="0" <?php echo ((esc_attr($wppm_deafault_time_duration_task))==0)?'checked="checked"':'';?>> 63 <span style="padding-left: 10px;"><?php echo esc_html_e('Hide','taskbuilder');?></span> 42 64 <hr> 43 65 <span> -
taskbuilder/trunk/includes/admin/settings/wppm_set_general_settings.php
r3329577 r3457050 13 13 $wppm_task_list_view = isset($_POST) && isset(($_POST['wppm_task_list_view'])) ? sanitize_text_field($_POST['wppm_task_list_view']) : ''; 14 14 update_option('wppm_default_task_list_view',$wppm_task_list_view); 15 $wppm_display_time_duration_project = isset($_POST) && isset(($_POST['wppm_display_time_duration_project'])) ? sanitize_text_field($_POST['wppm_display_time_duration_project']) : '0'; 16 update_option('wppm_display_time_duration_project',$wppm_display_time_duration_project); 17 $wppm_display_time_duration_task = isset($_POST) && isset(($_POST['wppm_display_time_duration_task'])) ? sanitize_text_field($_POST['wppm_display_time_duration_task']) : '0'; 18 update_option('wppm_display_time_duration_task',$wppm_display_time_duration_task); 15 19 $wppm_project_time = isset($_POST) && isset(($_POST['wppm_project_time'])) ? sanitize_text_field($_POST['wppm_project_time']) : '1'; 16 20 update_option('wppm_project_time',$wppm_project_time); -
taskbuilder/trunk/includes/admin/tasks/open_task/wppm_open_task.php
r3431170 r3457050 16 16 $wppm_date_setting = get_option('wppm_date_setting'); 17 17 $wppm_task_hide_comment_section = get_option('wppm_task_hide_comment_section'); 18 $wppm_deafault_time_duration_task = get_option('wppm_display_time_duration_task'); 18 19 $url_auth = false; 19 20 $auth_id = $wppmfunction->wppm_get_auth_code($id); … … 278 279 </div> 279 280 </div> 280 <?php if($wppm_default_task_date == 1 ){ ?>281 <?php if($wppm_default_task_date == 1 && $wppm_deafault_time_duration_task==0){ ?> 281 282 <div class="row"> 282 283 <div class="col-sm-3"> … … 298 299 <input type="hidden" name="wppm_edit_tend_date_ajax_nonce" id="wppm_edit_tend_date_ajax_nonce" value="<?php echo esc_attr( wp_create_nonce( 'wppm_set_change_task_end_date' ) ); ?>"> 299 300 </div> 300 <?php } ?> 301 <?php } 302 if($wppm_deafault_time_duration_task==1){ 303 $wppm_task_duration = $wppmfunction->wppm_get_duration($task->start_date,$task->end_date); 304 $tstatus = isset($task->status) ? $task->status :""; 305 $style = (!empty($task->end_date) && $tstatus!=4 && $task->end_date < $current_date && ($task->end_date != '0000-00-00 00:00:00' && $task->end_date != '00-00-0000 00:00:00' && $task->end_date != '00-00-0000' && $task->end_date != '0000-00-00')) ? "color:#FF1111":"color:#2C3E51"; ?> 306 <div class="row"> 307 <div class="col-sm-3"> 308 <span class="wppm_task_details_label"><?php echo esc_html_e('Task Duration:','taskbuilder');?></span> 309 </div> 310 <div class="col-sm-9"> 311 <span class="wppm_task_details" id="wppm_edit_task_duration" style="<?php echo esc_attr($style); ?>"><?php echo (isset($wppm_task_duration))? esc_html($wppm_task_duration): "" ?></span> 312 </div> 313 </div> <?php 314 }?> 301 315 <div class="row"> 302 316 <div class="col-sm-3"> -
taskbuilder/trunk/includes/admin/tasks/open_task/wppm_submit_task_comment.php
r3210469 r3457050 8 8 } 9 9 $task_id = isset($_POST['task_id']) ? intval(sanitize_text_field($_POST['task_id'])) : '' ; 10 if(!$wppmfunction->has_permission('add_task_comment',$task_id)){ exit; } 10 11 $comment = isset($_POST['comment_body']) ? ($_POST['comment_body']) : '' ; 11 12 $allowed_tags = array( 'br' => array(), 'abbr' => array('title' => array(),), 'p' => array(), 'strong' => array(), 'a' => array('href' => array(), 'title' => array(), 'rel'=> array(), 'target'=> array()),'em' =>array(),'span' =>array(), 'blockquote'=>array('cite' => array(),),'div' => array('class' => array(),'title' => array(),'style' => array(),),'ul'=>array(),'li'=>array(),'ol'=>array(),'img' => array( 'alt'=> array(),'class' => array(),'height' => array(),'src'=> array(),'width'=> array(),)); 12 $comment_body = wp_kses( htmlspecialchars_decode($comment, ENT_QUOTES),$allowed_tags);13 $comment_body = wp_kses($comment,$allowed_tags); 13 14 $attachments = !empty($_POST['wppm_comment_attachment']) ? $wppmfunction->sanitize_array($_POST['wppm_comment_attachment']) : []; 14 15 $attachment_ids = implode(",",$attachments); … … 30 31 $wpdb->insert($wpdb->prefix . 'wppm_task_comment_meta',$task_log_values); 31 32 do_action('wppm_after_submit_task_comment', $task_id,$comment_id); 32 -
taskbuilder/trunk/includes/admin/tasks/wppm_tasks_list.php
r3431170 r3457050 20 20 $wppm_hide_completed_status_task = get_option('wppm_hide_completed_status_task'); 21 21 $wppm_hide_task_statuses_from_frontend = get_option('wppm_hide_task_statuses_from_frontend'); 22 $wppm_deafault_time_duration_task = get_option('wppm_display_time_duration_task'); 22 23 if(!empty($wppm_hide_task_statuses_from_frontend)){ 23 24 $wppm_hide_task_statuses_from_frontend = explode(",",$wppm_hide_task_statuses_from_frontend); … … 101 102 setcookie('wppm_filters',wp_json_encode( $filters ),time() + 3600); 102 103 103 if($tl_filters_arr['sort_by']=='project'){ 104 $sort_by = 'proj.project_name'; 105 } 106 if($tl_filters_arr['sort_by']=='start_date'){ 107 $sort_by = 'Task.start_date'; 108 } 109 if($tl_filters_arr['sort_by']=='end_date'){ 110 $sort_by = 'Task.end_date'; 111 } 112 if($tl_filters_arr['sort_by']=='status'){ 113 $sort_by = 'task_statuses.name'; 114 } 115 if($tl_filters_arr['sort_by']=='priority'){ 116 $sort_by='task_priorities.name'; 117 } 104 // Allowed sort columns 105 $allowed_sort_by = [ 106 'project' => 'proj.project_name', 107 'status' => 'task_statuses.name', 108 'priority' => 'task_priorities.name', 109 'start_date' => 'Task.start_date', 110 'end_date' => 'Task.end_date', 111 'TIMESTAMPDIFF(SECOND, Task.start_date, Task.end_date)' => 'TIMESTAMPDIFF(SECOND, Task.start_date, Task.end_date)', 112 ]; 113 114 // Resolve sort_by safely 115 $sort_key = isset($_POST['sort_by']) 116 ? sanitize_text_field($_POST['sort_by']) 117 : ($tl_filters_arr['sort_by'] ?? 'task_name'); 118 119 $sort_by = $allowed_sort_by[$sort_key] ?? 'task_name'; 120 121 // Resolve order safely 122 $order = (isset($_POST['order']) && strtoupper($_POST['order']) === 'ASC') 123 ? 'ASC' 124 : 'DESC'; 125 118 126 if($filter_by=='all'){ 119 127 if($wppm_hide_completed_status_task == 0){ … … 228 236 $no_of_rows = apply_filters('wppm_task_list_no_of_rows',$no_of_rows,$wppm_tl_filter,$search_tag_text); 229 237 $totalrows = $wpdb->get_var($no_of_rows); 230 $sort_by = esc_sql($sort_by);231 $order = esc_sql($order);232 238 $query .= $where." Group by Task.id ORDER BY ".$sort_by." ".$order.""; 233 239 $query = apply_filters('wppm_task_list_query',$query); … … 399 405 <img width="16" height="16" style = "<?php echo ($sort_by == ('task_priorities.name') && $order == 'ASC') ? 'display:inline': 'display:none;'?>" onclick="wppm_sort_up_task_list('priority','DESC','<?php echo esc_attr($page); ?>')" class="wppm_chevron_img" id="wppm_chevron_sort_down_priority_img" src="<?php echo esc_url( WPPM_PLUGIN_URL . 'asset/images/sort_down_icon.svg'); ?>" alt="chevron_sort_down_icon"> 400 406 </th> 401 <?php if($wppm_default_task_date == 1 ) { ?>407 <?php if($wppm_default_task_date == 1 && $wppm_deafault_time_duration_task==0) { ?> 402 408 <th class="wppm_table_header" style="background-color:<?php echo esc_attr($appearance_settings['list-header-background-color'])?>"> 403 409 <span id="wppm_start_date_th" style="color:<?php echo esc_attr($appearance_settings['list-header-text-color'])?>"><?php echo esc_html_e('Start date','taskbuilder'); ?></span> … … 410 416 <img width="16" height="16" style = "<?php echo ($sort_by == 'Task.end_date' && $order == 'ASC') ? 'display:inline': 'display:none;'?>" onclick="wppm_sort_up_task_list('end_date','DESC','<?php echo esc_attr($page); ?>')" class="wppm_chevron_img" id="wppm_chevron_sort_down_end_date_img" src="<?php echo esc_url( WPPM_PLUGIN_URL . 'asset/images/sort_down_icon.svg'); ?>" alt="chevron_sort_down_icon"> 411 417 </th> 412 <?php } ?> 418 <?php } 419 if( $wppm_deafault_time_duration_task==1){ ?> 420 <th class="wppm_table_header" style="background-color:<?php echo esc_attr($appearance_settings['list-header-background-color'])?>"> 421 <span id="wppm_task_duration_th" style="color:<?php echo esc_attr($appearance_settings['list-header-text-color'])?>"><?php echo esc_html_e('Duration','taskbuilder'); ?></span> 422 <img width="16" height="16" style = "<?php echo ($sort_by == 'TIMESTAMPDIFF(SECOND, Task.start_date, Task.end_date)' && $order == 'DESC') ? 'display:inline': 'display:none;'?>" onclick="wppm_sort_up_task_list('TIMESTAMPDIFF(SECOND, Task.start_date, Task.end_date)','ASC','<?php echo esc_attr($page); ?>')" class="wppm_chevron_img" id="wppm_chevron_sort_up_task_duration_img" src="<?php echo esc_url( WPPM_PLUGIN_URL . 'asset/images/sort_up_icon.svg'); ?>" alt="chevron_sort_up_icon"> 423 <img width="16" height="16" style = "<?php echo ($sort_by == 'TIMESTAMPDIFF(SECOND, Task.start_date, Task.end_date)' && $order == 'ASC') ? 'display:inline': 'display:none;'?>" onclick="wppm_sort_up_task_list('TIMESTAMPDIFF(SECOND, Task.start_date, Task.end_date)','DESC','<?php echo esc_attr($page); ?>')" class="wppm_chevron_img" id="wppm_chevron_sort_down_task_duration_img" src="<?php echo esc_url( WPPM_PLUGIN_URL . 'asset/images/sort_down_icon.svg'); ?>" alt="chevron_sort_down_icon"> 424 </th> 425 <?php }?> 413 426 <th class="wppm_table_header" style="background-color:<?php echo esc_attr($appearance_settings['list-header-background-color'])?>"> 414 427 <span style="color:<?php echo esc_attr($appearance_settings['list-header-text-color'])?>"><?php echo esc_html_e('Assign To','taskbuilder'); ?></span> … … 426 439 foreach($wppm_task_fillter as $task) { 427 440 $task_id = esc_sql($task->id); 441 $wppm_task_duration = $wppmfunction->wppm_get_duration($task->start_date,$task->end_date); 428 442 $checklists = $wpdb->get_results( "SELECT * FROM {$wpdb->prefix}wppm_checklist where task_id = '$task_id'" ); 429 443 if(!empty($task)){ … … 569 583 <?php } ?> 570 584 </td> 571 <?php if($wppm_default_task_date == 1 ) { ?>585 <?php if($wppm_default_task_date == 1 && $wppm_deafault_time_duration_task==0) { ?> 572 586 <td onmouseover="link=true;"> 573 587 <?php if(!empty($task_start_date)){ ?> … … 583 597 <span style="<?php echo esc_attr($style); ?>"><?php echo esc_html_e($task_end_date,'taskbuilder');?></span> 584 598 </td> 599 <?php } ?> 600 <?php if($wppm_deafault_time_duration_task==1){ ?> 601 <?php 602 if(!empty($task_end_date) && ($task->status!=4 && $task_end_date < $current_date && $task_end_date != '0000-00-00 00:00:00' && $task_end_date != '00-00-0000 00:00:00' && $task_end_date != '00-00-0000' && $task_end_date != '0000-00-00')){ 603 $style = "color:#FF2222"; 604 } else { 605 $style = "color:#2C3E50"; 606 } ?> 607 <td onmouseover="link=true;" class="wppm_table_td"><span style="<?php echo esc_attr($style); ?>"><?php echo isset($wppm_task_duration) ? esc_html($wppm_task_duration):"" ?></span></td> 585 608 <?php } ?> 586 609 </td> … … 762 785 jQuery('#wppm_chevron_sort_down_end_date_img').hide(); 763 786 }); 787 jQuery("#wppm_task_duration_th").hover(function(){ 788 jQuery('#wppm_chevron_sort_up_task_duration_img').show(); 789 jQuery('#wppm_chevron_sort_down_task_duration_img').hide(); 790 }); 764 791 765 792 }) -
taskbuilder/trunk/includes/class-wppm-functions.php
r3312666 r3457050 259 259 case 'change_status': 260 260 case 'view_task': 261 ((!empty($co_worker_array)) && (in_array($current_user->ID,$co_worker_array )) )|| ($current_user->ID == $task_data['created_by']) || $public_proj_meta==1 || ($flag==true) ? $response = true: $response = false; 261 case 'add_task_comment': 262 ((!empty($co_worker_array)) && (in_array($current_user->ID,$co_worker_array )) )|| ($current_user->ID == $task_data['created_by']) || $public_proj_meta==1 || ($flag==true) || $current_user->has_cap('manage_options') ? $response = true: $response = false; 262 263 break; 263 264 case 'change_task_details': … … 384 385 $co_worker_array = explode(",",(string)$co_worker); 385 386 } 387 if(!empty($project_id)){ 388 $public_proj_meta = $wpdb->get_var( "SELECT meta_value FROM {$wpdb->prefix}wppm_project_meta where project_id= '$project_id' AND meta_key='public_project'"); 389 }else{ 390 $public_proj_meta =""; 391 } 392 386 393 switch ($permission) { 387 394 case 'view_project': 388 395 ((!empty($co_worker_array)) && (in_array($current_user->ID,$co_worker_array )) )? $response = true: $response = false; 396 break; 397 case 'add_proj_comment': 398 ( ((!empty($co_worker_array)) && (in_array($current_user->ID,$co_worker_array )) ) || ( $public_proj_meta == '1') || $current_user->has_cap('manage_options')|| $wppm_current_user_capability == 'wppm_admin' || $wppm_current_user_capability == 'wppm_manager')? $response = true: $response = false; 389 399 break; 390 400 case 'change_project_status': … … 1128 1138 <?php 1129 1139 } 1140 1141 public function wppm_get_duration($start_date, $end_date){ 1142 if ( empty($start_date) || empty($end_date) || $start_date=='0000-00-00 00:00:00' || $end_date =='0000-00-00 00:00:00') { 1143 return ''; 1144 } 1145 1146 $start_ts = strtotime($start_date); 1147 $end_ts = strtotime($end_date); 1148 1149 if ( $end_ts <= $start_ts ) { 1150 return '0 min'; 1151 } 1152 1153 $diff = $end_ts - $start_ts; 1154 1155 $days = floor($diff / 86400); 1156 $hours = floor(($diff % 86400) / 3600); 1157 $minutes = floor(($diff % 3600) / 60); 1158 1159 $duration = []; 1160 1161 if ($days > 0) $duration[] = $days . 'd'; 1162 if ($hours > 0) $duration[] = $hours . 'h'; 1163 if ($minutes > 0 || empty($duration)) $duration[] = $minutes . 'm'; 1164 1165 return implode(' ', $duration); 1166 1167 } 1130 1168 } 1131 1169 endif; -
taskbuilder/trunk/includes/wppm-install.php
r3431170 r3457050 502 502 } 503 503 } 504 if($installed_version < '5.0.3'){ 505 update_option('wppm_display_time_duration_project',0); 506 update_option('wppm_display_time_duration_task',0); 507 508 } 504 509 // update wppm_version option to plugin version 505 510 update_option( 'wppm_version', WPPM_VERSION ); -
taskbuilder/trunk/readme.txt
r3431170 r3457050 1 === Taskbuilder - Wordpress Project Management & Task Management ===1 === Taskbuilder - Wordpress Project Management & Task Management,kanban view === 2 2 Contributors: taskbuilder 3 3 Donate link: https://taskbuilder.net 4 Tags: project ,project management,task management,task manager,Kanban4 Tags: project management,task management,task manager,booking,calendar 5 5 Requires at least: 4.4 6 6 Tested up to: 6.9 7 Stable tag: 5.0. 27 Stable tag: 5.0.3 8 8 License: GPL v3 9 9 … … 120 120 121 121 == Changelog == 122 = V 5.0.3(Feb 9,2026) = 123 * Fix: Vulnerability: Missing Authorization to Authenticated (Subscriber+) Arbitrary Project/Task Comment Creation. 124 * Fix: Vulnerability: Authenticated (Subscriber+) SQL Injection via 'order' and 'sort_by' Parameters. 125 * New: Setting to set Duration in days,months,hours instead start and end date for project. 126 * New: Setting to set Duration in days,months,hours instead start and end date for task. 127 122 128 = V 5.0.2(January 2,2026) = 123 129 * New (Pro feature): Email Piping add-on. Email Piping is a feature that lets users create project tasks simply by sending emails. -
taskbuilder/trunk/taskbuilder.php
r3450259 r3457050 4 4 * Plugin URI: https://taskbuilder.net/ 5 5 * Description: Wordpress Project Management & Task Management plugin. Easy to keep track of projects & tasks! 6 * Version: 5.0. 26 * Version: 5.0.3 7 7 * Author: Taskbuilder Team 8 8 * Author URI: https://taskbuilder.net/ … … 20 20 21 21 final class WP_Taskbuilder { 22 public $version = '5.0. 2';22 public $version = '5.0.3'; 23 23 public function __construct() { 24 24 // define global constants
Note: See TracChangeset
for help on using the changeset viewer.