Plugin Directory

Changeset 3457050


Ignore:
Timestamp:
02/09/2026 12:31:53 PM (7 weeks ago)
Author:
taskbuilder
Message:

plugin update

Location:
taskbuilder
Files:
28 edited
1 copied

Legend:

Unmodified
Added
Removed
  • taskbuilder/tags/5.0.3/asset/css/admin.css

    r3431170 r3457050  
    11851185}
    11861186
    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{
    11881188  margin-right:-19px;
    11891189}
  • taskbuilder/tags/5.0.3/includes/admin/projects/open_project/wppm_submit_project_comment.php

    r3210469 r3457050  
    88}
    99$proj_id  = isset($_POST['proj_id']) ? intval(sanitize_text_field($_POST['proj_id'])) : '' ;
     10if(!$wppmfunction->has_project_permission('add_proj_comment',$proj_id)){
     11  wp_send_json_error( 'Unauthorised request!', 403 );
     12}
    1013$cu_id = $current_user->ID;
     14$project_data = $wppmfunction->get_project($proj_id);
     15if (empty($project_data)) {
     16    wp_send_json_error( 'Project not found', 404 );
     17}
    1118$comment  = isset($_POST['comment_body']) ? ($_POST['comment_body']) : '' ;
    1219$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);
    1421$attachments = !empty($_POST['wppm_proj_comment_attachment']) ? $wppmfunction->sanitize_array($_POST['wppm_proj_comment_attachment']) : [];
    1522$attachment_ids = implode(",",$attachments);
  • taskbuilder/tags/5.0.3/includes/admin/projects/open_project/wppm_view_project_tasks.php

    r3431170 r3457050  
    2222$wppm_hide_completed_status_task = get_option('wppm_hide_completed_status_task');
    2323$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');
    2425if(!empty($wppm_hide_task_statuses_from_frontend)){
    2526  $wppm_hide_task_statuses_from_frontend = explode(",",$wppm_hide_task_statuses_from_frontend);
     
    346347                            foreach($tasks as $task){
    347348                                $total_tasks++;
     349                                $wppm_task_duration = $wppmfunction->wppm_get_duration($task->start_date,$task->end_date);
    348350                                if((!empty($task)) && $task->status==$status->id){
    349351                                    $task_per_status = true;
     
    427429                                            </div>
    428430                                            <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 } ?>
    433442                                                <div class="wppm_card_task_users" style="text-align:right;">
    434443                                                    <?php
  • taskbuilder/tags/5.0.3/includes/admin/projects/projects_list.php

    r3329577 r3457050  
    88$appearance_settings = get_option("wppm-ap-project-list");
    99$wppm_date_setting = get_option('wppm_date_setting');
     10$wppm_deafault_time_duration_project = get_option('wppm_display_time_duration_project');
    1011$wppm_current_user_capability = get_user_meta( $current_user->ID, 'wppm_capability', true );
    1112$proj_per_page = 20;
     
    5253);
    5354setcookie('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';
    6973if($filter_by=='all'){
    7074  if($wppm_hide_completed_status_proj == 0){
     
    134138$no_of_rows = apply_filters('wppm_project_list_no_of_rows',$no_of_rows,$wppm_pl_filter,$search_tag);
    135139$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);
    138140$query .= $where." Group by Project.id ORDER BY $sort_by $order";
    139141$no_of_rows .= $where." Group by Project.id) AS Project";
     
    247249              <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">
    248250            </th>
    249             <?php if($wppm_default_project_date==1){ ?>
     251            <?php if($wppm_default_project_date==1 && $wppm_deafault_time_duration_project==0){ ?>
    250252                    <th class="wppm_table_header" style="background-color:<?php echo esc_attr($appearance_settings['list-header-background-color'])?>">
    251253                      <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>
     
    258260                      <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">
    259261                    </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 }?>
    261270            <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>
    262271            <th class="wppm_table_header" style="background-color:<?php echo esc_attr($appearance_settings['list-header-background-color'])?>"></th>
     
    270279                $total_projects++;
    271280                $proejctdata = $wppmfunction->get_project($project->id);
     281                $wppm_proj_duration = $wppmfunction->wppm_get_duration($project->start_date,$project->end_date);
    272282                $pstatus= esc_sql($project->status);
    273283                $status = $wpdb->get_row( "SELECT * FROM {$wpdb->prefix}wppm_project_statuses where id='$pstatus'" );
     
    420430                    </td>
    421431                    <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){ ?>
    424433                            <td onmouseover="link=true;" class="wppm_table_td"><?php echo isset($proj_start_date) ? esc_html($proj_start_date): "" ?></td>
    425434                            <?php
     
    430439                            } ?>
    431440                            <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>
    432450                    <?php } ?>
    433451                    <td onmouseover="link=true;" class="wppm_table_td"><?php echo isset($no_of_tasks) ? esc_html($no_of_tasks):"" ?></td>
     
    524542      jQuery('#wppm_chevron_sort_down_project_end_date_img').hide();
    525543    });
     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    });
    526548    jQuery(".wppm_delete_action").on("click", function(e){
    527549      e.preventDefault();
  • taskbuilder/tags/5.0.3/includes/admin/projects/wppm_open_project.php

    r3358435 r3457050  
    1515$wppm_proj_hide_comment_section = get_option('wppm_proj_hide_comment_section');
    1616$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');
    1718$current_date = date('Y-m-d');
    1819$id = isset($_POST) && isset($_POST['id']) ? intval(sanitize_text_field($_POST['id'])) : 0;
     
    199200              </div>
    200201            </div>
    201             <?php if($wppm_default_project_date==1) { ?>
     202            <?php if($wppm_default_project_date==1 && $wppm_deafault_time_duration_project==0) { ?>
    202203                    <div class="row">
    203204                      <div class="col-sm-3">
     
    221222                      <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' ) ); ?>">
    222223                    </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            }?>
    224237            <div class="row">
    225238              <div class="col-sm-3">
  • taskbuilder/tags/5.0.3/includes/admin/settings/wppm_get_general_settings.php

    r3342822 r3457050  
    2626$wppm_proj_hide_comment_section = get_option('wppm_proj_hide_comment_section');
    2727$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');
    2830?>
    2931<form id="wppm_frm_general_settings" method="post" action="javascript:wppm_set_general_settings();">
     
    4042    <input type="radio" name="wppm_task_list_view" value="0" <?php echo ((esc_attr($wppm_default_task_list_view))==0)?'checked="checked"':'';?>>
    4143    <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>
    4264    <hr>
    4365    <span>
  • taskbuilder/tags/5.0.3/includes/admin/settings/wppm_set_general_settings.php

    r3329577 r3457050  
    1313$wppm_task_list_view = isset($_POST) && isset(($_POST['wppm_task_list_view'])) ? sanitize_text_field($_POST['wppm_task_list_view']) : '';
    1414update_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';
     16update_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';
     18update_option('wppm_display_time_duration_task',$wppm_display_time_duration_task);
    1519$wppm_project_time = isset($_POST) && isset(($_POST['wppm_project_time'])) ? sanitize_text_field($_POST['wppm_project_time']) : '1';
    1620update_option('wppm_project_time',$wppm_project_time);
  • taskbuilder/tags/5.0.3/includes/admin/tasks/open_task/wppm_open_task.php

    r3431170 r3457050  
    1616$wppm_date_setting = get_option('wppm_date_setting');
    1717$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');
    1819$url_auth = false;
    1920$auth_id = $wppmfunction->wppm_get_auth_code($id);
     
    278279          </div>
    279280        </div>
    280         <?php if($wppm_default_task_date == 1){ ?>
     281        <?php if($wppm_default_task_date == 1 && $wppm_deafault_time_duration_task==0){ ?>
    281282                <div class="row">
    282283                  <div class="col-sm-3">
     
    298299                  <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' ) ); ?>">
    299300                </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        }?>
    301315        <div class="row">
    302316          <div class="col-sm-3">
  • taskbuilder/tags/5.0.3/includes/admin/tasks/open_task/wppm_submit_task_comment.php

    r3210469 r3457050  
    88}
    99$task_id  = isset($_POST['task_id']) ? intval(sanitize_text_field($_POST['task_id'])) : '' ;
     10if(!$wppmfunction->has_permission('add_task_comment',$task_id)){ exit; }
    1011$comment  = isset($_POST['comment_body']) ? ($_POST['comment_body']) : '' ;
    1112$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);
    1314$attachments = !empty($_POST['wppm_comment_attachment']) ? $wppmfunction->sanitize_array($_POST['wppm_comment_attachment']) : [];
    1415$attachment_ids = implode(",",$attachments);
     
    3031$wpdb->insert($wpdb->prefix . 'wppm_task_comment_meta',$task_log_values);
    3132do_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  
    2020$wppm_hide_completed_status_task = get_option('wppm_hide_completed_status_task');
    2121$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');
    2223if(!empty($wppm_hide_task_statuses_from_frontend)){
    2324  $wppm_hide_task_statuses_from_frontend = explode(",",$wppm_hide_task_statuses_from_frontend);
     
    101102setcookie('wppm_filters',wp_json_encode( $filters ),time() + 3600);
    102103
    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
    118126if($filter_by=='all'){
    119127  if($wppm_hide_completed_status_task == 0){
     
    228236$no_of_rows = apply_filters('wppm_task_list_no_of_rows',$no_of_rows,$wppm_tl_filter,$search_tag_text);
    229237$totalrows = $wpdb->get_var($no_of_rows);
    230 $sort_by = esc_sql($sort_by);
    231 $order = esc_sql($order);
    232238$query .= $where." Group by Task.id ORDER BY ".$sort_by." ".$order."";
    233239$query = apply_filters('wppm_task_list_query',$query);
     
    399405              <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">
    400406            </th>
    401             <?php if($wppm_default_task_date == 1) { ?>
     407            <?php if($wppm_default_task_date == 1 && $wppm_deafault_time_duration_task==0) { ?>
    402408                    <th class="wppm_table_header" style="background-color:<?php echo esc_attr($appearance_settings['list-header-background-color'])?>">
    403409                      <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>
     
    410416                      <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">
    411417                    </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 }?>
    413426            <th class="wppm_table_header" style="background-color:<?php echo esc_attr($appearance_settings['list-header-background-color'])?>">
    414427              <span style="color:<?php echo esc_attr($appearance_settings['list-header-text-color'])?>"><?php echo esc_html_e('Assign To','taskbuilder'); ?></span>
     
    426439            foreach($wppm_task_fillter as $task) {
    427440              $task_id = esc_sql($task->id);
     441              $wppm_task_duration = $wppmfunction->wppm_get_duration($task->start_date,$task->end_date);
    428442              $checklists = $wpdb->get_results( "SELECT * FROM {$wpdb->prefix}wppm_checklist where task_id = '$task_id'" );
    429443                if(!empty($task)){
     
    569583                      <?php } ?>
    570584                    </td>
    571                     <?php if($wppm_default_task_date == 1) { ?>
     585                    <?php if($wppm_default_task_date == 1 && $wppm_deafault_time_duration_task==0) { ?>
    572586                            <td onmouseover="link=true;">
    573587                            <?php if(!empty($task_start_date)){ ?>
     
    583597                                  <span style="<?php echo esc_attr($style); ?>"><?php echo esc_html_e($task_end_date,'taskbuilder');?></span>
    584598                            </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>
    585608                    <?php } ?>
    586609                    </td>
     
    762785      jQuery('#wppm_chevron_sort_down_end_date_img').hide();
    763786    });
     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    });
    764791   
    765792  })
  • taskbuilder/tags/5.0.3/includes/class-wppm-functions.php

    r3312666 r3457050  
    259259                case 'change_status':
    260260                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;
    262263                    break;
    263264                case 'change_task_details':
     
    384385                $co_worker_array = explode(",",(string)$co_worker);
    385386            }
     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
    386393            switch ($permission) {
    387394                case 'view_project':
    388395                ((!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;
    389399                  break;
    390400                case 'change_project_status':
     
    11281138            <?php
    11291139        }
     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        }
    11301168    }
    11311169endif;
  • taskbuilder/tags/5.0.3/includes/wppm-install.php

    r3431170 r3457050  
    502502            }
    503503        }
     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        }
    504509        // update wppm_version option to plugin version
    505510        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 ===
    22Contributors: taskbuilder
    33Donate link: https://taskbuilder.net
    4 Tags: project,project management,task management,task manager,Kanban
     4Tags: project management,task management,task manager,booking,calendar
    55Requires at least: 4.4
    66Tested up to: 6.9
    7 Stable tag: 5.0.2
     7Stable tag: 5.0.3
    88License: GPL v3
    99
     
    120120
    121121== 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
    122128= V 5.0.2(January 2,2026) =
    123129* 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  
    44 * Plugin URI: https://taskbuilder.net/
    55 * Description: Wordpress Project Management & Task Management plugin. Easy to keep track of projects & tasks!
    6  * Version: 5.0.2
     6 * Version: 5.0.3
    77 * Author: Taskbuilder Team
    88 * Author URI: https://taskbuilder.net/
     
    2020 
    2121  final class WP_Taskbuilder {
    22     public $version    = '5.0.2';
     22    public $version    = '5.0.3';
    2323    public function __construct() {
    2424      // define global constants
  • taskbuilder/trunk/asset/css/admin.css

    r3431170 r3457050  
    11851185}
    11861186
    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{
    11881188  margin-right:-19px;
    11891189}
  • taskbuilder/trunk/includes/admin/projects/open_project/wppm_submit_project_comment.php

    r3210469 r3457050  
    88}
    99$proj_id  = isset($_POST['proj_id']) ? intval(sanitize_text_field($_POST['proj_id'])) : '' ;
     10if(!$wppmfunction->has_project_permission('add_proj_comment',$proj_id)){
     11  wp_send_json_error( 'Unauthorised request!', 403 );
     12}
    1013$cu_id = $current_user->ID;
     14$project_data = $wppmfunction->get_project($proj_id);
     15if (empty($project_data)) {
     16    wp_send_json_error( 'Project not found', 404 );
     17}
    1118$comment  = isset($_POST['comment_body']) ? ($_POST['comment_body']) : '' ;
    1219$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);
    1421$attachments = !empty($_POST['wppm_proj_comment_attachment']) ? $wppmfunction->sanitize_array($_POST['wppm_proj_comment_attachment']) : [];
    1522$attachment_ids = implode(",",$attachments);
  • taskbuilder/trunk/includes/admin/projects/open_project/wppm_view_project_tasks.php

    r3431170 r3457050  
    2222$wppm_hide_completed_status_task = get_option('wppm_hide_completed_status_task');
    2323$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');
    2425if(!empty($wppm_hide_task_statuses_from_frontend)){
    2526  $wppm_hide_task_statuses_from_frontend = explode(",",$wppm_hide_task_statuses_from_frontend);
     
    346347                            foreach($tasks as $task){
    347348                                $total_tasks++;
     349                                $wppm_task_duration = $wppmfunction->wppm_get_duration($task->start_date,$task->end_date);
    348350                                if((!empty($task)) && $task->status==$status->id){
    349351                                    $task_per_status = true;
     
    427429                                            </div>
    428430                                            <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 } ?>
    433442                                                <div class="wppm_card_task_users" style="text-align:right;">
    434443                                                    <?php
  • taskbuilder/trunk/includes/admin/projects/projects_list.php

    r3329577 r3457050  
    88$appearance_settings = get_option("wppm-ap-project-list");
    99$wppm_date_setting = get_option('wppm_date_setting');
     10$wppm_deafault_time_duration_project = get_option('wppm_display_time_duration_project');
    1011$wppm_current_user_capability = get_user_meta( $current_user->ID, 'wppm_capability', true );
    1112$proj_per_page = 20;
     
    5253);
    5354setcookie('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';
    6973if($filter_by=='all'){
    7074  if($wppm_hide_completed_status_proj == 0){
     
    134138$no_of_rows = apply_filters('wppm_project_list_no_of_rows',$no_of_rows,$wppm_pl_filter,$search_tag);
    135139$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);
    138140$query .= $where." Group by Project.id ORDER BY $sort_by $order";
    139141$no_of_rows .= $where." Group by Project.id) AS Project";
     
    247249              <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">
    248250            </th>
    249             <?php if($wppm_default_project_date==1){ ?>
     251            <?php if($wppm_default_project_date==1 && $wppm_deafault_time_duration_project==0){ ?>
    250252                    <th class="wppm_table_header" style="background-color:<?php echo esc_attr($appearance_settings['list-header-background-color'])?>">
    251253                      <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>
     
    258260                      <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">
    259261                    </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 }?>
    261270            <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>
    262271            <th class="wppm_table_header" style="background-color:<?php echo esc_attr($appearance_settings['list-header-background-color'])?>"></th>
     
    270279                $total_projects++;
    271280                $proejctdata = $wppmfunction->get_project($project->id);
     281                $wppm_proj_duration = $wppmfunction->wppm_get_duration($project->start_date,$project->end_date);
    272282                $pstatus= esc_sql($project->status);
    273283                $status = $wpdb->get_row( "SELECT * FROM {$wpdb->prefix}wppm_project_statuses where id='$pstatus'" );
     
    420430                    </td>
    421431                    <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){ ?>
    424433                            <td onmouseover="link=true;" class="wppm_table_td"><?php echo isset($proj_start_date) ? esc_html($proj_start_date): "" ?></td>
    425434                            <?php
     
    430439                            } ?>
    431440                            <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>
    432450                    <?php } ?>
    433451                    <td onmouseover="link=true;" class="wppm_table_td"><?php echo isset($no_of_tasks) ? esc_html($no_of_tasks):"" ?></td>
     
    524542      jQuery('#wppm_chevron_sort_down_project_end_date_img').hide();
    525543    });
     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    });
    526548    jQuery(".wppm_delete_action").on("click", function(e){
    527549      e.preventDefault();
  • taskbuilder/trunk/includes/admin/projects/wppm_open_project.php

    r3358435 r3457050  
    1515$wppm_proj_hide_comment_section = get_option('wppm_proj_hide_comment_section');
    1616$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');
    1718$current_date = date('Y-m-d');
    1819$id = isset($_POST) && isset($_POST['id']) ? intval(sanitize_text_field($_POST['id'])) : 0;
     
    199200              </div>
    200201            </div>
    201             <?php if($wppm_default_project_date==1) { ?>
     202            <?php if($wppm_default_project_date==1 && $wppm_deafault_time_duration_project==0) { ?>
    202203                    <div class="row">
    203204                      <div class="col-sm-3">
     
    221222                      <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' ) ); ?>">
    222223                    </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            }?>
    224237            <div class="row">
    225238              <div class="col-sm-3">
  • taskbuilder/trunk/includes/admin/settings/wppm_get_general_settings.php

    r3342822 r3457050  
    2626$wppm_proj_hide_comment_section = get_option('wppm_proj_hide_comment_section');
    2727$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');
    2830?>
    2931<form id="wppm_frm_general_settings" method="post" action="javascript:wppm_set_general_settings();">
     
    4042    <input type="radio" name="wppm_task_list_view" value="0" <?php echo ((esc_attr($wppm_default_task_list_view))==0)?'checked="checked"':'';?>>
    4143    <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>
    4264    <hr>
    4365    <span>
  • taskbuilder/trunk/includes/admin/settings/wppm_set_general_settings.php

    r3329577 r3457050  
    1313$wppm_task_list_view = isset($_POST) && isset(($_POST['wppm_task_list_view'])) ? sanitize_text_field($_POST['wppm_task_list_view']) : '';
    1414update_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';
     16update_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';
     18update_option('wppm_display_time_duration_task',$wppm_display_time_duration_task);
    1519$wppm_project_time = isset($_POST) && isset(($_POST['wppm_project_time'])) ? sanitize_text_field($_POST['wppm_project_time']) : '1';
    1620update_option('wppm_project_time',$wppm_project_time);
  • taskbuilder/trunk/includes/admin/tasks/open_task/wppm_open_task.php

    r3431170 r3457050  
    1616$wppm_date_setting = get_option('wppm_date_setting');
    1717$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');
    1819$url_auth = false;
    1920$auth_id = $wppmfunction->wppm_get_auth_code($id);
     
    278279          </div>
    279280        </div>
    280         <?php if($wppm_default_task_date == 1){ ?>
     281        <?php if($wppm_default_task_date == 1 && $wppm_deafault_time_duration_task==0){ ?>
    281282                <div class="row">
    282283                  <div class="col-sm-3">
     
    298299                  <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' ) ); ?>">
    299300                </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        }?>
    301315        <div class="row">
    302316          <div class="col-sm-3">
  • taskbuilder/trunk/includes/admin/tasks/open_task/wppm_submit_task_comment.php

    r3210469 r3457050  
    88}
    99$task_id  = isset($_POST['task_id']) ? intval(sanitize_text_field($_POST['task_id'])) : '' ;
     10if(!$wppmfunction->has_permission('add_task_comment',$task_id)){ exit; }
    1011$comment  = isset($_POST['comment_body']) ? ($_POST['comment_body']) : '' ;
    1112$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);
    1314$attachments = !empty($_POST['wppm_comment_attachment']) ? $wppmfunction->sanitize_array($_POST['wppm_comment_attachment']) : [];
    1415$attachment_ids = implode(",",$attachments);
     
    3031$wpdb->insert($wpdb->prefix . 'wppm_task_comment_meta',$task_log_values);
    3132do_action('wppm_after_submit_task_comment', $task_id,$comment_id);
    32 
  • taskbuilder/trunk/includes/admin/tasks/wppm_tasks_list.php

    r3431170 r3457050  
    2020$wppm_hide_completed_status_task = get_option('wppm_hide_completed_status_task');
    2121$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');
    2223if(!empty($wppm_hide_task_statuses_from_frontend)){
    2324  $wppm_hide_task_statuses_from_frontend = explode(",",$wppm_hide_task_statuses_from_frontend);
     
    101102setcookie('wppm_filters',wp_json_encode( $filters ),time() + 3600);
    102103
    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
    118126if($filter_by=='all'){
    119127  if($wppm_hide_completed_status_task == 0){
     
    228236$no_of_rows = apply_filters('wppm_task_list_no_of_rows',$no_of_rows,$wppm_tl_filter,$search_tag_text);
    229237$totalrows = $wpdb->get_var($no_of_rows);
    230 $sort_by = esc_sql($sort_by);
    231 $order = esc_sql($order);
    232238$query .= $where." Group by Task.id ORDER BY ".$sort_by." ".$order."";
    233239$query = apply_filters('wppm_task_list_query',$query);
     
    399405              <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">
    400406            </th>
    401             <?php if($wppm_default_task_date == 1) { ?>
     407            <?php if($wppm_default_task_date == 1 && $wppm_deafault_time_duration_task==0) { ?>
    402408                    <th class="wppm_table_header" style="background-color:<?php echo esc_attr($appearance_settings['list-header-background-color'])?>">
    403409                      <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>
     
    410416                      <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">
    411417                    </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 }?>
    413426            <th class="wppm_table_header" style="background-color:<?php echo esc_attr($appearance_settings['list-header-background-color'])?>">
    414427              <span style="color:<?php echo esc_attr($appearance_settings['list-header-text-color'])?>"><?php echo esc_html_e('Assign To','taskbuilder'); ?></span>
     
    426439            foreach($wppm_task_fillter as $task) {
    427440              $task_id = esc_sql($task->id);
     441              $wppm_task_duration = $wppmfunction->wppm_get_duration($task->start_date,$task->end_date);
    428442              $checklists = $wpdb->get_results( "SELECT * FROM {$wpdb->prefix}wppm_checklist where task_id = '$task_id'" );
    429443                if(!empty($task)){
     
    569583                      <?php } ?>
    570584                    </td>
    571                     <?php if($wppm_default_task_date == 1) { ?>
     585                    <?php if($wppm_default_task_date == 1 && $wppm_deafault_time_duration_task==0) { ?>
    572586                            <td onmouseover="link=true;">
    573587                            <?php if(!empty($task_start_date)){ ?>
     
    583597                                  <span style="<?php echo esc_attr($style); ?>"><?php echo esc_html_e($task_end_date,'taskbuilder');?></span>
    584598                            </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>
    585608                    <?php } ?>
    586609                    </td>
     
    762785      jQuery('#wppm_chevron_sort_down_end_date_img').hide();
    763786    });
     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    });
    764791   
    765792  })
  • taskbuilder/trunk/includes/class-wppm-functions.php

    r3312666 r3457050  
    259259                case 'change_status':
    260260                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;
    262263                    break;
    263264                case 'change_task_details':
     
    384385                $co_worker_array = explode(",",(string)$co_worker);
    385386            }
     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
    386393            switch ($permission) {
    387394                case 'view_project':
    388395                ((!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;
    389399                  break;
    390400                case 'change_project_status':
     
    11281138            <?php
    11291139        }
     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        }
    11301168    }
    11311169endif;
  • taskbuilder/trunk/includes/wppm-install.php

    r3431170 r3457050  
    502502            }
    503503        }
     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        }
    504509        // update wppm_version option to plugin version
    505510        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 ===
    22Contributors: taskbuilder
    33Donate link: https://taskbuilder.net
    4 Tags: project,project management,task management,task manager,Kanban
     4Tags: project management,task management,task manager,booking,calendar
    55Requires at least: 4.4
    66Tested up to: 6.9
    7 Stable tag: 5.0.2
     7Stable tag: 5.0.3
    88License: GPL v3
    99
     
    120120
    121121== 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
    122128= V 5.0.2(January 2,2026) =
    123129* 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  
    44 * Plugin URI: https://taskbuilder.net/
    55 * Description: Wordpress Project Management & Task Management plugin. Easy to keep track of projects & tasks!
    6  * Version: 5.0.2
     6 * Version: 5.0.3
    77 * Author: Taskbuilder Team
    88 * Author URI: https://taskbuilder.net/
     
    2020 
    2121  final class WP_Taskbuilder {
    22     public $version    = '5.0.2';
     22    public $version    = '5.0.3';
    2323    public function __construct() {
    2424      // define global constants
Note: See TracChangeset for help on using the changeset viewer.