Plugin Directory

Changeset 3286301


Ignore:
Timestamp:
05/02/2025 01:41:15 PM (11 months ago)
Author:
taskbuilder
Message:

version update

Location:
taskbuilder
Files:
4 added
16 edited
1 copied

Legend:

Unmodified
Added
Removed
  • taskbuilder/tags/4.0.3/includes/admin/addons.php

    r3254059 r3286301  
    294294                    </div>
    295295                </div>
     296                <div class="col-md-3 col-sm-6 col-xs-12 pricing-widget">
     297                    <div class="row">
     298                        <div class="pheader">
     299                            <h3 class="title"><img src="<?php echo esc_url( WPPM_PLUGIN_URL . 'asset/images/recurrent_task.svg'); ?>"> <?php echo esc_html_e('Recurrent Task','taskbuilder');?></h3>
     300                            <h4 class="subtitle">$29.99</h4>
     301                            <div style="text-align:center">
     302                                <small class="payment_freq"><?php echo esc_html_e('Per year','taskbuilder');?></small>
     303                                <small class="payment_freq"><?php echo esc_html_e('(Add-ons subject to yearly license for support and updates.)','taskbuilder');?></small>
     304                            </div>
     305                        </div>
     306                        <div class="pbody">
     307                            <div class="addon-container">
     308                                <i class="fas fa-arrow-right"></i>
     309                                <div class="addon-details">
     310                                <?php echo esc_html_e('Recurring tasks are automated task entries that repeat at defined intervals—daily, weekly, monthly. They eliminate the need to manually re-enter routine tasks, keeping workflows smooth and consistent.','taskbuilder');?></div>
     311                            </div>
     312                        </div>
     313                        <div class="pfooter">
     314                            <div class="purchase_addon">
     315                                <a href="https://taskbuilder.net/pricing/" target="__blank" type="button" class="btn btn-success"><?php echo esc_html_e('Purchase','taskbuilder');?></a>
     316                            </div>
     317                            <div>
     318                                <a href="https://taskbuilder.net/recurrent-task/" target="__blank" type="button" class="btn btn-success"><?php echo esc_html_e('View Details','taskbuilder');?></a>
     319                            </div>
     320                        </div>
     321                    </div>
     322                </div>
    296323            </div>
    297324        </div>
  • taskbuilder/tags/4.0.3/includes/admin/projects/open_project/wppm_drag_and_drop_card.php

    r3079882 r3286301  
    1212if (!$wppm_card) {exit;}
    1313$wppm_card_id= substr($wppm_card, 20);
    14 $wppm_target_task_status = substr($target_task_status,25);
    15 $values= array(
    16     'status'=> $wppm_target_task_status
    17 );
    18 $wpdb->update($wpdb->prefix.'wppm_task',$values,array('id'=>intval($wppm_card_id)));
    19 echo '{ "sucess_status":"1","messege":"Success" }';
     14if($wppmfunction->has_permission('change_task_status',$wppm_card_id)){
     15    $wppm_target_task_status = substr($target_task_status,25);
     16    $task_data = $wppmfunction->get_task($wppm_card_id);
     17    $task_id = $wppm_card_id;
     18    $old_status_id = $task_data['status'];
     19    $status_id = esc_sql($wppm_target_task_status);
     20    $wppmfunction->change_status( $task_id, $status_id);
     21    $change_task_value = array('prev_status'=>"$old_status_id",'new_status'=>"$status_id");
     22    $change_task_obj = serialize($change_task_value);
     23    $log_values = array('task_id'=>"$task_id",'body'=>$change_task_obj,'attachment_ids'=>"",'create_time'=>date("Y-m-d h:i:sa"),'created_by'=>"$current_user->ID" );
     24    $wpdb->insert($wpdb->prefix . 'wppm_task_comment',$log_values);
     25    $log_id = esc_sql($wpdb->insert_id);
     26    $task_log_values = array('task_id'=>"$task_id",'comment_id'=>"$log_id",'comment_type'=>'change_task_status');
     27    $wpdb->insert($wpdb->prefix . 'wppm_task_comment_meta',$task_log_values);
     28    echo '{ "sucess_status":"1","messege":"Success" }';
     29}else{
     30    echo '{ "sucess_status":"0","messege":"You do not have permission to change this task status." }';
     31}
  • taskbuilder/tags/4.0.3/includes/admin/projects/open_project/wppm_view_project_tasks.php

    r3226189 r3286301  
    1616$filter_by = isset($_POST['wppm_task_filter']) ? sanitize_text_field($_POST['wppm_task_filter']) : "all";
    1717$proj_filter = isset($_POST['wppm_proj_filter']) ? sanitize_text_field($_POST['wppm_proj_filter']) : "0";
     18$public_projects = isset($_POST['public_projects']) ? sanitize_text_field($_POST['public_projects']):"0";
    1819$wppm_current_user_capability = get_user_meta( $current_user->ID, 'wppm_capability', true );
    1920$filters = array(
     
    4142        $where = " where project_name = '".$proj_attr."' Group by proj.id ORDER BY '$santitize_order_by'";
    4243    }else{
    43         $where = " Group by proj.id ORDER BY '$santitize_order_by'";
     44        if(!empty($public_projects)){
     45            $where = " where proj.id = proj_meta.project_id AND proj_meta.meta_key='public_project' AND proj_meta.meta_value=1 Group by proj.id ORDER BY '$santitize_order_by'";
     46        }else{
     47            $where = " Group by proj.id ORDER BY '$santitize_order_by'";
     48        }
    4449    }
    4550}else{
    46     $where =  " where ((FIND_IN_SET($current_user->ID,proj.users)) OR (proj.id = proj_meta.project_id AND proj_meta.meta_key='public_project' AND proj_meta.meta_value=1) OR ( proj.created_by='$cu_id')) $wppm_proj_attr Group by proj.id ORDER BY '$santitize_order_by'";
     51    if(!empty($public_projects)){
     52        $where =  " where (proj.id = proj_meta.project_id AND proj_meta.meta_key='public_project' AND proj_meta.meta_value=1) $wppm_proj_attr Group by proj.id ORDER BY '$santitize_order_by'";
     53    } else{
     54        $where =  " where ((FIND_IN_SET($current_user->ID,proj.users)) OR (proj.id = proj_meta.project_id AND proj_meta.meta_key='public_project' AND proj_meta.meta_value=1) OR ( proj.created_by='$cu_id')) $wppm_proj_attr Group by proj.id ORDER BY '$santitize_order_by'";
     55    }
    4756}
    4857$where = apply_filters('wppm_project_filter_in_task_list_grid_view_where',$where);
     
    101110                        ");
    102111                $no_of_rows = ( "SELECT count(*) FROM ($query");
    103                 $where = " where $wppm_tl_filter AND $wppm_task_by_proj_filter AND (Task.task_name LIKE '$search_tag_text' OR proj.project_name LIKE '$search_tag_text' OR task_statuses.name LIKE '$search_tag_text' OR task_priorities.name LIKE '$search_tag_text' OR user.display_name LIKE '$search_tag_text') AND Task.status='$status_id' ";
     112                if(!empty($public_projects)){
     113                    $where = " where (proj_meta.meta_key='public_project' AND proj_meta.meta_value=1) AND $wppm_tl_filter AND $wppm_task_by_proj_filter AND (Task.task_name LIKE '$search_tag_text' OR proj.project_name LIKE '$search_tag_text' OR task_statuses.name LIKE '$search_tag_text' OR task_priorities.name LIKE '$search_tag_text' OR user.display_name LIKE '$search_tag_text') AND Task.status='$status_id' ";
     114                }else{
     115                    $where = " where $wppm_tl_filter AND $wppm_task_by_proj_filter AND (Task.task_name LIKE '$search_tag_text' OR proj.project_name LIKE '$search_tag_text' OR task_statuses.name LIKE '$search_tag_text' OR task_priorities.name LIKE '$search_tag_text' OR user.display_name LIKE '$search_tag_text') AND Task.status='$status_id' ";
     116                }
    104117            } else{
    105118                $query = ("SELECT Task.*
     
    113126                    ");
    114127                $no_of_rows = ( "SELECT count(*) FROM ($query");
    115                 $where = " where $wppm_tl_filter AND $wppm_task_by_proj_filter AND (((FIND_IN_SET('$current_user->ID',Task.users)>0) OR (Task.created_by= '$cu_id') OR (proj_users.user_id = '$cu_id' AND proj_users.role_id = 1 AND (FIND_IN_SET('$current_user->ID',proj.users)>0)) OR (Task.project = proj_meta.project_id AND proj_meta.meta_key='public_project' AND proj_meta.meta_value=1) OR proj.created_by='$cu_id') AND (Task.task_name LIKE '$search_tag_text' OR proj.project_name LIKE '$search_tag_text' OR task_statuses.name LIKE '$search_tag_text' OR task_priorities.name LIKE '$search_tag_text' OR user.display_name LIKE '$search_tag_text')) AND Task.status= '$status_id'";
     128                if(!empty($public_projects)){
     129                    $where = " where (proj_meta.meta_key='public_project' AND proj_meta.meta_value=1) AND $wppm_tl_filter AND $wppm_task_by_proj_filter AND (Task.task_name LIKE '$search_tag_text' OR proj.project_name LIKE '$search_tag_text' OR task_statuses.name LIKE '$search_tag_text' OR task_priorities.name LIKE '$search_tag_text' OR user.display_name LIKE '$search_tag_text')) AND Task.status= '$status_id'";
     130                }else{
     131                    $where = " where $wppm_tl_filter AND $wppm_task_by_proj_filter AND (((FIND_IN_SET('$current_user->ID',Task.users)>0) OR (Task.created_by= '$cu_id') OR (proj_users.user_id = '$cu_id' AND proj_users.role_id = 1 AND (FIND_IN_SET('$current_user->ID',proj.users)>0)) OR (Task.project = proj_meta.project_id AND proj_meta.meta_key='public_project' AND proj_meta.meta_value=1) OR proj.created_by='$cu_id') AND (Task.task_name LIKE '$search_tag_text' OR proj.project_name LIKE '$search_tag_text' OR task_statuses.name LIKE '$search_tag_text' OR task_priorities.name LIKE '$search_tag_text' OR user.display_name LIKE '$search_tag_text')) AND Task.status= '$status_id'";
     132                }
    116133            }
    117134        }else{
     
    122139                ");
    123140                $no_of_rows = ( "SELECT count(*) FROM ($query");
    124                 $where = " where $wppm_tl_filter AND $wppm_task_by_proj_filter AND Task.status= '$status_id'";
     141                if(!empty($public_projects)){
     142                    $where = " where (proj_meta.meta_key='public_project' AND proj_meta.meta_value=1) AND $wppm_tl_filter AND $wppm_task_by_proj_filter AND Task.status= '$status_id'";
     143                }else{
     144                    $where = " where $wppm_tl_filter AND $wppm_task_by_proj_filter AND Task.status= '$status_id'";
     145                }
    125146            }else{
    126147                $query = ( "SELECT Task.*
     
    131152                    ");
    132153                $no_of_rows = ( "SELECT count(*) FROM ($query");
    133                 $where = " where $wppm_tl_filter AND $wppm_task_by_proj_filter AND ((FIND_IN_SET('$current_user->ID',Task.users)>0) OR (Task.created_by= '$cu_id') OR (proj_users.user_id = '$cu_id' AND proj_users.role_id = 1 AND (FIND_IN_SET('$current_user->ID',proj.users)>0)) OR (Task.project = proj_meta.project_id AND proj_meta.meta_key='public_project' AND proj_meta.meta_value=1) OR proj.created_by='$cu_id') AND Task.status= '$status_id'";
     154                if(!empty($public_projects)){
     155                    $where = " where (proj_meta.meta_key='public_project' AND proj_meta.meta_value=1) AND $wppm_tl_filter AND $wppm_task_by_proj_filter AND Task.status= '$status_id'";
     156                } else{
     157                    $where = " where $wppm_tl_filter AND $wppm_task_by_proj_filter AND ((FIND_IN_SET('$current_user->ID',Task.users)>0) OR (Task.created_by= '$cu_id') OR (proj_users.user_id = '$cu_id' AND proj_users.role_id = 1 AND (FIND_IN_SET('$current_user->ID',proj.users)>0)) OR (Task.project = proj_meta.project_id AND proj_meta.meta_key='public_project' AND proj_meta.meta_value=1) OR proj.created_by='$cu_id') AND Task.status= '$status_id'";
     158                }
    134159            }
    135160        }
  • taskbuilder/tags/4.0.3/includes/admin/tasks/open_task/wppm_open_task.php

    r3254059 r3286301  
    7575}
    7676$flag = false;
    77 $wppm_task_fillter = $wpdb->get_results("SELECT * FROM {$wpdb->prefix}wppm_task");
     77$wppm_task_fillter = $wpdb->get_results("SELECT * FROM {$wpdb->prefix}wppm_task where id='".esc_sql($id)."'");
    7878if(!empty($wppm_task_fillter)){
    7979  foreach($wppm_task_fillter as $key_filter=>$val_filter){
  • taskbuilder/tags/4.0.3/includes/admin/tasks/wppm_tasks_list.php

    r3254059 r3286301  
    1212$proj_filter = isset($_POST['wppm_proj_filter']) ? sanitize_text_field($_POST['wppm_proj_filter']) : "0";
    1313$proj_attr = isset($_POST['wppm_project_attr']) ? sanitize_text_field($_POST['wppm_project_attr']):"";
     14$public_projects = isset($_POST['public_projects']) ? sanitize_text_field($_POST['public_projects']):"0";
    1415$wppm_current_user_capability = get_user_meta( $current_user->ID, 'wppm_capability', true );
    1516$wppm_create_tasks_coworkers_permission = get_option('wppm_allow_coworkers_create_task');
     
    3334    $where = " where project_name = '".$proj_attr."' Group by proj.id ORDER BY ".$orderby_proj_sql;
    3435  }else{
    35     $where = " Group by proj.id ORDER BY ".$orderby_proj_sql;
     36    if(!empty($public_projects)){
     37      $where = " where proj.id = proj_meta.project_id AND proj_meta.meta_key='public_project' AND proj_meta.meta_value=1 Group by proj.id ORDER BY ".$orderby_proj_sql;
     38    }else{
     39      $where = " Group by proj.id ORDER BY ".$orderby_proj_sql;
     40    }
    3641  }
    3742}else{
    38   $where =  " where ((FIND_IN_SET('$current_user->ID',proj.users)) OR (proj.id = proj_meta.project_id AND proj_meta.meta_key='public_project' AND proj_meta.meta_value=1) OR ( proj.created_by='$cu_id')) $wppm_proj_attr Group by proj.id ORDER BY $orderby_proj_sql";
     43  if(!empty($public_projects)){
     44    $where =  " where (proj.id = proj_meta.project_id AND proj_meta.meta_key='public_project' AND proj_meta.meta_value=1) $wppm_proj_attr Group by proj.id ORDER BY $orderby_proj_sql";
     45  }
     46  else{
     47    $where =  " where ((FIND_IN_SET('$current_user->ID',proj.users)) OR (proj.id = proj_meta.project_id AND proj_meta.meta_key='public_project' AND proj_meta.meta_value=1) OR ( proj.created_by='$cu_id')) $wppm_proj_attr Group by proj.id ORDER BY $orderby_proj_sql";
     48  }
    3949}
    4050$where = apply_filters('wppm_project_filter_in_task_list_where',$where);
     
    152162if(!empty($search_tag )){
    153163  if($current_user->has_cap('manage_options') || $wppm_current_user_capability == 'wppm_admin'){
    154     $where = " where $wppm_tl_filter AND $wppm_task_by_proj_filter AND (Task.task_name LIKE '$search_tag_text' OR proj.project_name LIKE '$search_tag_text' OR task_statuses.name LIKE '$search_tag_text' OR task_priorities.name LIKE '$search_tag_text' OR user.display_name LIKE '$search_tag_text') $wppm_proj_attr ";
     164    if(!empty($public_projects)){
     165      $where = " where (proj_meta.meta_key='public_project' AND proj_meta.meta_value=1) AND $wppm_tl_filter AND $wppm_task_by_proj_filter AND (Task.task_name LIKE '$search_tag_text' OR proj.project_name LIKE '$search_tag_text' OR task_statuses.name LIKE '$search_tag_text' OR task_priorities.name LIKE '$search_tag_text' OR user.display_name LIKE '$search_tag_text') $wppm_proj_attr ";
     166    }else{
     167      $where = " where $wppm_tl_filter AND $wppm_task_by_proj_filter AND (Task.task_name LIKE '$search_tag_text' OR proj.project_name LIKE '$search_tag_text' OR task_statuses.name LIKE '$search_tag_text' OR task_priorities.name LIKE '$search_tag_text' OR user.display_name LIKE '$search_tag_text') $wppm_proj_attr ";
     168    }
    155169  } else{
    156     $where = " where $wppm_tl_filter AND $wppm_task_by_proj_filter AND (((FIND_IN_SET('$current_user->ID',Task.users)>0) OR (Task.created_by= '$cu_id') OR (proj_users.user_id = '$cu_id' AND proj_users.role_id = 1 AND (FIND_IN_SET('$current_user->ID',proj.users)>0)) OR (Task.project = proj_meta.project_id AND proj_meta.meta_key='public_project' AND proj_meta.meta_value=1) OR (proj.created_by='$cu_id' AND (FIND_IN_SET('$current_user->ID',proj.users)>0))) AND (Task.task_name LIKE '$search_tag_text' OR proj.project_name LIKE '$search_tag_text' OR task_statuses.name LIKE '$search_tag_text' OR task_priorities.name LIKE '$search_tag_text' OR user.display_name LIKE '$search_tag_text')) $wppm_proj_attr";
     170    if(!empty($public_projects)){
     171      $where = " where (proj_meta.meta_key='public_project' AND proj_meta.meta_value=1) AND $wppm_tl_filter AND $wppm_task_by_proj_filter AND (((FIND_IN_SET('$current_user->ID',Task.users)>0) OR (Task.created_by= '$cu_id') OR (proj_users.user_id = '$cu_id' AND proj_users.role_id = 1 AND (FIND_IN_SET('$current_user->ID',proj.users)>0)) OR (Task.project = proj_meta.project_id AND proj_meta.meta_key='public_project' AND proj_meta.meta_value=1) OR (proj.created_by='$cu_id' AND (FIND_IN_SET('$current_user->ID',proj.users)>0))) AND (Task.task_name LIKE '$search_tag_text' OR proj.project_name LIKE '$search_tag_text' OR task_statuses.name LIKE '$search_tag_text' OR task_priorities.name LIKE '$search_tag_text' OR user.display_name LIKE '$search_tag_text')) $wppm_proj_attr";
     172    }else{
     173      $where = " where $wppm_tl_filter AND $wppm_task_by_proj_filter AND (((FIND_IN_SET('$current_user->ID',Task.users)>0) OR (Task.created_by= '$cu_id') OR (proj_users.user_id = '$cu_id' AND proj_users.role_id = 1 AND (FIND_IN_SET('$current_user->ID',proj.users)>0)) OR (Task.project = proj_meta.project_id AND proj_meta.meta_key='public_project' AND proj_meta.meta_value=1) OR (proj.created_by='$cu_id' AND (FIND_IN_SET('$current_user->ID',proj.users)>0))) AND (Task.task_name LIKE '$search_tag_text' OR proj.project_name LIKE '$search_tag_text' OR task_statuses.name LIKE '$search_tag_text' OR task_priorities.name LIKE '$search_tag_text' OR user.display_name LIKE '$search_tag_text')) $wppm_proj_attr";
     174    }
    157175  }
    158176}else{
    159177  if($current_user->has_cap('manage_options') || $wppm_current_user_capability == 'wppm_admin'){
    160     $where = " where $wppm_tl_filter AND $wppm_task_by_proj_filter $wppm_proj_attr";
     178    if(!empty($public_projects)){
     179      $where = " where (proj_meta.meta_key='public_project' AND proj_meta.meta_value=1) AND $wppm_tl_filter AND $wppm_task_by_proj_filter $wppm_proj_attr";
     180    }else{
     181      $where = " where $wppm_tl_filter AND $wppm_task_by_proj_filter $wppm_proj_attr";
     182    }
    161183  } else{
    162     $where = " where $wppm_tl_filter AND $wppm_task_by_proj_filter AND ((FIND_IN_SET('$current_user->ID',Task.users)>0) OR (Task.created_by= '$cu_id') OR (proj_users.user_id = '$cu_id' AND proj_users.role_id = 1 AND (FIND_IN_SET('$current_user->ID',proj.users)>0)) OR (Task.project = proj_meta.project_id AND proj_meta.meta_key='public_project' AND proj_meta.meta_value=1) OR (proj.created_by='$cu_id' AND (FIND_IN_SET('$current_user->ID',proj.users)>0))) $wppm_proj_attr";
     184    if(!empty($public_projects)){
     185      $where = " where  (proj_meta.meta_key='public_project' AND proj_meta.meta_value=1) AND $wppm_tl_filter AND $wppm_task_by_proj_filter $wppm_proj_attr";
     186    }else{
     187      $where = " where $wppm_tl_filter AND $wppm_task_by_proj_filter AND ((FIND_IN_SET('$current_user->ID',Task.users)>0) OR (Task.created_by= '$cu_id') OR (proj_users.user_id = '$cu_id' AND proj_users.role_id = 1 AND (FIND_IN_SET('$current_user->ID',proj.users)>0)) OR (Task.project = proj_meta.project_id AND proj_meta.meta_key='public_project' AND proj_meta.meta_value=1) OR (proj.created_by='$cu_id' AND (FIND_IN_SET('$current_user->ID',proj.users)>0))) $wppm_proj_attr";
     188    }
    163189  }
    164190}
  • taskbuilder/tags/4.0.3/includes/class-wppm-frontend.php

    r3254059 r3286301  
    1313            add_shortcode( 'wppm_projects', array( $this, 'wppm_projects' ) );
    1414            add_shortcode( 'wppm_tasks', array( $this, 'wppm_tasks' ) );
     15            add_shortcode( 'wppm_public_projects_tasks', array( $this, 'wppm_public_projects_tasks' ) );
    1516            add_action('wp_ajax_nopriv_wppm_sign_in',array($this,'wppm_sign_in'));
    1617            add_action('wp_ajax_nopriv_wppm_set_user_login',array($this,'wppm_set_user_login'));   
     
    7677        }
    7778
     79        function wppm_public_projects_tasks(){
     80            ob_start();
     81            include WPPM_ABSPATH.'includes/frontend/wppm_public_projects_tasks.php';
     82            return ob_get_clean();
     83        }
     84
    7885    }
    7986endif;
  • taskbuilder/tags/4.0.3/readme.txt

    r3265149 r3286301  
    44Tags: project,project management,task management,task manager,Kanban
    55Requires at least: 4.4
    6 Tested up to: 6.7.2
    7 Stable tag: 4.0.2
     6Tested up to: 6.8.1
     7Stable tag: 4.0.3
    88License: GPL v3
    99
     
    2121[wppm_tasks_calendar] - Use Calendar on front-end(pro feature).
    2222[wppm_tasks project ="insert project name here"]- If you want to display only selected project's task on page, you can add attribute as project name to tasks shortcode. It will only display tasks of selected project.
     23[wppm_public_projects_tasks] = Display public project's tasks from frontend.
    2324
    2425`
     
    5758* [Due Date Reminder](https://taskbuilder.net/due-date-reminder/) - Due date reminder are super helpful for keeping your team on track to hit deadlines. Email notification will send to customer before due date of task.
    5859* [Usergroup](https://taskbuilder.net/usergroup/) - Using usergroup add-on you can assign group of users to project and those group assign to project can be assign to tasks of project.
     60* [Recurrent Task] (https://taskbuilder.net/recurrent-task/) - Recurrent Tasks add-on allow administrators to effortlessly schedule recurring tasks for routine tasks The system automatically generates these tasks at the defined times, providing a streamlined approach to essential and repetitive processes. With versatile recurrence periods, customizable scheduling options, and the ability to set start and end dates.
    5961
    6062## 👨‍💻 DOCUMENTATION AND SUPPORT ##
     
    113115
    114116== Changelog ==
     117= V 4.0.3(May 2, 2025) =
     118* New: Public project's shortcode. You can use [wppm_public_projects_tasks] shortcode to display public project's tasks from frontend.
     119* Fix: If cowerkers permission disable for to change task status, cowerkers still change status by drag and drop feature in kanban view.
     120* Fix: When status change by drag and drop cards in kanban view, change status log not added in open task form.
     121* New (pro feature): Recurrent Task add-on.
     122
    115123= V 4.0.2(April 1,2025) =
    116124* Fix: SQL Injection.
     
    131139* Fix: If status name change from setting, changes not reflect on filter of task list, project list.
    132140* New: Rich Text Editor Setting. You can enable/disable Rich Text Editor from setting( Dashboard > projects > Settings > Rich Text Editor).
    133 * New(Pro feature): You can rearrange custom fields. By that order, custom fields will display in create task form.
     141* New(Pro feature): You can rearrange custom fields. By that order custom fields will display in create task form.
    134142
    135143= V 3.0.8(Dec 25,2024) =
  • taskbuilder/tags/4.0.3/taskbuilder.php

    r3265149 r3286301  
    44 * Plugin URI: https://wordpress.org/plugins/taskbuilder/
    55 * Description: Wordpress Project & Task Management plugin. Easy to keep track of projects & tasks!
    6  * Version: 4.0.2
     6 * Version: 4.0.3
    77 * Author: Taskbuilder Team
    88 * Author URI: https://taskbuilder.net/
    99 * Requires at least: 4.4
    10  * Tested up to: 6.7.2
     10 * Tested up to: 6.8.1
    1111 * Text Domain: taskbuilder
    1212 * Domain Path: /lang
     
    2020 
    2121  final class WP_Taskbuilder {
    22     public $version    = '4.0.2';
     22    public $version    = '4.0.3';
    2323    public function __construct() {
    2424      // define global constants
  • taskbuilder/trunk/includes/admin/addons.php

    r3254059 r3286301  
    294294                    </div>
    295295                </div>
     296                <div class="col-md-3 col-sm-6 col-xs-12 pricing-widget">
     297                    <div class="row">
     298                        <div class="pheader">
     299                            <h3 class="title"><img src="<?php echo esc_url( WPPM_PLUGIN_URL . 'asset/images/recurrent_task.svg'); ?>"> <?php echo esc_html_e('Recurrent Task','taskbuilder');?></h3>
     300                            <h4 class="subtitle">$29.99</h4>
     301                            <div style="text-align:center">
     302                                <small class="payment_freq"><?php echo esc_html_e('Per year','taskbuilder');?></small>
     303                                <small class="payment_freq"><?php echo esc_html_e('(Add-ons subject to yearly license for support and updates.)','taskbuilder');?></small>
     304                            </div>
     305                        </div>
     306                        <div class="pbody">
     307                            <div class="addon-container">
     308                                <i class="fas fa-arrow-right"></i>
     309                                <div class="addon-details">
     310                                <?php echo esc_html_e('Recurring tasks are automated task entries that repeat at defined intervals—daily, weekly, monthly. They eliminate the need to manually re-enter routine tasks, keeping workflows smooth and consistent.','taskbuilder');?></div>
     311                            </div>
     312                        </div>
     313                        <div class="pfooter">
     314                            <div class="purchase_addon">
     315                                <a href="https://taskbuilder.net/pricing/" target="__blank" type="button" class="btn btn-success"><?php echo esc_html_e('Purchase','taskbuilder');?></a>
     316                            </div>
     317                            <div>
     318                                <a href="https://taskbuilder.net/recurrent-task/" target="__blank" type="button" class="btn btn-success"><?php echo esc_html_e('View Details','taskbuilder');?></a>
     319                            </div>
     320                        </div>
     321                    </div>
     322                </div>
    296323            </div>
    297324        </div>
  • taskbuilder/trunk/includes/admin/projects/open_project/wppm_drag_and_drop_card.php

    r3079882 r3286301  
    1212if (!$wppm_card) {exit;}
    1313$wppm_card_id= substr($wppm_card, 20);
    14 $wppm_target_task_status = substr($target_task_status,25);
    15 $values= array(
    16     'status'=> $wppm_target_task_status
    17 );
    18 $wpdb->update($wpdb->prefix.'wppm_task',$values,array('id'=>intval($wppm_card_id)));
    19 echo '{ "sucess_status":"1","messege":"Success" }';
     14if($wppmfunction->has_permission('change_task_status',$wppm_card_id)){
     15    $wppm_target_task_status = substr($target_task_status,25);
     16    $task_data = $wppmfunction->get_task($wppm_card_id);
     17    $task_id = $wppm_card_id;
     18    $old_status_id = $task_data['status'];
     19    $status_id = esc_sql($wppm_target_task_status);
     20    $wppmfunction->change_status( $task_id, $status_id);
     21    $change_task_value = array('prev_status'=>"$old_status_id",'new_status'=>"$status_id");
     22    $change_task_obj = serialize($change_task_value);
     23    $log_values = array('task_id'=>"$task_id",'body'=>$change_task_obj,'attachment_ids'=>"",'create_time'=>date("Y-m-d h:i:sa"),'created_by'=>"$current_user->ID" );
     24    $wpdb->insert($wpdb->prefix . 'wppm_task_comment',$log_values);
     25    $log_id = esc_sql($wpdb->insert_id);
     26    $task_log_values = array('task_id'=>"$task_id",'comment_id'=>"$log_id",'comment_type'=>'change_task_status');
     27    $wpdb->insert($wpdb->prefix . 'wppm_task_comment_meta',$task_log_values);
     28    echo '{ "sucess_status":"1","messege":"Success" }';
     29}else{
     30    echo '{ "sucess_status":"0","messege":"You do not have permission to change this task status." }';
     31}
  • taskbuilder/trunk/includes/admin/projects/open_project/wppm_view_project_tasks.php

    r3226189 r3286301  
    1616$filter_by = isset($_POST['wppm_task_filter']) ? sanitize_text_field($_POST['wppm_task_filter']) : "all";
    1717$proj_filter = isset($_POST['wppm_proj_filter']) ? sanitize_text_field($_POST['wppm_proj_filter']) : "0";
     18$public_projects = isset($_POST['public_projects']) ? sanitize_text_field($_POST['public_projects']):"0";
    1819$wppm_current_user_capability = get_user_meta( $current_user->ID, 'wppm_capability', true );
    1920$filters = array(
     
    4142        $where = " where project_name = '".$proj_attr."' Group by proj.id ORDER BY '$santitize_order_by'";
    4243    }else{
    43         $where = " Group by proj.id ORDER BY '$santitize_order_by'";
     44        if(!empty($public_projects)){
     45            $where = " where proj.id = proj_meta.project_id AND proj_meta.meta_key='public_project' AND proj_meta.meta_value=1 Group by proj.id ORDER BY '$santitize_order_by'";
     46        }else{
     47            $where = " Group by proj.id ORDER BY '$santitize_order_by'";
     48        }
    4449    }
    4550}else{
    46     $where =  " where ((FIND_IN_SET($current_user->ID,proj.users)) OR (proj.id = proj_meta.project_id AND proj_meta.meta_key='public_project' AND proj_meta.meta_value=1) OR ( proj.created_by='$cu_id')) $wppm_proj_attr Group by proj.id ORDER BY '$santitize_order_by'";
     51    if(!empty($public_projects)){
     52        $where =  " where (proj.id = proj_meta.project_id AND proj_meta.meta_key='public_project' AND proj_meta.meta_value=1) $wppm_proj_attr Group by proj.id ORDER BY '$santitize_order_by'";
     53    } else{
     54        $where =  " where ((FIND_IN_SET($current_user->ID,proj.users)) OR (proj.id = proj_meta.project_id AND proj_meta.meta_key='public_project' AND proj_meta.meta_value=1) OR ( proj.created_by='$cu_id')) $wppm_proj_attr Group by proj.id ORDER BY '$santitize_order_by'";
     55    }
    4756}
    4857$where = apply_filters('wppm_project_filter_in_task_list_grid_view_where',$where);
     
    101110                        ");
    102111                $no_of_rows = ( "SELECT count(*) FROM ($query");
    103                 $where = " where $wppm_tl_filter AND $wppm_task_by_proj_filter AND (Task.task_name LIKE '$search_tag_text' OR proj.project_name LIKE '$search_tag_text' OR task_statuses.name LIKE '$search_tag_text' OR task_priorities.name LIKE '$search_tag_text' OR user.display_name LIKE '$search_tag_text') AND Task.status='$status_id' ";
     112                if(!empty($public_projects)){
     113                    $where = " where (proj_meta.meta_key='public_project' AND proj_meta.meta_value=1) AND $wppm_tl_filter AND $wppm_task_by_proj_filter AND (Task.task_name LIKE '$search_tag_text' OR proj.project_name LIKE '$search_tag_text' OR task_statuses.name LIKE '$search_tag_text' OR task_priorities.name LIKE '$search_tag_text' OR user.display_name LIKE '$search_tag_text') AND Task.status='$status_id' ";
     114                }else{
     115                    $where = " where $wppm_tl_filter AND $wppm_task_by_proj_filter AND (Task.task_name LIKE '$search_tag_text' OR proj.project_name LIKE '$search_tag_text' OR task_statuses.name LIKE '$search_tag_text' OR task_priorities.name LIKE '$search_tag_text' OR user.display_name LIKE '$search_tag_text') AND Task.status='$status_id' ";
     116                }
    104117            } else{
    105118                $query = ("SELECT Task.*
     
    113126                    ");
    114127                $no_of_rows = ( "SELECT count(*) FROM ($query");
    115                 $where = " where $wppm_tl_filter AND $wppm_task_by_proj_filter AND (((FIND_IN_SET('$current_user->ID',Task.users)>0) OR (Task.created_by= '$cu_id') OR (proj_users.user_id = '$cu_id' AND proj_users.role_id = 1 AND (FIND_IN_SET('$current_user->ID',proj.users)>0)) OR (Task.project = proj_meta.project_id AND proj_meta.meta_key='public_project' AND proj_meta.meta_value=1) OR proj.created_by='$cu_id') AND (Task.task_name LIKE '$search_tag_text' OR proj.project_name LIKE '$search_tag_text' OR task_statuses.name LIKE '$search_tag_text' OR task_priorities.name LIKE '$search_tag_text' OR user.display_name LIKE '$search_tag_text')) AND Task.status= '$status_id'";
     128                if(!empty($public_projects)){
     129                    $where = " where (proj_meta.meta_key='public_project' AND proj_meta.meta_value=1) AND $wppm_tl_filter AND $wppm_task_by_proj_filter AND (Task.task_name LIKE '$search_tag_text' OR proj.project_name LIKE '$search_tag_text' OR task_statuses.name LIKE '$search_tag_text' OR task_priorities.name LIKE '$search_tag_text' OR user.display_name LIKE '$search_tag_text')) AND Task.status= '$status_id'";
     130                }else{
     131                    $where = " where $wppm_tl_filter AND $wppm_task_by_proj_filter AND (((FIND_IN_SET('$current_user->ID',Task.users)>0) OR (Task.created_by= '$cu_id') OR (proj_users.user_id = '$cu_id' AND proj_users.role_id = 1 AND (FIND_IN_SET('$current_user->ID',proj.users)>0)) OR (Task.project = proj_meta.project_id AND proj_meta.meta_key='public_project' AND proj_meta.meta_value=1) OR proj.created_by='$cu_id') AND (Task.task_name LIKE '$search_tag_text' OR proj.project_name LIKE '$search_tag_text' OR task_statuses.name LIKE '$search_tag_text' OR task_priorities.name LIKE '$search_tag_text' OR user.display_name LIKE '$search_tag_text')) AND Task.status= '$status_id'";
     132                }
    116133            }
    117134        }else{
     
    122139                ");
    123140                $no_of_rows = ( "SELECT count(*) FROM ($query");
    124                 $where = " where $wppm_tl_filter AND $wppm_task_by_proj_filter AND Task.status= '$status_id'";
     141                if(!empty($public_projects)){
     142                    $where = " where (proj_meta.meta_key='public_project' AND proj_meta.meta_value=1) AND $wppm_tl_filter AND $wppm_task_by_proj_filter AND Task.status= '$status_id'";
     143                }else{
     144                    $where = " where $wppm_tl_filter AND $wppm_task_by_proj_filter AND Task.status= '$status_id'";
     145                }
    125146            }else{
    126147                $query = ( "SELECT Task.*
     
    131152                    ");
    132153                $no_of_rows = ( "SELECT count(*) FROM ($query");
    133                 $where = " where $wppm_tl_filter AND $wppm_task_by_proj_filter AND ((FIND_IN_SET('$current_user->ID',Task.users)>0) OR (Task.created_by= '$cu_id') OR (proj_users.user_id = '$cu_id' AND proj_users.role_id = 1 AND (FIND_IN_SET('$current_user->ID',proj.users)>0)) OR (Task.project = proj_meta.project_id AND proj_meta.meta_key='public_project' AND proj_meta.meta_value=1) OR proj.created_by='$cu_id') AND Task.status= '$status_id'";
     154                if(!empty($public_projects)){
     155                    $where = " where (proj_meta.meta_key='public_project' AND proj_meta.meta_value=1) AND $wppm_tl_filter AND $wppm_task_by_proj_filter AND Task.status= '$status_id'";
     156                } else{
     157                    $where = " where $wppm_tl_filter AND $wppm_task_by_proj_filter AND ((FIND_IN_SET('$current_user->ID',Task.users)>0) OR (Task.created_by= '$cu_id') OR (proj_users.user_id = '$cu_id' AND proj_users.role_id = 1 AND (FIND_IN_SET('$current_user->ID',proj.users)>0)) OR (Task.project = proj_meta.project_id AND proj_meta.meta_key='public_project' AND proj_meta.meta_value=1) OR proj.created_by='$cu_id') AND Task.status= '$status_id'";
     158                }
    134159            }
    135160        }
  • taskbuilder/trunk/includes/admin/tasks/open_task/wppm_open_task.php

    r3254059 r3286301  
    7575}
    7676$flag = false;
    77 $wppm_task_fillter = $wpdb->get_results("SELECT * FROM {$wpdb->prefix}wppm_task");
     77$wppm_task_fillter = $wpdb->get_results("SELECT * FROM {$wpdb->prefix}wppm_task where id='".esc_sql($id)."'");
    7878if(!empty($wppm_task_fillter)){
    7979  foreach($wppm_task_fillter as $key_filter=>$val_filter){
  • taskbuilder/trunk/includes/admin/tasks/wppm_tasks_list.php

    r3254059 r3286301  
    1212$proj_filter = isset($_POST['wppm_proj_filter']) ? sanitize_text_field($_POST['wppm_proj_filter']) : "0";
    1313$proj_attr = isset($_POST['wppm_project_attr']) ? sanitize_text_field($_POST['wppm_project_attr']):"";
     14$public_projects = isset($_POST['public_projects']) ? sanitize_text_field($_POST['public_projects']):"0";
    1415$wppm_current_user_capability = get_user_meta( $current_user->ID, 'wppm_capability', true );
    1516$wppm_create_tasks_coworkers_permission = get_option('wppm_allow_coworkers_create_task');
     
    3334    $where = " where project_name = '".$proj_attr."' Group by proj.id ORDER BY ".$orderby_proj_sql;
    3435  }else{
    35     $where = " Group by proj.id ORDER BY ".$orderby_proj_sql;
     36    if(!empty($public_projects)){
     37      $where = " where proj.id = proj_meta.project_id AND proj_meta.meta_key='public_project' AND proj_meta.meta_value=1 Group by proj.id ORDER BY ".$orderby_proj_sql;
     38    }else{
     39      $where = " Group by proj.id ORDER BY ".$orderby_proj_sql;
     40    }
    3641  }
    3742}else{
    38   $where =  " where ((FIND_IN_SET('$current_user->ID',proj.users)) OR (proj.id = proj_meta.project_id AND proj_meta.meta_key='public_project' AND proj_meta.meta_value=1) OR ( proj.created_by='$cu_id')) $wppm_proj_attr Group by proj.id ORDER BY $orderby_proj_sql";
     43  if(!empty($public_projects)){
     44    $where =  " where (proj.id = proj_meta.project_id AND proj_meta.meta_key='public_project' AND proj_meta.meta_value=1) $wppm_proj_attr Group by proj.id ORDER BY $orderby_proj_sql";
     45  }
     46  else{
     47    $where =  " where ((FIND_IN_SET('$current_user->ID',proj.users)) OR (proj.id = proj_meta.project_id AND proj_meta.meta_key='public_project' AND proj_meta.meta_value=1) OR ( proj.created_by='$cu_id')) $wppm_proj_attr Group by proj.id ORDER BY $orderby_proj_sql";
     48  }
    3949}
    4050$where = apply_filters('wppm_project_filter_in_task_list_where',$where);
     
    152162if(!empty($search_tag )){
    153163  if($current_user->has_cap('manage_options') || $wppm_current_user_capability == 'wppm_admin'){
    154     $where = " where $wppm_tl_filter AND $wppm_task_by_proj_filter AND (Task.task_name LIKE '$search_tag_text' OR proj.project_name LIKE '$search_tag_text' OR task_statuses.name LIKE '$search_tag_text' OR task_priorities.name LIKE '$search_tag_text' OR user.display_name LIKE '$search_tag_text') $wppm_proj_attr ";
     164    if(!empty($public_projects)){
     165      $where = " where (proj_meta.meta_key='public_project' AND proj_meta.meta_value=1) AND $wppm_tl_filter AND $wppm_task_by_proj_filter AND (Task.task_name LIKE '$search_tag_text' OR proj.project_name LIKE '$search_tag_text' OR task_statuses.name LIKE '$search_tag_text' OR task_priorities.name LIKE '$search_tag_text' OR user.display_name LIKE '$search_tag_text') $wppm_proj_attr ";
     166    }else{
     167      $where = " where $wppm_tl_filter AND $wppm_task_by_proj_filter AND (Task.task_name LIKE '$search_tag_text' OR proj.project_name LIKE '$search_tag_text' OR task_statuses.name LIKE '$search_tag_text' OR task_priorities.name LIKE '$search_tag_text' OR user.display_name LIKE '$search_tag_text') $wppm_proj_attr ";
     168    }
    155169  } else{
    156     $where = " where $wppm_tl_filter AND $wppm_task_by_proj_filter AND (((FIND_IN_SET('$current_user->ID',Task.users)>0) OR (Task.created_by= '$cu_id') OR (proj_users.user_id = '$cu_id' AND proj_users.role_id = 1 AND (FIND_IN_SET('$current_user->ID',proj.users)>0)) OR (Task.project = proj_meta.project_id AND proj_meta.meta_key='public_project' AND proj_meta.meta_value=1) OR (proj.created_by='$cu_id' AND (FIND_IN_SET('$current_user->ID',proj.users)>0))) AND (Task.task_name LIKE '$search_tag_text' OR proj.project_name LIKE '$search_tag_text' OR task_statuses.name LIKE '$search_tag_text' OR task_priorities.name LIKE '$search_tag_text' OR user.display_name LIKE '$search_tag_text')) $wppm_proj_attr";
     170    if(!empty($public_projects)){
     171      $where = " where (proj_meta.meta_key='public_project' AND proj_meta.meta_value=1) AND $wppm_tl_filter AND $wppm_task_by_proj_filter AND (((FIND_IN_SET('$current_user->ID',Task.users)>0) OR (Task.created_by= '$cu_id') OR (proj_users.user_id = '$cu_id' AND proj_users.role_id = 1 AND (FIND_IN_SET('$current_user->ID',proj.users)>0)) OR (Task.project = proj_meta.project_id AND proj_meta.meta_key='public_project' AND proj_meta.meta_value=1) OR (proj.created_by='$cu_id' AND (FIND_IN_SET('$current_user->ID',proj.users)>0))) AND (Task.task_name LIKE '$search_tag_text' OR proj.project_name LIKE '$search_tag_text' OR task_statuses.name LIKE '$search_tag_text' OR task_priorities.name LIKE '$search_tag_text' OR user.display_name LIKE '$search_tag_text')) $wppm_proj_attr";
     172    }else{
     173      $where = " where $wppm_tl_filter AND $wppm_task_by_proj_filter AND (((FIND_IN_SET('$current_user->ID',Task.users)>0) OR (Task.created_by= '$cu_id') OR (proj_users.user_id = '$cu_id' AND proj_users.role_id = 1 AND (FIND_IN_SET('$current_user->ID',proj.users)>0)) OR (Task.project = proj_meta.project_id AND proj_meta.meta_key='public_project' AND proj_meta.meta_value=1) OR (proj.created_by='$cu_id' AND (FIND_IN_SET('$current_user->ID',proj.users)>0))) AND (Task.task_name LIKE '$search_tag_text' OR proj.project_name LIKE '$search_tag_text' OR task_statuses.name LIKE '$search_tag_text' OR task_priorities.name LIKE '$search_tag_text' OR user.display_name LIKE '$search_tag_text')) $wppm_proj_attr";
     174    }
    157175  }
    158176}else{
    159177  if($current_user->has_cap('manage_options') || $wppm_current_user_capability == 'wppm_admin'){
    160     $where = " where $wppm_tl_filter AND $wppm_task_by_proj_filter $wppm_proj_attr";
     178    if(!empty($public_projects)){
     179      $where = " where (proj_meta.meta_key='public_project' AND proj_meta.meta_value=1) AND $wppm_tl_filter AND $wppm_task_by_proj_filter $wppm_proj_attr";
     180    }else{
     181      $where = " where $wppm_tl_filter AND $wppm_task_by_proj_filter $wppm_proj_attr";
     182    }
    161183  } else{
    162     $where = " where $wppm_tl_filter AND $wppm_task_by_proj_filter AND ((FIND_IN_SET('$current_user->ID',Task.users)>0) OR (Task.created_by= '$cu_id') OR (proj_users.user_id = '$cu_id' AND proj_users.role_id = 1 AND (FIND_IN_SET('$current_user->ID',proj.users)>0)) OR (Task.project = proj_meta.project_id AND proj_meta.meta_key='public_project' AND proj_meta.meta_value=1) OR (proj.created_by='$cu_id' AND (FIND_IN_SET('$current_user->ID',proj.users)>0))) $wppm_proj_attr";
     184    if(!empty($public_projects)){
     185      $where = " where  (proj_meta.meta_key='public_project' AND proj_meta.meta_value=1) AND $wppm_tl_filter AND $wppm_task_by_proj_filter $wppm_proj_attr";
     186    }else{
     187      $where = " where $wppm_tl_filter AND $wppm_task_by_proj_filter AND ((FIND_IN_SET('$current_user->ID',Task.users)>0) OR (Task.created_by= '$cu_id') OR (proj_users.user_id = '$cu_id' AND proj_users.role_id = 1 AND (FIND_IN_SET('$current_user->ID',proj.users)>0)) OR (Task.project = proj_meta.project_id AND proj_meta.meta_key='public_project' AND proj_meta.meta_value=1) OR (proj.created_by='$cu_id' AND (FIND_IN_SET('$current_user->ID',proj.users)>0))) $wppm_proj_attr";
     188    }
    163189  }
    164190}
  • taskbuilder/trunk/includes/class-wppm-frontend.php

    r3254059 r3286301  
    1313            add_shortcode( 'wppm_projects', array( $this, 'wppm_projects' ) );
    1414            add_shortcode( 'wppm_tasks', array( $this, 'wppm_tasks' ) );
     15            add_shortcode( 'wppm_public_projects_tasks', array( $this, 'wppm_public_projects_tasks' ) );
    1516            add_action('wp_ajax_nopriv_wppm_sign_in',array($this,'wppm_sign_in'));
    1617            add_action('wp_ajax_nopriv_wppm_set_user_login',array($this,'wppm_set_user_login'));   
     
    7677        }
    7778
     79        function wppm_public_projects_tasks(){
     80            ob_start();
     81            include WPPM_ABSPATH.'includes/frontend/wppm_public_projects_tasks.php';
     82            return ob_get_clean();
     83        }
     84
    7885    }
    7986endif;
  • taskbuilder/trunk/readme.txt

    r3265149 r3286301  
    44Tags: project,project management,task management,task manager,Kanban
    55Requires at least: 4.4
    6 Tested up to: 6.7.2
    7 Stable tag: 4.0.2
     6Tested up to: 6.8.1
     7Stable tag: 4.0.3
    88License: GPL v3
    99
     
    2121[wppm_tasks_calendar] - Use Calendar on front-end(pro feature).
    2222[wppm_tasks project ="insert project name here"]- If you want to display only selected project's task on page, you can add attribute as project name to tasks shortcode. It will only display tasks of selected project.
     23[wppm_public_projects_tasks] = Display public project's tasks from frontend.
    2324
    2425`
     
    5758* [Due Date Reminder](https://taskbuilder.net/due-date-reminder/) - Due date reminder are super helpful for keeping your team on track to hit deadlines. Email notification will send to customer before due date of task.
    5859* [Usergroup](https://taskbuilder.net/usergroup/) - Using usergroup add-on you can assign group of users to project and those group assign to project can be assign to tasks of project.
     60* [Recurrent Task] (https://taskbuilder.net/recurrent-task/) - Recurrent Tasks add-on allow administrators to effortlessly schedule recurring tasks for routine tasks The system automatically generates these tasks at the defined times, providing a streamlined approach to essential and repetitive processes. With versatile recurrence periods, customizable scheduling options, and the ability to set start and end dates.
    5961
    6062## 👨‍💻 DOCUMENTATION AND SUPPORT ##
     
    113115
    114116== Changelog ==
     117= V 4.0.3(May 2, 2025) =
     118* New: Public project's shortcode. You can use [wppm_public_projects_tasks] shortcode to display public project's tasks from frontend.
     119* Fix: If cowerkers permission disable for to change task status, cowerkers still change status by drag and drop feature in kanban view.
     120* Fix: When status change by drag and drop cards in kanban view, change status log not added in open task form.
     121* New (pro feature): Recurrent Task add-on.
     122
    115123= V 4.0.2(April 1,2025) =
    116124* Fix: SQL Injection.
     
    131139* Fix: If status name change from setting, changes not reflect on filter of task list, project list.
    132140* New: Rich Text Editor Setting. You can enable/disable Rich Text Editor from setting( Dashboard > projects > Settings > Rich Text Editor).
    133 * New(Pro feature): You can rearrange custom fields. By that order, custom fields will display in create task form.
     141* New(Pro feature): You can rearrange custom fields. By that order custom fields will display in create task form.
    134142
    135143= V 3.0.8(Dec 25,2024) =
  • taskbuilder/trunk/taskbuilder.php

    r3265149 r3286301  
    44 * Plugin URI: https://wordpress.org/plugins/taskbuilder/
    55 * Description: Wordpress Project & Task Management plugin. Easy to keep track of projects & tasks!
    6  * Version: 4.0.2
     6 * Version: 4.0.3
    77 * Author: Taskbuilder Team
    88 * Author URI: https://taskbuilder.net/
    99 * Requires at least: 4.4
    10  * Tested up to: 6.7.2
     10 * Tested up to: 6.8.1
    1111 * Text Domain: taskbuilder
    1212 * Domain Path: /lang
     
    2020 
    2121  final class WP_Taskbuilder {
    22     public $version    = '4.0.2';
     22    public $version    = '4.0.3';
    2323    public function __construct() {
    2424      // define global constants
Note: See TracChangeset for help on using the changeset viewer.