PluginProbe
Taskbuilder – Project Management & Task Management Tool With Kanban Board / 6.0.6
Taskbuilder – Project Management & Task Management Tool With Kanban Board v6.0.6
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 1.0.5 All 58 releases
← All changes | includes/admin/projects/open_project/wppm_view_project_tasks.php +757 -63 5.0.66.0.6 View file →
@@ -17,10 +17,55 @@
17 17 $project_id = isset($_POST['project_id']) ? intval(sanitize_text_field(wp_unslash($_POST['project_id']))) : "0";
18 18 $wppm_date_setting = get_option('wppm_date_setting');
19 19 $search_tag = isset($_POST['task_search']) ? sanitize_text_field(wp_unslash($_POST['task_search'])) : '';
20 20 $filter_by = isset($_POST['wppm_task_filter']) ? sanitize_text_field(wp_unslash($_POST['wppm_task_filter'])) : "all";
21 -$proj_filter = isset($_POST['wppm_proj_filter']) ? sanitize_text_field(wp_unslash($_POST['wppm_proj_filter'])) : "0";
21 +$proj_filter = isset($_POST['wppm_proj_filter']) ? absint(wp_unslash($_POST['wppm_proj_filter'])) : "0";
22 22 $public_projects = isset($_POST['public_projects']) ? sanitize_text_field(wp_unslash($_POST['public_projects'])):"0";
23 +/**
24 + * PRIORITIES
25 + */
26 +$priorities = $wpdb->get_results("SELECT id, name FROM {$wpdb->prefix}wppm_task_priorities ORDER BY id ASC");
27 +/**
28 + * USERS
29 + */
30 +$users = get_users(array('orderby' => 'display_name','order' => 'ASC',));
31 +/**
32 + * ASSIGNED USERS
33 + */
34 +$assigned_rows = $wpdb->get_col( "SELECT users FROM {$wpdb->prefix}wppm_task WHERE users IS NOT NULL AND users != ''");
35 +$all_assigned = array();
36 +if (!empty($assigned_rows)) {
37 + foreach ($assigned_rows as $row) {
38 + // Handle comma separated IDs
39 + $ids = explode(',', $row);
40 + foreach ($ids as $uid) {
41 + $uid = absint(trim($uid));
42 + if ($uid > 0) {
43 + $all_assigned[$uid] = $uid;
44 + }
45 + }
46 + }
47 +}
48 +// Final unique IDs
49 +$all_assigned = array_values($all_assigned);
50 +if (isset($_POST['filters'])) {
51 + if (is_string($_POST['filters'])) {
52 + $advanced_filter = json_decode(stripslashes( sanitize_text_field(wp_unslash($_POST['filters']) ) ),true );
53 + } elseif (is_array($_POST['filters'])) {
54 + $raw_filters = wp_unslash($_POST['filters']);
55 + $advanced_filter = [
56 + 'created_by' => array_map('absint', (array) ($raw_filters['created_by'] ?? [])),
57 + 'assigned' => array_map('absint', (array) ($raw_filters['assigned'] ?? [])),
58 + 'priority' => array_map('absint', (array) ($raw_filters['priority'] ?? [])),
59 + 'start_date' => sanitize_text_field($raw_filters['start_date'] ?? ''),
60 + 'end_date' => sanitize_text_field($raw_filters['end_date'] ?? ''),
61 + ];
62 + } else {
63 + $advanced_filter = [];
64 + }
65 +}else{
66 + $advanced_filter = [];
67 +}
23 68 $wppm_current_user_capability = get_user_meta( $current_user->ID, 'wppm_capability', true );
24 69 $wppm_hide_completed_status_task = get_option('wppm_hide_completed_status_task');
25 70 $wppm_hide_task_statuses_from_frontend = get_option('wppm_hide_task_statuses_from_frontend');
26 71 $wppm_deafault_time_duration_task = get_option('wppm_display_time_duration_task');
@@ -35,30 +80,61 @@
35 80 'proj_filter'=>$proj_filter
36 81 );
37 82 $grid_view_filter = $filters ;
38 83 $tl_filters = isset( $_COOKIE['wppm_grid_view_filters'] ) ? sanitize_text_field( wp_unslash( $_COOKIE['wppm_grid_view_filters'] ) ) : $grid_view_filter;
84 +$tl_advanced_filters = [];
85 +if($id != 0){
86 + if ( isset($_COOKIE['tb_kanban_filters']) ) {
87 + $tl_advanced_filters = json_decode(
88 + stripslashes($_COOKIE['tb_kanban_filters']),
89 + true
90 + );
91 + if ( ! is_array($tl_advanced_filters) ) {
92 + $tl_advanced_filters = [];
93 + }
94 + }
95 +}else{
96 + if ( isset($_COOKIE['tb_filters']) ) {
97 + $tl_advanced_filters = json_decode(
98 + stripslashes($_COOKIE['tb_filters']),
99 + true
100 + );
101 + if ( ! is_array($tl_advanced_filters) ) {
102 + $tl_advanced_filters = [];
103 + }
104 + }
105 +}
106 +
107 +//$tl_advanced_filters = isset( $_COOKIE['wppm_advanced_filters'] ) ? sanitize_text_field( wp_unslash( $_COOKIE['wppm_advanced_filters'] ) ) : $tl_advanced_filters;
108 +$filter_values = !empty($advanced_filter)
109 + ? $advanced_filter
110 + : $tl_advanced_filters;
39 111 $current_date = wp_date('Y-m-d');
40 -$proj_attr = isset($_POST['wppm_project_attr']) ? sanitize_text_field(wp_unslash($_POST['wppm_project_attr'])):"";
41 -$archived_where = " AND is_archived = 0";
112 +$proj_attr = isset($_POST['wppm_project_attr']) ? absint(wp_unslash($_POST['wppm_project_attr'])):"";
113 +$archived_where = " AND Task.is_archived = 0";
42 114 if ( isset($page) && $page === 'wppm-archived-tasks' ) {
43 - $archived_where = " AND is_archived = 1";
115 + $archived_where = " AND Task.is_archived = 1";
44 116 }
45 117 if( isset($page) && $page === 'wppm-tasks'){
46 - $archived_where = " AND is_archived = 0";
118 + $archived_where = " AND Task.is_archived = 0";
47 119 }
48 -if(!empty($proj_attr )){
49 - $proj_attr = esc_sql($proj_attr);
50 - $wppm_proj_attr = ' AND (proj.project_name = "'.$proj_attr.'")';
51 -}else{
52 - $wppm_proj_attr = '';
120 +if (!empty($proj_attr)) {
121 + $wppm_proj_attr = $wpdb->prepare(
122 + ' AND proj.project_name = %s',
123 + $proj_attr
124 + );
125 +} else {
126 + $wppm_proj_attr = '';
53 127 }
54 -if ( $id != 0 || $project_id != 0 ) {
55 - if($project_id != 0){
56 - $id = $project_id;
57 - }
58 - $wppm_project_filter = " AND Task.project = " . intval($id);
128 +if ($id != 0 || $project_id != 0) {
129 + $final_project_id = ($project_id != 0) ? intval($project_id) : intval($id);
130 + $wppm_project_filter = $wpdb->prepare(
131 + ' AND Task.project = %d',
132 + $final_project_id
133 + );
59 134 } else {
60 - $wppm_project_filter = "1=1";
135 +
136 + $wppm_project_filter = '';
61 137 }
62 138
63 139 $query = ("SELECT proj.*
64 140 FROM {$wpdb->prefix}wppm_project AS proj
@@ -66,21 +142,66 @@
66 142 $santitize_order_by = esc_sql(sanitize_sql_orderby( "project_name ASC" ));
67 143 if($current_user->has_cap('manage_options') || $wppm_current_user_capability == 'wppm_admin'){
68 144 if(!empty($proj_attr )){
69 145 $proj_attr = esc_sql($proj_attr);
70 - $where = " where project_name = '".$proj_attr."' Group by proj.id ORDER BY '$santitize_order_by'";
146 + $where = $wpdb->prepare(
147 + " WHERE proj.project_name = %s AND proj.is_archived = 0
148 + GROUP BY proj.id
149 + ORDER BY {$santitize_order_by}",
150 + $proj_attr
151 + );
71 152 }else{
72 153 if(!empty($public_projects)){
73 - $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'";
154 + $where = $wpdb->prepare(
155 + " WHERE proj.id = proj_meta.project_id
156 + AND proj_meta.meta_key = %s
157 + AND proj_meta.meta_value = %d
158 + AND proj.is_archived = 0
159 + {$wppm_proj_attr}
160 + GROUP BY proj.id
161 + ORDER BY {$santitize_order_by}",
162 + 'public_project',
163 + 1
164 + );
74 165 }else{
75 - $where = " Group by proj.id ORDER BY '$santitize_order_by'";
166 + $where = " WHERE proj.is_archived = 0 GROUP BY proj.id ORDER BY '$santitize_order_by'";
76 167 }
77 168 }
78 169 }else{
79 170 if(!empty($public_projects)){
80 - $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'";
171 + $where = $wpdb->prepare(
172 + " WHERE (
173 + proj.id = proj_meta.project_id
174 + AND proj_meta.meta_key = %s
175 + AND proj_meta.meta_value = %d
176 + )
177 + {$wppm_proj_attr} AND proj.is_archived = 0
178 + GROUP BY proj.id
179 + ORDER BY {$santitize_order_by}",
180 + 'public_project',
181 + 1
182 + );
81 183 } else{
82 - $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'";
184 + $where = $wpdb->prepare(
185 + " WHERE (
186 + FIND_IN_SET(%d, proj.users) AND proj.is_archived = 0
187 + OR (
188 + proj.id = proj_meta.project_id
189 + AND proj_meta.meta_key = %s
190 + AND proj_meta.meta_value = %d
191 + )
192 + OR (
193 + proj.created_by = %d
194 + )
195 + )
196 + {$wppm_proj_attr}
197 + GROUP BY proj.id
198 + ORDER BY {$santitize_order_by}",
199 + $current_user->ID,
200 + 'public_project',
201 + 1,
202 + $cu_id
203 + );
83 204 }
84 205 }
85 206 $where = apply_filters('wppm_project_filter_in_task_list_grid_view_where',$where);
86 207 $query.= $where;
@@ -93,9 +214,9 @@
93 214 $tl_filters_arr = $filters;
94 215 }
95 216 $search_tag = isset($_POST['task_search']) ? sanitize_text_field(wp_unslash($_POST['task_search'])) : $tl_filters_arr['search'];
96 217 $filter_by = isset($_POST['wppm_task_filter']) ? sanitize_text_field(wp_unslash($_POST['wppm_task_filter'])) : $tl_filters_arr['filter'];
97 -$proj_filter = isset($_POST['wppm_proj_filter']) ? sanitize_text_field(wp_unslash($_POST['wppm_proj_filter'])) : $tl_filters_arr['proj_filter'];
218 +$proj_filter = isset($_POST['wppm_proj_filter']) ? absint(wp_unslash($_POST['wppm_proj_filter'])) : $tl_filters_arr['proj_filter'];
98 219 $filters = array(
99 220 'search'=>$search_tag,
100 221 'filter'=>$filter_by,
101 222 'proj_filter' =>$proj_filter
@@ -121,10 +242,84 @@
121 242 }elseif($filter_by == 'mine'){
122 243 $wppm_tl_filter = "(FIND_IN_SET('$current_user->ID',Task.users)>0)";
123 244 }elseif($filter_by == 'archived'){
124 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 +
125 259 }
126 260
261 +if(!empty($tl_advanced_filters['created_by'])){
262 + $created_by_ids = array_map('intval', $tl_advanced_filters['created_by']);
263 + $wppm_tl_filter .= " AND Task.created_by IN (" . implode(',', $created_by_ids) . ")";
264 +}
265 +if(!empty($tl_advanced_filters['assigned'])){
266 + $assigned_ids = array_map('intval', $tl_advanced_filters['assigned']);
267 + $assigned_sql = [];
268 + foreach ($assigned_ids as $user_id) {
269 + $assigned_sql[] = "FIND_IN_SET('$user_id', Task.users)";
270 + }
271 + $wppm_tl_filter .= " AND (" . implode(' OR ', $assigned_sql) . ")";
272 +}
273 +if(!empty($tl_advanced_filters['priority'])){
274 + $priority = array_map('intval', $tl_advanced_filters['priority']);
275 + $wppm_tl_filter .= " AND Task.priority IN (" . implode(',', $priority) . ")";
276 +}
277 +if(!empty($tl_advanced_filters['start_date'])){
278 + $start_date = sanitize_text_field($tl_advanced_filters['start_date']);
279 + $wppm_tl_filter .= $wpdb->prepare(" AND (CAST(Task.start_date AS DATE)) >= %s", $start_date);
280 +}
281 +if(!empty($tl_advanced_filters['end_date'])){
282 + $end_date = sanitize_text_field($tl_advanced_filters['end_date']);
283 + $wppm_tl_filter .= $wpdb->prepare(" AND (CAST(Task.end_date AS DATE)) <= %s", $end_date);
284 +}
285 +
286 +$advanced_conditions = [];
287 +// Created By
288 +if (!empty($advanced_filter['created_by'])) {
289 + $created_by_ids = array_map('intval', $advanced_filter['created_by']);
290 + $advanced_conditions[] = "Task.created_by IN (" . implode(',', $created_by_ids) . ")";
291 +}
292 +// Assigned Users
293 +if (!empty($advanced_filter['assigned'])) {
294 + $assigned_ids = array_map('intval', $advanced_filter['assigned']);
295 + $assigned_sql = [];
296 + foreach ($assigned_ids as $user_id) {
297 + $assigned_sql[] = "FIND_IN_SET('$user_id', Task.users)";
298 + }
299 + $advanced_conditions[] = "(" . implode(' OR ', $assigned_sql) . ")";
300 +}
301 +// Priority
302 +if (!empty($advanced_filter['priority'])) {
303 + $priority = array_map('intval', $advanced_filter['priority']);
304 + $advanced_conditions[] = "Task.priority IN (" . implode(',', $priority) . ")";
305 +}
306 +// Start Date
307 +if (!empty($advanced_filter['start_date'])) {
308 + $start_date = sanitize_text_field($advanced_filter['start_date']);
309 + $advanced_conditions[] = $wpdb->prepare("(CAST(Task.start_date AS DATE)) >= %s", $start_date);
310 +}
311 +// End Date
312 +if (!empty($advanced_filter['end_date'])) {
313 + $end_date = sanitize_text_field($advanced_filter['end_date']);
314 + $advanced_conditions[] = $wpdb->prepare("(CAST(Task.end_date AS DATE)) <= %s", $end_date);
315 +}
316 +if (!empty($advanced_conditions)) {
317 + $wppm_tl_filter .= " AND " . implode(" AND ", $advanced_conditions);
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)";
321 +
127 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)){
128 323 foreach($wppm_hide_task_statuses_from_frontend as $status){
129 324 $wppm_tl_filter .= " AND Task.status != '$status'";
130 325 }
@@ -130,15 +325,19 @@
130 325 }
131 326 }
132 327
133 328 if($proj_filter!=0){
134 - $wppm_task_by_proj_filter = "Task.project = ".esc_sql($proj_filter)."";
329 + $proj_filter = absint( $proj_filter );
330 + $wppm_task_by_proj_filter = $wpdb->prepare(
331 + "Task.project = %d AND proj.is_archived = 0",
332 + $proj_filter
333 + );
135 334 }else{
136 335 $wppm_task_by_proj_filter ="1=1";
137 336 }
138 337 if(!empty($task_status)){
139 338 foreach($task_status as $status) {
140 - $status_id = esc_sql($status->id);
339 + $status_id = absint($status->id);
141 340 if(!empty($search_tag)){
142 341 $search_tag_text = '%'.$wpdb->esc_like($search_tag).'%';
143 342 if($current_user->has_cap('manage_options') || $wppm_current_user_capability == 'wppm_admin'){
144 343 $query = ("SELECT Task.*
@@ -145,16 +344,56 @@
145 344 FROM {$wpdb->prefix}wppm_task AS Task
146 345 Left join {$wpdb->prefix}wppm_project proj ON Task.project = proj.id
147 346 Left join {$wpdb->prefix}wppm_task_statuses task_statuses ON Task.status = task_statuses.id
148 347 Left join {$wpdb->prefix}wppm_task_priorities task_priorities ON Task.priority = task_priorities.id
149 - Left join {$wpdb->base_prefix}users user ON (FIND_IN_SET(user.id,Task.users)>0) AND user.display_name LIKE '$search_tag_text'
348 + Left join {$wpdb->base_prefix}users user ON (FIND_IN_SET(user.ID,Task.users)>0)
150 349 Left join {$wpdb->prefix}wppm_project_meta proj_meta ON Task.project = proj_meta.project_id
151 350 ");
152 351 $no_of_rows = ( "SELECT count(*) FROM ($query");
153 352 if(!empty($public_projects)){
154 - $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' ";
353 + $where = $wpdb->prepare(
354 + " WHERE (
355 + proj_meta.meta_key = %s
356 + AND proj_meta.meta_value = %d
357 + )
358 + AND {$wppm_tl_filter}
359 + AND {$wppm_task_by_proj_filter}
360 + AND (
361 + Task.task_name LIKE %s
362 + OR proj.project_name LIKE %s
363 + OR task_statuses.name LIKE %s
364 + OR task_priorities.name LIKE %s
365 + OR user.display_name LIKE %s
366 + )
367 + AND Task.status = %d ",
368 + 'public_project',
369 + 1,
370 + $search_tag_text,
371 + $search_tag_text,
372 + $search_tag_text,
373 + $search_tag_text,
374 + $search_tag_text,
375 + $status_id
376 + );
155 377 }else{
156 - $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' ";
378 + $where = $wpdb->prepare(
379 + " WHERE {$wppm_tl_filter}
380 + AND {$wppm_task_by_proj_filter}
381 + AND (
382 + Task.task_name LIKE %s
383 + OR proj.project_name LIKE %s
384 + OR task_statuses.name LIKE %s
385 + OR task_priorities.name LIKE %s
386 + OR user.display_name LIKE %s
387 + )
388 + AND Task.status = %d ",
389 + $search_tag_text,
390 + $search_tag_text,
391 + $search_tag_text,
392 + $search_tag_text,
393 + $search_tag_text,
394 + $status_id
395 + );
157 396 }
158 397 } else{
159 398 $query = ("SELECT Task.*
160 399 FROM {$wpdb->prefix}wppm_task AS Task
@@ -161,16 +400,82 @@
161 400 Left join {$wpdb->prefix}wppm_project proj ON Task.project = proj.id
162 401 Left join {$wpdb->prefix}wppm_task_statuses task_statuses ON Task.status = task_statuses.id
163 402 Left join {$wpdb->prefix}wppm_task_priorities task_priorities ON Task.priority = task_priorities.id
164 403 Left join {$wpdb->prefix}wppm_project_users proj_users ON Task.project = proj_users.proj_id
165 - Left join {$wpdb->base_prefix}users user ON (FIND_IN_SET(user.id,Task.users)>0) AND user.display_name LIKE '$search_tag_text'
404 + Left join {$wpdb->base_prefix}users user ON (FIND_IN_SET(user.ID,Task.users)>0)
166 405 Left join {$wpdb->prefix}wppm_project_meta proj_meta ON Task.project = proj_meta.project_id
167 406 ");
168 407 $no_of_rows = ( "SELECT count(*) FROM ($query");
169 408 if(!empty($public_projects)){
170 - $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'";
409 + $where = $wpdb->prepare(
410 + " WHERE (
411 + proj_meta.meta_key = %s
412 + AND proj_meta.meta_value = %d
413 + )
414 + AND proj.is_archived = 0
415 + AND {$wppm_tl_filter}
416 + AND {$wppm_task_by_proj_filter}
417 + AND (
418 + Task.task_name LIKE %s
419 + OR proj.project_name LIKE %s
420 + OR task_statuses.name LIKE %s
421 + OR task_priorities.name LIKE %s
422 + OR user.display_name LIKE %s
423 + )
424 + AND Task.status = %d ",
425 + 'public_project',
426 + 1,
427 + $search_tag_text,
428 + $search_tag_text,
429 + $search_tag_text,
430 + $search_tag_text,
431 + $search_tag_text,
432 + $status_id
433 + );
171 434 }else{
172 - $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'";
435 + $where = $wpdb->prepare(
436 + " WHERE {$wppm_tl_filter} AND proj.is_archived = 0
437 + AND {$wppm_task_by_proj_filter}
438 + AND (
439 + (
440 + FIND_IN_SET(%d, Task.users) > 0
441 + OR Task.created_by = %d
442 + OR (
443 + proj_users.user_id = %d
444 + AND proj_users.role_id = %d
445 + AND FIND_IN_SET(%d, proj.users) > 0
446 + )
447 + OR (
448 + Task.project = proj_meta.project_id
449 + AND proj_meta.meta_key = %s
450 + AND proj_meta.meta_value = %d
451 + )
452 + OR proj.created_by = %d
453 + )
454 + AND (
455 + Task.task_name LIKE %s
456 + OR proj.project_name LIKE %s
457 + OR task_statuses.name LIKE %s
458 + OR task_priorities.name LIKE %s
459 + OR user.display_name LIKE %s
460 + )
461 + )
462 + AND Task.status = %d ",
463 + $current_user->ID,
464 + $cu_id,
465 + $cu_id,
466 + 1,
467 + $current_user->ID,
468 + 'public_project',
469 + 1,
470 + $cu_id,
471 + $search_tag_text,
472 + $search_tag_text,
473 + $search_tag_text,
474 + $search_tag_text,
475 + $search_tag_text,
476 + $status_id
477 + );
173 478 }
174 479 }
175 480 }else{
176 481 if($current_user->has_cap('manage_options') || $wppm_current_user_capability == 'wppm_admin'){
@@ -179,11 +484,29 @@
179 484 Left join {$wpdb->prefix}wppm_project_meta proj_meta ON Task.project = proj_meta.project_id
180 485 ");
181 486 $no_of_rows = ( "SELECT count(*) FROM ($query");
182 487 if(!empty($public_projects)){
183 - $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'";
488 + $where = $wpdb->prepare(
489 + " WHERE (
490 + proj_meta.meta_key = %s
491 + AND proj_meta.meta_value = %d
492 + )
493 + AND {$wppm_tl_filter}
494 + AND proj.is_archived = 0
495 + AND {$wppm_task_by_proj_filter}
496 + AND Task.status = %d ",
497 + 'public_project',
498 + 1,
499 + $status_id
500 + );
184 501 }else{
185 - $where = " where $wppm_tl_filter AND $wppm_task_by_proj_filter AND Task.status= '$status_id'";
502 + $where = $wpdb->prepare(
503 + " WHERE {$wppm_tl_filter}
504 + AND {$wppm_task_by_proj_filter}
505 + AND proj.is_archived = 0
506 + AND Task.status = %d ",
507 + $status_id
508 + );
186 509 }
187 510 }else{
188 511 $query = ( "SELECT Task.*
189 512 FROM {$wpdb->prefix}wppm_task AS Task
@@ -192,11 +515,52 @@
192 515 Left join {$wpdb->prefix}wppm_project_meta proj_meta ON Task.project = proj_meta.project_id
193 516 ");
194 517 $no_of_rows = ( "SELECT count(*) FROM ($query");
195 518 if(!empty($public_projects)){
196 - $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'";
519 + $where = $wpdb->prepare(
520 + " WHERE (
521 + proj_meta.meta_key = %s
522 + AND proj_meta.meta_value = %d
523 + )
524 + AND {$wppm_tl_filter}
525 + AND proj.is_archived = 0
526 + AND {$wppm_task_by_proj_filter}
527 + AND Task.status = %d ",
528 + 'public_project',
529 + 1,
530 + $status_id
531 + );
197 532 } else{
198 - $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'";
533 + $where = $wpdb->prepare(
534 + " WHERE {$wppm_tl_filter}
535 + AND {$wppm_task_by_proj_filter}
536 + AND proj.is_archived = 0
537 + AND (
538 + FIND_IN_SET(%d, Task.users) > 0
539 + OR Task.created_by = %d
540 + OR (
541 + proj_users.user_id = %d
542 + AND proj_users.role_id = %d
543 + AND FIND_IN_SET(%d, proj.users) > 0
544 + )
545 + OR (
546 + Task.project = proj_meta.project_id
547 + AND proj_meta.meta_key = %s
548 + AND proj_meta.meta_value = %d
549 + )
550 + OR proj.created_by = %d
551 + )
552 + AND Task.status = %d ",
553 + $current_user->ID,
554 + $cu_id,
555 + $cu_id,
556 + 1,
557 + $current_user->ID,
558 + 'public_project',
559 + 1,
560 + $cu_id,
561 + $status_id
562 + );
199 563 }
200 564 }
201 565 }
202 566 $query = apply_filters('wppm_query_for_grid_view',$query);
@@ -293,16 +657,16 @@
293 657 }
294 658 $style = apply_filters('wppm_add_new_task_btn_style_grid_view',$style);
295 659 ?>
296 660 <span class="wppm-heading-inline" style="<?php echo esc_attr($proj_filter_style);?>"><?php echo (isset($page) && $page === 'wppm-archived-tasks' ) ? esc_html_e('Archived Tasks','taskbuilder'): esc_html_e('Tasks','taskbuilder');?> </span>
297 - <span class="wppm-add-new-btn btn-primary" onclick="wppm_add_new_task('',<?php echo (int)$id; ?>)" style="background-color:<?php echo esc_attr($appearance_settings['menu-button-bg-color'])?>;color:<?php echo esc_attr($appearance_settings['menu-button-text-color'])?>;<?php echo esc_attr($style) ?>;<?php echo esc_attr($proj_filter_style);?>"><img class="wppm_add_new_task_img" src="<?php echo esc_url( WPPM_PLUGIN_URL . 'asset/images/plus_icon.svg'); ?>" alt="add"><?php echo esc_html_e('Add New','taskbuilder');?></span>
661 + <span class="wppm-add-new-btn btn-primary" onclick="wppm_add_new_task('',<?php echo (int)$id; ?>)" style="background-color:<?php echo esc_attr($appearance_settings['menu-button-bg-color'])?>;color:<?php echo esc_attr($appearance_settings['menu-button-text-color'])?>;<?php echo esc_attr($style) ?>;<?php echo esc_attr($proj_filter_style);?>"><img class="wppm_add_new_task_img" src="<?php echo esc_url( WPPM_PLUGIN_URL . 'asset/images/plus_icon.svg'); ?>" alt="add"><?php echo esc_html__('Add New','taskbuilder');?></span>
298 662 <!-- Dashboard Button -->
299 - <span class="wppm-add-new-btn btn-primary" style="<?php echo esc_attr($dashboard_style);?>;background-color:<?php echo esc_attr($appearance_settings['menu-button-bg-color'])?>;color:<?php echo esc_attr($appearance_settings['menu-button-text-color'])?>;margin-right:3px;"><a href="<?php echo esc_url( admin_url('admin.php?page=wppm-dashboard') ); ?>"
300 - style="margin-right:10px;">
663 + <a class="wppm-add-new-btn btn-primary" style="background-color:<?php echo esc_attr($appearance_settings['menu-button-bg-color'])?>;color:<?php echo esc_attr($appearance_settings['menu-button-text-color'])?>;margin-right:3px;!important;<?php echo esc_attr($style)?>;<?php echo esc_attr($proj_filter_style);?>" href="<?php echo esc_url( admin_url('admin.php?page=wppm-dashboard') ); ?>" title="<?php echo esc_attr_e('Go to Dashboard','taskbuilder'); ?>">
301 664 <img src="<?php echo esc_url( WPPM_PLUGIN_URL . 'asset/images/dashboard.svg'); ?>" alt="dashboard_icon">
302 665 <?php esc_html_e('Dashboard','taskbuilder'); ?>
666 + </a>
667 + <span class="wppm-add-new-btn btn-primary" style="background-color:<?php echo esc_attr($appearance_settings['menu-button-bg-color'])?>;<?php echo esc_attr($proj_filter_style);?>; id="wppm_task_list" onclick="wppm_get_task_list()" ><span><img class="wppm_task_list_image" src="<?php echo esc_url( WPPM_PLUGIN_URL . 'asset/images/list-symbol.svg'); ?>" alt="list"></span><span style="color:<?php echo esc_attr($appearance_settings['menu-button-text-color'])?>;<?php echo esc_attr($proj_filter_style);?>"><?php echo esc_html_e('Task List','taskbuilder');?></span></span>
303 668 </a></span>
304 - <span class="wppm-add-new-btn btn-primary" style="background-color:<?php echo esc_attr($appearance_settings['menu-button-bg-color'])?>;<?php echo esc_attr($proj_filter_style);?>; id="wppm_task_list" onclick="wppm_get_task_list()" ><span><img class="wppm_task_list_image" src="<?php echo esc_url( WPPM_PLUGIN_URL . 'asset/images/list-symbol.svg'); ?>" alt="list"></span><span style="color:<?php echo esc_attr($appearance_settings['menu-button-text-color'])?>;<?php echo esc_attr($proj_filter_style);?>"><?php echo esc_html_e('Task List','taskbuilder');?></span></span>
305 669 </div>
306 670 </div>
307 671 <div style="display:flex;justify-content:space-between;margin-top: 20px;flex-wrap: wrap;">
308 672 <div style="display:flex;flex-wrap: wrap;">
@@ -307,27 +671,27 @@
307 671 <div style="display:flex;justify-content:space-between;margin-top: 20px;flex-wrap: wrap;">
308 672 <div style="display:flex;flex-wrap: wrap;">
309 673 <div id="wppm_task_filter_container">
310 674 <div class="wppm-filter-item">
311 - <label for="wppm_task_filter"> <?php echo esc_html_e('Filter','taskbuilder');?></label>
675 + <label for="wppm_task_filter"> <?php echo esc_html__('Filter','taskbuilder');?></label>
312 676 <select id="wppm_task_filter" name="wppm_task_filter" onchange="wppm_apply_task_filter_grid_view('<?php echo esc_attr($page)?>','<?php echo esc_attr($id)?>')" class="form-control">
313 - <option value="all"<?php echo ($filter_by == "all")? 'selected':""?>><?php echo esc_html_e('All','taskbuilder');?></option>
314 - <option value="1" style="<?php echo esc_attr($todo_status_style) ?>" <?php echo ($filter_by == "1")? 'selected':""?>><?php echo esc_html($todo_status_name);?></option>
315 - <option value="2" style="<?php echo esc_attr($inp_status_style) ?>" <?php echo ($filter_by == "2")? 'selected':""?>><?php echo esc_html($inp_status_name);?></option>
316 - <option value="3" style="<?php echo esc_attr($hold_status_style) ?>" <?php echo ($filter_by == "3")? 'selected':""?>><?php echo esc_html($hold_status_name);?></option>
317 - <option value="4" style="<?php echo esc_attr($completed_status_style) ?>" <?php echo ($filter_by == "4")? 'selected':""?>><?php echo esc_html($completed_status_name);?></option>
318 - <option value="mine" <?php echo ($filter_by == "mine")? 'selected':""?>><?php echo esc_html_e('Mine','taskbuilder');?></option>
319 - <option value="unassigned" <?php echo ($filter_by == "unassigned")? 'selected':""?>><?php echo esc_html_e('Unassigned','taskbuilder');?></option>
320 - <option value="overdue" <?php echo ($filter_by == "overdue")? 'selected':""?>><?php echo esc_html_e('Overdue','taskbuilder');?></option>
321 - <option value="archived" style="<?php echo esc_attr($arch_filter_style) ?>" <?php echo ($filter_by == "archived")? 'selected':""?>><?php echo esc_html_e('Archived','taskbuilder');?></option>
677 + <option value="all"<?php echo ($filter_by == "all")? 'selected':""?>><?php echo esc_html__('All','taskbuilder');?></option>
678 + <option value="1" style="<?php echo esc_attr($todo_status_style) ?>" <?php echo ($filter_by == "1")? 'selected':""?>><?php echo esc_html__($todo_status_name);?></option>
679 + <option value="2" style="<?php echo esc_attr($inp_status_style) ?>" <?php echo ($filter_by == "2")? 'selected':""?>><?php echo esc_html__($inp_status_name);?></option>
680 + <option value="3" style="<?php echo esc_attr($hold_status_style) ?>" <?php echo ($filter_by == "3")? 'selected':""?>><?php echo esc_html__($hold_status_name);?></option>
681 + <option value="4" style="<?php echo esc_attr($completed_status_style) ?>" <?php echo ($filter_by == "4")? 'selected':""?>><?php echo esc_html__($completed_status_name);?></option>
682 + <option value="mine" <?php echo ($filter_by == "mine")? 'selected':""?>><?php echo esc_html__('Mine','taskbuilder');?></option>
683 + <option value="unassigned" <?php echo ($filter_by == "unassigned")? 'selected':""?>><?php echo esc_html__('Unassigned','taskbuilder');?></option>
684 + <option value="overdue" <?php echo ($filter_by == "overdue")? 'selected':""?>><?php echo esc_html__('Overdue','taskbuilder');?></option>
685 + <option value="archived" style="<?php echo esc_attr($arch_filter_style) ?>" <?php echo ($filter_by == "archived")? 'selected':""?>><?php echo esc_html__('Archived','taskbuilder');?></option>
322 686 </select>
323 687 </div>
324 688 <div class="wppm-filter-item wppm_project_autocomplete_container" style="<?php echo esc_attr($proj_filter_style)?>">
325 689 <label for="wppm_task_list_proj_filter">
326 - <?php echo esc_html_e('Project','taskbuilder');?>
690 + <?php echo esc_html__('Project','taskbuilder');?>
327 691 </label><br>
328 692 <select searchable="search here" onchange="wppm_tasks_by_select_project_grid_view('<?php echo esc_attr($page)?>')" class="form-control" size="40" name="wppm_task_list_proj_filter" id="wppm_task_list_proj_filter">
329 - <option value="0" <?php echo ($proj_filter == 0)? 'selected':""?>><?php echo esc_html_e('All','taskbuilder');?></option>
693 + <option value="0" <?php echo ($proj_filter == 0)? 'selected':""?>><?php echo esc_html__('All','taskbuilder');?></option>
330 694 <?php
331 695 if(!empty($projects)){
332 696 foreach($projects as $proj) {
333 697 ?>
@@ -335,23 +699,88 @@
335 699 <?php }
336 700 } ?>
337 701 </select>
338 702 </div>
703 + <!-- FILTER BUTTON -->
704 + <div class="tb-filters" class="wppm-filter-item" style="display:flex;margin-left: 4px;">
705 + <div class="tb-filter-bar">
706 + <span id="tb-advanced-toggle" class="tb-btn" style="margin-bottom: 10px;">
707 + <?php echo esc_html_e('⚙️ Filters', 'taskbuilder'); ?>
708 + </span>
709 + <!-- ACTIVE FILTER CHIPS -->
710 + <div id="tb-active-filters" class="tb-chips"></div>
711 +
712 + <!-- POPOVER -->
713 + <div id="tb-advanced-panel" class="tb-popover">
714 + <div class="tb-mobile-header">
715 + <span><?php echo esc_html_e('Filters', 'taskbuilder'); ?></span>
716 + <button id="tb-close-filters">✕</button>
717 + </div>
718 + <div class="tb-arrow"></div>
719 +
720 + <div class="tb-section">
721 + <h4><?php echo esc_html_e('Created By', 'taskbuilder'); ?></h4>
722 + <select id="tb-created-by" class="form-control" multiple>
723 + <?php
724 + if(!empty($users)){
725 + foreach($users as $user): ?>
726 + <option value="<?php echo esc_attr($user->ID); ?>"><?php echo esc_html($user->display_name); ?></option>
727 + <?php endforeach; }?>
728 + </select>
729 + <h4><?php echo esc_html_e('Assigned To', 'taskbuilder'); ?></h4>
730 + <select id="tb-assigned" multiple>
731 + <?php
732 + if(!empty($all_assigned)){
733 + foreach($all_assigned as $uid){
734 + $user = get_userdata($uid);
735 + if($user){
736 + ?>
737 + <option value="<?php echo esc_attr($uid); ?>">
738 + <?php echo esc_html($user->display_name); ?>
739 + </option>
740 + <?php } }
741 + } ?>
742 + </select>
743 + </div>
744 + <div class="tb-section">
745 + <h4><?php echo esc_html_e('Priority', 'taskbuilder'); ?></h4>
746 + <select id="tb-priority" class="form-control" multiple>
747 + <?php if(!empty($priorities)) {
748 + foreach($priorities as $priority){ ?>
749 + <option value="<?php echo esc_attr($priority->id); ?>">
750 + <?php echo esc_html($priority->name); ?>
751 + </option>
752 + <?php } } ?>
753 + </select>
754 + </div>
755 + <div class="tb-section">
756 + <h4><?php echo esc_html_e('Date', 'taskbuilder'); ?></h4>
757 + <input type="date" class="form-control" id="tb-start-date">
758 + <input type="date" class="form-control"id="tb-end-date">
759 + </div>
760 + <div id="tb-filter-actions">
761 + <button class="wppm-submit-btn" id="tb-apply-filter" type="button"><?php echo esc_html_e('Apply', 'taskbuilder'); ?></button>
762 + <button class="wppm_reset_btn" id="tb-reset-filter" type="button"><?php echo esc_html_e('Reset', 'taskbuilder'); ?></button>
763 + </div>
764 + </div>
765 + </div>
766 + <div id="tb-backdrop"></div>
767 + </div>
339 768 <div class="wppm_display_submit">
340 769 <div class="wppm-filter-actions">
341 - <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_e('Reset','taskbuilder');?></span>
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>
342 771 </div>
343 772 </div>
344 773 </div>
345 774 </div>
346 - <div id="wppm_task_search" style="display:flex;justify-content:flex-end;">
775 + <div id="wppm_task_search" style="display:flex;justify-content:flex-end;margin-left: auto;">
347 776 <img width="25px" height="15" class="wppm_task_search_filter_img" style="position: relative;top: 10px;left: 30px;" height="15px" src="<?php echo esc_url( WPPM_PLUGIN_URL . 'asset/images/search.svg'); ?>" alt="search">
348 - <input type="search" id="wppm_view_task_search_filter" style="margin-right:10px;" name="wppm_view_task_search_filter" class="form-control form-control-sm" aria-controls="selection-datatable" placeholder="<?php echo esc_attr__('Search','taskbuilder');?>" value="<?php echo (!empty($search_tag)) ? esc_attr($search_tag) : "" ?>">
777 + <input type="search" id="wppm_view_task_search_filter" style="margin-right:10px; min-height:30px!important;" name="wppm_view_task_search_filter" class="form-control form-control-sm" aria-controls="selection-datatable" placeholder="<?php echo esc_attr__('Search','taskbuilder');?>" value="<?php echo (!empty($search_tag)) ? esc_attr($search_tag) : "" ?>">
349 778 </div>
350 779 </div>
351 780 <input type="hidden" name="wppm_proj_id" id="wppm_proj_id" value="<?php echo esc_attr($id);?>">
352 781 <div style="display:flex;justify-content:flex-end;margin-right:10px;">
353 - <span id="wppm_list_view_btn" style="margin: 0 0 -30px 0;<?php echo esc_attr($proj_filter_style);?>" onclick="wppm_get_task_list(0,<?php echo esc_attr($id)?>)"><img src="<?php echo esc_url( WPPM_PLUGIN_URL . 'asset/images/listv.svg'); ?>" alt="list"><span style="margin-left:5px;"><?php echo esc_html_e('List view','taskbuilder');?></span></span>
782 + <span id="wppm_list_view_btn" style="margin: 5px 0 -30px 0;<?php echo esc_attr($proj_filter_style);?>" onclick="wppm_get_task_list(0,<?php echo esc_attr($id)?>)"><img src="<?php echo esc_url( WPPM_PLUGIN_URL . 'asset/images/listv.svg'); ?>" alt="list"><span style="margin-left:5px;"><?php echo esc_html_e('List view','taskbuilder');?></span></span>
354 783 </div>
355 784 <div class="wppm_task_container" id="wppm_task_container" style="display:flex;">
356 785 <?php
357 786 if(!empty($task_status)){
@@ -467,10 +896,10 @@
467 896 <div class="wppm_card_task_action">
468 897 <span class="wppm_checklist_total_checked_item"><?php echo esc_html($total_checked_items.'/'.$total)?></span><span class="wppm_total_checked_item"><img src="<?php echo esc_url( WPPM_PLUGIN_URL . 'asset/images/checked.svg'); ?>" alt="checked"></span>
469 898 <span class="wppm_show_dropdown_menu" onclick="wppm_show_dropdown_menu(<?php echo esc_attr($task->id);?>)" data-popover="wppm-dropdown-menu-<?php echo esc_attr($task->id);?>" id="wppm_task_action_<?php echo esc_attr($task->id);?>"><img src="<?php echo esc_url( WPPM_PLUGIN_URL . 'asset/images/vertical_dot.svg'); ?>" alt="vertical_dot"></span>
470 899 <div class="gpopover" id="wppm-dropdown-menu-<?php echo esc_attr($task->id);?>">
471 - <a class="dropdown-item" href="#"><?php echo esc_html_e('Edit','taskbuilder');?></a>
472 - <a class="dropdown-item" href="#"><?php echo esc_html_e('Delete','taskbuilder');?></a>
900 + <a class="dropdown-item" href="#"><?php echo esc_html__('Edit','taskbuilder');?></a>
901 + <a class="dropdown-item" href="#"><?php echo esc_html__('Delete','taskbuilder');?></a>
473 902 </div>
474 903 </div>
475 904 </div>
476 905 <div>
@@ -532,9 +961,9 @@
532 961 if($task_per_status==false){
533 962 ?>
534 963 <div>
535 964 <div style="margin-left:5px;font-family: 'OpenSans-Semibold', 'Helvetica Neue', Arial, Helvetica, sans-serif; font-size: 14px;">
536 - <?php echo esc_html_e('Empty','taskbuilder'); ?>
965 + <?php echo esc_html__('Empty','taskbuilder'); ?>
537 966 </div>
538 967 </div>
539 968 <?php
540 969 }
@@ -548,21 +977,21 @@
548 977 <input type="hidden" name="wppm_drag_and_drop_card_ajax_nonce" id="wppm_drag_and_drop_card_ajax_nonce" value="<?php echo esc_attr( wp_create_nonce( 'wppm_drag_and_drop_card' ) ); ?>">
549 978 </div>
550 979 <div class="row wppm_task_pagination_container">
551 980 <div class="col-sm-4">
552 - <?php echo esc_html_e('Total:','taskbuilder'); ?>&nbsp;<?php echo esc_html($total_tasks); ?>&nbsp;<?php echo esc_html_e( 'of','taskbuilder') ?>&nbsp;<?php echo esc_html($totalrows_tasks) ?>&nbsp;<?php echo esc_html_e('Tasks','taskbuilder')?>
981 + <?php echo esc_html__('Total:','taskbuilder'); ?>&nbsp;<?php echo esc_html($total_tasks); ?>&nbsp;<?php echo esc_html__('of','taskbuilder') ?>&nbsp;<?php echo esc_html($totalrows_tasks) ?>&nbsp;<?php echo esc_html__('Tasks','taskbuilder')?>
553 982 </div>
554 983 <div class="wppm_task_pagination col-sm-4" style="<?php echo (esc_attr($total_pages)==0)? "display:none;":"display:flex;"?>">
555 984 <span class="wppm-pagination-txt">
556 - <span><?php echo esc_html($current_page)?>&nbsp;<?php echo esc_html_e('of','taskbuilder');?>&nbsp;<?php echo esc_html($total_pages); ?>&nbsp;<?php echo esc_html_e('Page','taskbuilder'); ?></span>
985 + <span><?php echo esc_html($current_page)?>&nbsp;<?php echo esc_html__('of','taskbuilder');?>&nbsp;<?php echo esc_html($total_pages); ?>&nbsp;<?php echo esc_html__('Page','taskbuilder'); ?></span>
557 986 </span>
558 987 <span <?php echo esc_attr($prev_class) ?>
559 988 style="<?php echo (isset($prev_class) && esc_attr($prev_class) == 'disabled') ? 'display:none;':'display:block;'?>cursor:pointer;">
560 - <a class="wppm_pagination_prev" onclick="return wppm_load_prev_task_page_card_view(<?php echo esc_attr($prev_page_no) ?>,<?php echo esc_attr($page_no)?>);"><?php echo esc_html_e('PREV','taskbuilder');?></a>
989 + <a class="wppm_pagination_prev" onclick="return wppm_load_prev_task_page_card_view(<?php echo esc_attr($prev_page_no) ?>,<?php echo esc_attr($page_no)?>);"><?php echo esc_html__('PREV','taskbuilder');?></a>
561 990 </span>
562 991 <span <?php echo esc_attr($next_class) ?>
563 992 style="<?php echo (isset($next_class) && esc_attr($next_class) == 'disabled')?'display:none;':'display:block;'?>cursor:pointer;">
564 - <a class="wppm_pagination_next" onclick="return wppm_load_next_task_page_card_view(<?php echo esc_attr($next_page_no) ?>,<?php echo esc_attr($page_no) ?>);"><?php echo esc_html_e('NEXT','taskbuilder');?></a>
993 + <a class="wppm_pagination_next" onclick="return wppm_load_next_task_page_card_view(<?php echo esc_attr($next_page_no) ?>,<?php echo esc_attr($page_no) ?>);"><?php echo esc_html__('NEXT','taskbuilder');?></a>
565 994 </span>
566 995 </div>
567 996 </div>
568 997 </form>
@@ -592,8 +1021,12 @@
592 1021 .select2-container {
593 1022 max-width: 150px !important;
594 1023 min-width: 150px !important;
595 1024 }
1025 + .select2-selection--multiple {
1026 + max-width: 290px !important;
1027 + min-width: 290px !important;
1028 + }
596 1029 #wppm_task_filter{
597 1030 min-height: 30px !important;
598 1031 max-height: 35px !important;
599 1032 }
@@ -599,10 +1032,29 @@
599 1032 }
600 1033 #wppm_view_project_task .wppm-add-new-btn:hover{
601 1034 background-color: <?php echo esc_attr($appearance_settings['menu-button-hover-color'])?>!important;
602 1035 }
603 -</style>
1036 +</style><?php
1037 +if (!isset($advanced_filter) || !is_array($advanced_filter)) {
1038 + $advanced_filter = [];
1039 +}?>
604 1040 <script type="text/javascript">
1041 + var link = true;
1042 + window.filters = {
1043 + created_by: [],
1044 + assigned: [],
1045 + priority: [],
1046 + start_date: "",
1047 + end_date: "",
1048 + id: null
1049 +};
1050 +
1051 +<?php if (isset($id) && !empty($id)) { ?>
1052 +window.filters.id = <?php echo esc_attr($id); ?>;
1053 +<?php } ?>
1054 +
1055 +var filters = window.filters;
1056 +var wppm_task_filter = <?php echo wp_json_encode($filter_by); ?>;
605 1057 jQuery( document ).ready( function( jQuery ) {
606 1058 dragula([
607 1059 <?php foreach($task_status as $status) { ?>
608 1060 document.getElementById("wppm_card_body_container_<?php echo esc_attr($status->id) ?>"),
@@ -610,9 +1062,186 @@
610 1062 ], {removeOnSpill: false})
611 1063 .on('drop', function (el,target,source) {
612 1064 wppm_drag_drop_card(el,target,source);
613 1065 });
614 -
1066 + var isKanban = <?php echo (isset($id) && !empty($id)) ? 'true' : 'false'; ?>;
1067 + var filterId = isKanban
1068 + ? <?php echo isset($id) ? esc_attr($id) : '0'; ?>
1069 + : 0;
1070 + var filterView = isKanban ? 'kanban' : 'grid';
1071 +
1072 +
1073 + // NOW use isKanban/filterId/filterView
1074 + // SET VALUES AFTER INIT
1075 + let createdBy = <?php echo wp_json_encode(array_map('strval', $filter_values['created_by'] ?? [])); ?>;
1076 +
1077 + let assigned = <?php echo wp_json_encode(array_map('strval', $filter_values['assigned'] ?? [])); ?>;
1078 +
1079 + let priority = <?php echo wp_json_encode(array_map('strval', $filter_values['priority'] ?? [])); ?>;
1080 +
1081 + let startDate = <?php echo wp_json_encode($filter_values['start_date'] ?? ''); ?>;
1082 + let endDate = <?php echo wp_json_encode($filter_values['end_date'] ?? ''); ?>;
1083 +
1084 + filters.created_by = createdBy;
1085 + filters.assigned = assigned;
1086 + filters.priority = priority;
1087 + filters.start_date = startDate;
1088 + filters.end_date = endDate;
1089 +
1090 + if (isKanban) {
1091 + filters.id = filterId;
1092 + } else {
1093 + filters.id = null;
1094 + }
1095 + jQuery('#tb-created-by').val(createdBy).trigger('change');
1096 + jQuery('#tb-assigned').val(assigned).trigger('change');
1097 + jQuery('#tb-priority').val(priority).trigger('change');
1098 +
1099 + jQuery('#tb-start-date').val(startDate);
1100 + jQuery('#tb-end-date').val(endDate);
1101 +
1102 + setTimeout(function() {
1103 + renderActiveFilters(filters);
1104 + }, 300);
1105 + jQuery(document)
1106 + .off("click", "#tb-apply-filter")
1107 + .on("click", "#tb-apply-filter", function (e) {
1108 + e.preventDefault();
1109 + filters.created_by = jQuery("#tb-created-by").val() || [];
1110 + filters.assigned = jQuery("#tb-assigned").val() || [];
1111 + filters.priority = jQuery("#tb-priority").val() || [];
1112 + filters.start_date = jQuery("#tb-start-date").val() || "";
1113 + filters.end_date = jQuery("#tb-end-date").val() || "";
1114 + <?php if (isset($id) && !empty($id)) { ?>
1115 + filters.id = <?php echo esc_attr($id); ?>;
1116 + renderActiveFilters(filters);
1117 + setKanbanFilterCookie(filters);
1118 + triggerFilter(
1119 + 1,
1120 + filters,
1121 + 'kanban',
1122 + <?php echo esc_attr($id); ?>
1123 + );
1124 + <?php } else { ?>
1125 + filters.id = null;
1126 + renderActiveFilters(filters);
1127 + setFilterCookie(filters);
1128 + triggerFilter(
1129 + 1,
1130 + filters,
1131 + 'grid',
1132 + 0
1133 + );
1134 + <?php } ?>
1135 + });
1136 + jQuery(document).on("click", ".tb-remove", function () {
1137 + let key = jQuery(this).attr("data-key");
1138 + let value = jQuery(this).attr("data-value");
1139 + // DATE REMOVE
1140 + if (key === "date") {
1141 + filters.start_date = "";
1142 + filters.end_date = "";
1143 + jQuery("#tb-start-date").val("").trigger("change");
1144 + jQuery("#tb-end-date").val("").trigger("change");
1145 + jQuery(this).closest(".tb-chip").remove();
1146 + syncUIWithFilters(filters);
1147 + renderActiveFilters(filters);
1148 + <?php if (isset($id) && !empty($id)) { ?>
1149 + filters.id = <?php echo esc_attr($id); ?>;
1150 + syncUIWithFilters(filters);
1151 + renderActiveFilters(filters);
1152 + setKanbanFilterCookie(filters);
1153 + triggerFilter(
1154 + 1,
1155 + filters,
1156 + 'kanban',
1157 + <?php echo esc_attr($id); ?>
1158 + );
1159 + <?php } else { ?>
1160 + filters.id = null;
1161 + syncUIWithFilters(filters);
1162 + renderActiveFilters(filters);
1163 + setFilterCookie(filters);
1164 + triggerFilter(
1165 + 1,
1166 + filters,
1167 + 'grid',
1168 + 0
1169 + );
1170 + <?php } ?>
1171 + return;
1172 + }
1173 + // REMOVE CREATED BY / ASSIGNED / PRIORITY
1174 + else {
1175 + filters[key] = (filters[key] || [])
1176 + .map(String)
1177 + .filter(v => v !== String(value));
1178 + jQuery(`#tb-${key}`)
1179 + .val(filters[key])
1180 + .trigger("change");
1181 + // Remove chip
1182 + jQuery(this).closest(".tb-chip").remove();
1183 + // Sync UI
1184 + syncUIWithFilters(filters);
1185 + // Render active filters
1186 + renderActiveFilters(filters);
1187 + <?php if (isset($id) && !empty($id)) { ?>
1188 + filters.id = <?php echo esc_attr($id); ?>;
1189 + syncUIWithFilters(filters);
1190 + renderActiveFilters(filters);
1191 + setKanbanFilterCookie(filters);
1192 + triggerFilter(
1193 + 1,
1194 + filters,
1195 + 'kanban',
1196 + <?php echo esc_attr($id); ?>
1197 + );
1198 + <?php } else { ?>
1199 + filters.id = null;
1200 + syncUIWithFilters(filters);
1201 + renderActiveFilters(filters);
1202 + setFilterCookie(filters);
1203 + triggerFilter(
1204 + 1,
1205 + filters,
1206 + 'grid',
1207 + 0
1208 + );
1209 + <?php } ?>
1210 + }
1211 + });
1212 + jQuery(document)
1213 + .off("click", "#tb-reset-filter")
1214 + .on("click", "#tb-reset-filter", function () {
1215 + window.filters = {
1216 + created_by: [],
1217 + assigned: [],
1218 + priority: [],
1219 + start_date: "",
1220 + end_date: "",
1221 + id: isKanban ? filterId : null
1222 + };
1223 + filters = window.filters;
1224 + syncUIWithFilters(filters);
1225 + jQuery("#tb-active-filters").html("");
1226 + if (isKanban) {
1227 + syncUIWithFilters(filters);
1228 + renderActiveFilters(filters);
1229 + setKanbanFilterCookie(filters);
1230 + } else {
1231 + syncUIWithFilters(filters);
1232 + renderActiveFilters(filters);
1233 + setFilterCookie(filters);
1234 + }
1235 + triggerFilter(
1236 + 1,
1237 + filters,
1238 + filterView,
1239 + filterId
1240 + );
1241 + jQuery("#tb-advanced-panel").removeClass("tb-open");
1242 + jQuery("#tb-backdrop").removeClass("active");
1243 + });
615 1244 jQuery("input[name='wppm_view_task_search_filter']").keypress(function(e) {
616 1245 //Enter key
617 1246 if (e.which == 13) {
618 1247 e.preventDefault();
@@ -635,8 +1264,73 @@
635 1264 jQuery.post(wppm_admin.ajax_url, data, function(response) {
636 1265 wppm_display_grid_view('<?php echo esc_js($page) ?>','<?php echo esc_js($id) ?>');
637 1266 });
638 1267 }
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 + }
1275 + jQuery('#wppm_task_container').html(wppm_admin.loading_html);
1276 + var data = {
1277 + action: 'wppm_view_project_tasks',
1278 + wppm_task_filter:'all',
1279 + task_search:"",
1280 + sort_by:"task_name",
1281 + order:"ASC",
1282 + wppm_proj_filter:"0",
1283 + page:page,
1284 + id:id
1285 + };
1286 + jQuery.post(wppm_admin.ajax_url, data, function(response) {
1287 + jQuery('#wppm_task_container').html(response);
1288 + });
1289 + // ✅ close popup
1290 + jQuery("#tb-advanced-panel").removeClass("tb-open");
1291 + jQuery("#tb-backdrop").removeClass("active");
1292 +
1293 + // ✅ clear inputs
1294 + jQuery('#tb-advanced-panel input').val('');
1295 + jQuery('#tb-advanced-panel select').val([]);
1296 +
1297 + // ✅ clear chips
1298 + jQuery("#tb-active-filters").html('');
1299 + if(id!=0){
1300 + resetFilters('kanban');
1301 + }else{
1302 + resetFilters('grid');
1303 + }
1304 + }
639 1305 jQuery('#wppm_task_list_proj_filter').select2({ dropdownAutoWidth: true, width: 'auto' });
640 1306 jQuery('#wppm_task_list_proj_filter').val(<?php echo esc_attr($proj_filter) ?>);
1307 + jQuery('#tb-created-by').select2({ dropdownAutoWidth: true, width: '100%'});
1308 + jQuery('#tb-created-by').val(<?php echo wp_json_encode($filter_values['created_by'] ?? []); ?>).trigger('change');
1309 + jQuery('#tb-assigned').select2({ dropdownAutoWidth: true, width: '100%' });
1310 + jQuery('#tb-assigned').val(<?php echo wp_json_encode($filter_values['assigned'] ?? []); ?>).trigger('change');
1311 + jQuery('#tb-priority').select2({dropdownAutoWidth: true, width: '100%'});
1312 + jQuery('#tb-priority').val(<?php echo wp_json_encode($filter_values['priority'] ?? []); ?>).trigger('change');
1313 + jQuery(document).off("click", "#tb-advanced-toggle").on("click", "#tb-advanced-toggle", function (e) {
1314 + e.stopPropagation();
1315 + jQuery("#tb-advanced-panel").toggleClass("tb-open");
1316 + });
1317 +
1318 + /* Close on backdrop click */
1319 + jQuery(document).on("click", "#tb-backdrop", function () {
1320 + jQuery("#tb-advanced-panel").removeClass("tb-open");
1321 + jQuery(this).removeClass("active");
1322 + });
1323 +
1324 + /* Close on outside (desktop only) */
1325 + jQuery(document).on("click", function (e) {
1326 + if (window.innerWidth > 768) {
1327 + if (!jQuery(e.target).closest("#tb-advanced-panel, #tb-advanced-toggle").length) {
1328 + jQuery("#tb-advanced-panel").removeClass("tb-open");
1329 + }
1330 + }
1331 + });jQuery(document).on("click", "#tb-close-filters", function () {
1332 + jQuery("#tb-advanced-panel").removeClass("tb-open");
1333 + jQuery("#tb-backdrop").removeClass("active");
1334 + });
641 1335
642 1336 </script>