PluginProbe
Taskbuilder – Project Management & Task Management Tool With Kanban Board / 6.0.7
Taskbuilder – Project Management & Task Management Tool With Kanban Board v6.0.7
6.0.7 6.0.6 6.0.5 6.0.2 6.0.3 6.0.4 6.0.1 6.0.0 5.0.8 5.0.9 4.0.9 5.0.0 5.0.1 5.0.2 5.0.3 5.0.4 5.0.5 5.0.6 5.0.7 trunk 1.0.0 1.0.1 1.0.2 1.0.3 1.0.4 All 59 releases
← All changes | includes/admin/projects/open_project/wppm_view_project_tasks.php +28 -6 6.0.2 → 6.0.7 View file →
@@ -242,8 +242,21 @@
242 242 }elseif($filter_by == 'mine'){
243 243 $wppm_tl_filter = "(FIND_IN_SET('$current_user->ID',Task.users)>0)";
244 244 }elseif($filter_by == 'archived'){
245 245 $wppm_tl_filter = "Task.is_archived = 1";
246 +}elseif($filter_by == 'today'){
247 + $wppm_tl_filter = "DATE(Task.end_date) = CURDATE()";
248 +}elseif($filter_by == 'upcoming'){
249 + $wppm_tl_filter = "DATE(Task.end_date) BETWEEN CURDATE() AND DATE_ADD(CURDATE(), INTERVAL 7 DAY) AND Task.status != 4 AND Task.active = 1 AND Task.is_archived = 0";
250 +}elseif ($filter_by == 'mytasks') {
251 + $wppm_tl_filter = "(
252 + FIND_IN_SET('$current_user->ID', Task.users)
253 + OR Task.created_by = '$current_user->ID'
254 + )
255 + AND Task.status != 4
256 + AND Task.active = 1
257 + AND Task.is_archived = 0";
258 +
246 259 }
247 260
248 261 if(!empty($tl_advanced_filters['created_by'])){
249 262 $created_by_ids = array_map('intval', $tl_advanced_filters['created_by']);
@@ -262,13 +275,13 @@
262 275 $wppm_tl_filter .= " AND Task.priority IN (" . implode(',', $priority) . ")";
263 276 }
264 277 if(!empty($tl_advanced_filters['start_date'])){
265 278 $start_date = sanitize_text_field($tl_advanced_filters['start_date']);
266 - $wppm_tl_filter .= " AND (CAST(Task.start_date AS DATE)) >= '$start_date'";
279 + $wppm_tl_filter .= $wpdb->prepare(" AND (CAST(Task.start_date AS DATE)) >= %s", $start_date);
267 280 }
268 281 if(!empty($tl_advanced_filters['end_date'])){
269 282 $end_date = sanitize_text_field($tl_advanced_filters['end_date']);
270 - $wppm_tl_filter .= " AND (CAST(Task.end_date AS DATE)) <= '$end_date'";
283 + $wppm_tl_filter .= $wpdb->prepare(" AND (CAST(Task.end_date AS DATE)) <= %s", $end_date);
271 284 }
272 285
273 286 $advanced_conditions = [];
274 287 // Created By
@@ -292,18 +305,20 @@
292 305 }
293 306 // Start Date
294 307 if (!empty($advanced_filter['start_date'])) {
295 308 $start_date = sanitize_text_field($advanced_filter['start_date']);
296 - $advanced_conditions[] = "(CAST(Task.start_date AS DATE)) >= '$start_date'";
309 + $advanced_conditions[] = $wpdb->prepare("(CAST(Task.start_date AS DATE)) >= %s", $start_date);
297 310 }
298 311 // End Date
299 312 if (!empty($advanced_filter['end_date'])) {
300 313 $end_date = sanitize_text_field($advanced_filter['end_date']);
301 - $advanced_conditions[] = "(CAST(Task.end_date AS DATE)) <= '$end_date'";
314 + $advanced_conditions[] = $wpdb->prepare("(CAST(Task.end_date AS DATE)) <= %s", $end_date);
302 315 }
303 316 if (!empty($advanced_conditions)) {
304 317 $wppm_tl_filter .= " AND " . implode(" AND ", $advanced_conditions);
305 318 }
319 +// Subtasks are shown only within their parent task, never as their own row/card in project views.
320 +$wppm_tl_filter .= " AND (Task.parent_task_id = 0 OR Task.parent_task_id IS NULL)";
306 321
307 322 if(!empty($wppm_hide_task_statuses_from_frontend) && is_array($wppm_hide_task_statuses_from_frontend) && (isset($_POST['is_frontend']) && sanitize_text_field($_POST['is_frontend'])==1)){
308 323 foreach($wppm_hide_task_statuses_from_frontend as $status){
309 324 $wppm_tl_filter .= " AND Task.status != '$status'";
@@ -687,9 +702,9 @@
687 702 </div>
688 703 <!-- FILTER BUTTON -->
689 704 <div class="tb-filters" class="wppm-filter-item" style="display:flex;margin-left: 4px;">
690 705 <div class="tb-filter-bar">
691 - <span id="tb-advanced-toggle" class="tb-btn" style="margin-bottom: 10px;">
706 + <span id="tb-advanced-toggle" class="tb-btn" style="margin-bottom: 23px;">
692 707 <?php echo esc_html_e('⚙️ Filters', 'taskbuilder'); ?>
693 708 </span>
694 709 <!-- ACTIVE FILTER CHIPS -->
695 710 <div id="tb-active-filters" class="tb-chips"></div>
@@ -750,9 +765,9 @@
750 765 </div>
751 766 <div id="tb-backdrop"></div>
752 767 </div>
753 768 <div class="wppm_display_submit">
754 - <div class="wppm-filter-actions">
769 + <div class="wppm-filter-actions" style="margin-bottom: 23px;">
755 770 <span class="wppm-link" onclick="wppm_tl_reset_grid_view_filter('<?php echo esc_attr($page)?>',<?php echo esc_attr($id)?>)"> <?php echo esc_html__('Reset','taskbuilder');?></span>
756 771 </div>
757 772 </div>
758 773 </div>
@@ -1037,8 +1052,9 @@
1037 1052 window.filters.id = <?php echo esc_attr($id); ?>;
1038 1053 <?php } ?>
1039 1054
1040 1055 var filters = window.filters;
1056 +var wppm_task_filter = <?php echo wp_json_encode($filter_by); ?>;
1041 1057 jQuery( document ).ready( function( jQuery ) {
1042 1058 dragula([
1043 1059 <?php foreach($task_status as $status) { ?>
1044 1060 document.getElementById("wppm_card_body_container_<?php echo esc_attr($status->id) ?>"),
@@ -1249,8 +1265,14 @@
1249 1265 wppm_display_grid_view('<?php echo esc_js($page) ?>','<?php echo esc_js($id) ?>');
1250 1266 });
1251 1267 }
1252 1268 function wppm_tl_reset_grid_view_filter(page,id){
1269 + var url = new URL(window.location.href);
1270 + if (url.searchParams.has('wppm_task_filter')) {
1271 + url.searchParams.delete('wppm_task_filter');
1272 + window.location.href = url.toString();
1273 + return false;
1274 + }
1253 1275 jQuery('#wppm_task_container').html(wppm_admin.loading_html);
1254 1276 var data = {
1255 1277 action: 'wppm_view_project_tasks',
1256 1278 wppm_task_filter:'all',