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 +1231 -155 1.0.06.0.6 View file →
@@ -3,103 +3,795 @@
3 3 exit; // Exit if accessed directly
4 4 }
5 5 global $wpdb,$current_user, $wppmfunction;
6 6 $task_per_page = 20;
7 -$page_no = isset($_POST['page_no']) ? intval(sanitize_text_field($_POST['page_no'])) : '0';
8 -$task_status = $wpdb->get_results( "SELECT * FROM {$wpdb->prefix}wppm_task_statuses" );
9 -$search_tag = isset($_POST['task_search']) ? sanitize_text_field($_POST['task_search']) : '';
10 -if(!empty($search_tag)){
11 - $search_tag_text = '%'.$search_tag.'%';
12 - if($current_user->has_cap('manage_options')){
13 - $query = ("SELECT Task.*
7 +$total_no_of_rows = 0;
8 +$totalrows_tasks = 0;
9 +$appearance_settings = get_option("wppm-ap-grid-view");
10 +$cu_id = absint($current_user->ID);
11 +$page_no = isset($_POST['page_no']) ? intval((sanitize_text_field(wp_unslash($_POST['page_no'])))) : '0';
12 +$orderby_sql = (sanitize_sql_orderby( "load_order ASC" ));
13 +$task_status = $wpdb->get_results("SELECT * FROM {$wpdb->prefix}wppm_task_statuses ORDER BY $orderby_sql");
14 +$wppm_task_time = get_option('wppm_task_time');
15 +$page = isset($_POST['page']) ? sanitize_text_field(wp_unslash($_POST['page'])) : '';
16 +$id = isset($_POST['id']) ? intval(sanitize_text_field(wp_unslash($_POST['id']))) : 0;
17 +$project_id = isset($_POST['project_id']) ? intval(sanitize_text_field(wp_unslash($_POST['project_id']))) : "0";
18 +$wppm_date_setting = get_option('wppm_date_setting');
19 +$search_tag = isset($_POST['task_search']) ? sanitize_text_field(wp_unslash($_POST['task_search'])) : '';
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']) ? absint(wp_unslash($_POST['wppm_proj_filter'])) : "0";
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 +}
68 +$wppm_current_user_capability = get_user_meta( $current_user->ID, 'wppm_capability', true );
69 +$wppm_hide_completed_status_task = get_option('wppm_hide_completed_status_task');
70 +$wppm_hide_task_statuses_from_frontend = get_option('wppm_hide_task_statuses_from_frontend');
71 +$wppm_deafault_time_duration_task = get_option('wppm_display_time_duration_task');
72 +if(!empty($wppm_hide_task_statuses_from_frontend)){
73 + $wppm_hide_task_statuses_from_frontend = explode(",",$wppm_hide_task_statuses_from_frontend);
74 +} else {
75 + $wppm_hide_task_statuses_from_frontend = '';
76 +}
77 +$filters = array(
78 + 'search' => $search_tag,
79 + 'filter'=>$filter_by,
80 + 'proj_filter'=>$proj_filter
81 +);
82 +$grid_view_filter = $filters ;
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;
111 +$current_date = wp_date('Y-m-d');
112 +$proj_attr = isset($_POST['wppm_project_attr']) ? absint(wp_unslash($_POST['wppm_project_attr'])):"";
113 +$archived_where = " AND Task.is_archived = 0";
114 +if ( isset($page) && $page === 'wppm-archived-tasks' ) {
115 + $archived_where = " AND Task.is_archived = 1";
116 +}
117 +if( isset($page) && $page === 'wppm-tasks'){
118 + $archived_where = " AND Task.is_archived = 0";
119 +}
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 = '';
127 +}
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 + );
134 +} else {
135 +
136 + $wppm_project_filter = '';
137 +}
138 +
139 +$query = ("SELECT proj.*
140 + FROM {$wpdb->prefix}wppm_project AS proj
141 + Left join {$wpdb->prefix}wppm_project_meta proj_meta ON proj.id = proj_meta.project_id");
142 +$santitize_order_by = esc_sql(sanitize_sql_orderby( "project_name ASC" ));
143 +if($current_user->has_cap('manage_options') || $wppm_current_user_capability == 'wppm_admin'){
144 + if(!empty($proj_attr )){
145 + $proj_attr = esc_sql($proj_attr);
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 + );
152 + }else{
153 + if(!empty($public_projects)){
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 + );
165 + }else{
166 + $where = " WHERE proj.is_archived = 0 GROUP BY proj.id ORDER BY '$santitize_order_by'";
167 + }
168 + }
169 +}else{
170 + if(!empty($public_projects)){
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 + );
183 + } else{
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 + );
204 + }
205 +}
206 +$where = apply_filters('wppm_project_filter_in_task_list_grid_view_where',$where);
207 +$query.= $where;
208 +$projects = $wpdb->get_results($query);
209 +$wppm_tl_filter = "1=1";
210 +if(!is_array($tl_filters)){
211 + $tl_filters = json_decode($tl_filters);
212 + $tl_filters_arr = (array) $tl_filters;
213 +} else{
214 +$tl_filters_arr = $filters;
215 +}
216 +$search_tag = isset($_POST['task_search']) ? sanitize_text_field(wp_unslash($_POST['task_search'])) : $tl_filters_arr['search'];
217 +$filter_by = isset($_POST['wppm_task_filter']) ? sanitize_text_field(wp_unslash($_POST['wppm_task_filter'])) : $tl_filters_arr['filter'];
218 +$proj_filter = isset($_POST['wppm_proj_filter']) ? absint(wp_unslash($_POST['wppm_proj_filter'])) : $tl_filters_arr['proj_filter'];
219 +$filters = array(
220 + 'search'=>$search_tag,
221 + 'filter'=>$filter_by,
222 + 'proj_filter' =>$proj_filter
223 +);
224 +setcookie('wppm_grid_view_filters',wp_json_encode( $filters ),time() + 3600);
225 +if($filter_by=='all'){
226 + if($wppm_hide_completed_status_task == 0){
227 + $wppm_tl_filter = "Task.status!='4'";
228 + }
229 +}
230 +if($filter_by=='4'){
231 + $wppm_tl_filter = "Task.status='4'";
232 +}elseif($filter_by=='overdue'){
233 + $wppm_tl_filter = "Task.status!='4' AND (CAST(Task.end_date AS DATE)) < '$current_date'";
234 +}elseif($filter_by == 'unassigned'){
235 + $wppm_tl_filter = "Task.users=''";
236 +}elseif($filter_by == '1'){
237 + $wppm_tl_filter = "Task.status='1'";
238 +}elseif($filter_by == '2'){
239 + $wppm_tl_filter = "Task.status='2'";
240 +}elseif($filter_by == '3'){
241 + $wppm_tl_filter = "Task.status='3'";
242 +}elseif($filter_by == 'mine'){
243 + $wppm_tl_filter = "(FIND_IN_SET('$current_user->ID',Task.users)>0)";
244 +}elseif($filter_by == 'archived'){
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 +
259 +}
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 +
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)){
323 + foreach($wppm_hide_task_statuses_from_frontend as $status){
324 + $wppm_tl_filter .= " AND Task.status != '$status'";
325 + }
326 +}
327 +
328 +if($proj_filter!=0){
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 + );
334 +}else{
335 + $wppm_task_by_proj_filter ="1=1";
336 +}
337 +if(!empty($task_status)){
338 + foreach($task_status as $status) {
339 + $status_id = absint($status->id);
340 + if(!empty($search_tag)){
341 + $search_tag_text = '%'.$wpdb->esc_like($search_tag).'%';
342 + if($current_user->has_cap('manage_options') || $wppm_current_user_capability == 'wppm_admin'){
343 + $query = ("SELECT Task.*
344 + FROM {$wpdb->prefix}wppm_task AS Task
345 + Left join {$wpdb->prefix}wppm_project proj ON Task.project = proj.id
346 + Left join {$wpdb->prefix}wppm_task_statuses task_statuses ON Task.status = task_statuses.id
347 + Left join {$wpdb->prefix}wppm_task_priorities task_priorities ON Task.priority = task_priorities.id
348 + Left join {$wpdb->base_prefix}users user ON (FIND_IN_SET(user.ID,Task.users)>0)
349 + Left join {$wpdb->prefix}wppm_project_meta proj_meta ON Task.project = proj_meta.project_id
350 + ");
351 + $no_of_rows = ( "SELECT count(*) FROM ($query");
352 + if(!empty($public_projects)){
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 + );
377 + }else{
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 + );
396 + }
397 + } else{
398 + $query = ("SELECT Task.*
14 399 FROM {$wpdb->prefix}wppm_task AS Task
15 400 Left join {$wpdb->prefix}wppm_project proj ON Task.project = proj.id
16 401 Left join {$wpdb->prefix}wppm_task_statuses task_statuses ON Task.status = task_statuses.id
17 402 Left join {$wpdb->prefix}wppm_task_priorities task_priorities ON Task.priority = task_priorities.id
18 - Left join {$wpdb->base_prefix}users user ON (FIND_IN_SET(user.id,Task.users)>0) AND user.display_name LIKE '$search_tag_text'
19 - where (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') Group by Task.id");
20 - $no_of_rows = ("SELECT count(*) FROM
21 - (SELECT Task.*
403 + Left join {$wpdb->prefix}wppm_project_users proj_users ON Task.project = proj_users.proj_id
404 + Left join {$wpdb->base_prefix}users user ON (FIND_IN_SET(user.ID,Task.users)>0)
405 + Left join {$wpdb->prefix}wppm_project_meta proj_meta ON Task.project = proj_meta.project_id
406 + ");
407 + $no_of_rows = ( "SELECT count(*) FROM ($query");
408 + if(!empty($public_projects)){
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 + );
434 + }else{
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 + );
478 + }
479 + }
480 + }else{
481 + if($current_user->has_cap('manage_options') || $wppm_current_user_capability == 'wppm_admin'){
482 + $query = ( "SELECT Task.* FROM {$wpdb->prefix}wppm_task AS Task
483 + Left join {$wpdb->prefix}wppm_project proj ON Task.project = proj.id
484 + Left join {$wpdb->prefix}wppm_project_meta proj_meta ON Task.project = proj_meta.project_id
485 + ");
486 + $no_of_rows = ( "SELECT count(*) FROM ($query");
487 + if(!empty($public_projects)){
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 + );
501 + }else{
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 + );
509 + }
510 + }else{
511 + $query = ( "SELECT Task.*
22 512 FROM {$wpdb->prefix}wppm_task AS Task
23 513 Left join {$wpdb->prefix}wppm_project proj ON Task.project = proj.id
24 - Left join {$wpdb->prefix}wppm_task_statuses task_statuses ON Task.status = task_statuses.id
25 - Left join {$wpdb->prefix}wppm_task_priorities task_priorities ON Task.priority = task_priorities.id
26 - Left join {$wpdb->base_prefix}users user ON (FIND_IN_SET(user.id,Task.users)>0) AND user.display_name LIKE '$search_tag_text'
27 - where (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') Group by Task.id) AS Task");
28 - } else{
29 - $query = ("SELECT Task.*
30 - FROM {$wpdb->prefix}wppm_task AS Task
31 - Left join {$wpdb->prefix}wppm_project proj ON Task.project = proj.id
32 - Left join {$wpdb->prefix}wppm_task_statuses task_statuses ON Task.status = task_statuses.id
33 - Left join {$wpdb->prefix}wppm_task_priorities task_priorities ON Task.priority = task_priorities.id
34 - Left join {$wpdb->prefix}wppm_project_users proj_users ON Task.project = proj_users.proj_id
35 - Left join {$wpdb->base_prefix}users user ON (FIND_IN_SET(user.id,Task.users)>0) AND user.display_name LIKE '$search_tag_text'
36 - where ((FIND_IN_SET('$current_user->ID',Task.users)>0) OR (Task.created_by= '$current_user->ID') OR (proj_users.user_id = '$current_user->ID' AND proj_users.role_id = 1 )) 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') Group by Task.id");
37 - $no_of_rows = ("SELECT count(*) FROM
38 - (SELECT Task.*
39 - FROM {$wpdb->prefix}wppm_task AS Task
40 - Left join {$wpdb->prefix}wppm_project proj ON Task.project = proj.id
41 - Left join {$wpdb->prefix}wppm_task_statuses task_statuses ON Task.status = task_statuses.id
42 - Left join {$wpdb->prefix}wppm_task_priorities task_priorities ON Task.priority = task_priorities.id
43 - Left join {$wpdb->prefix}wppm_project_users proj_users ON Task.project = proj_users.proj_id
44 - Left join {$wpdb->base_prefix}users user ON (FIND_IN_SET(user.id,Task.users)>0) AND user.display_name LIKE '$search_tag_text'
45 - where ((FIND_IN_SET('$current_user->ID',Task.users)>0) OR (Task.created_by= '$current_user->ID') OR (proj_users.user_id = '$current_user->ID' AND proj_users.role_id = 1 )) 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') Group by Task.id) AS Task");
514 + Left join {$wpdb->prefix}wppm_project_users proj_users ON Task.project = proj_users.proj_id
515 + Left join {$wpdb->prefix}wppm_project_meta proj_meta ON Task.project = proj_meta.project_id
516 + ");
517 + $no_of_rows = ( "SELECT count(*) FROM ($query");
518 + if(!empty($public_projects)){
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 + );
532 + } else{
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 + );
563 + }
564 + }
565 + }
566 + $query = apply_filters('wppm_query_for_grid_view',$query);
567 + $no_of_rows = apply_filters('wppm_number_of_rows_query_for_grid_view',$no_of_rows);
568 + $where.= $wppm_proj_attr;
569 + if($filter_by != 'archived'){
570 + $where .= $archived_where;
571 + }
572 + if($id!=0){
573 + $where .=$wppm_project_filter;
574 + }
575 + $where = apply_filters('wppm_task_list_where_for_grid_view',$where,$wppm_tl_filter,$search_tag);
576 + $no_of_rows .= $where;
577 + $no_of_rows .= " Group by Task.id) AS Task";
578 + $no_of_rows = apply_filters('wppm_task_list_no_of_rows_for_grid_view',$no_of_rows);
579 + $totalrows = $wpdb->get_var($no_of_rows);
580 + $totalrows_tasks +=$totalrows;
581 + if($total_no_of_rows > $totalrows){
582 + $totalrows = $total_no_of_rows;
583 + }else{
584 + $total_no_of_rows = $totalrows;
585 + }
586 + $limit_start=$page_no*$task_per_page;
587 + $limit="\n LIMIT ".$limit_start.",".$task_per_page." ";
588 + $current_page=$page_no+1;
589 + $query = apply_filters('wppm_tasks_grid_view_query',$query,$search_tag);
590 + $where .= " Group by Task.id";
591 + $query .= $where;
592 + $query = apply_filters('wppm_task_list_grid_view_query',$query);
593 + $query = $query.$limit;
594 + $wppm_task_fillter[] = $wpdb->get_results($query);
46 595 }
596 + $total_pages=ceil($total_no_of_rows/$task_per_page);
597 + $prev_page_no=$current_page-1;
598 + $prev_class=(!$prev_page_no)?'disabled':'';
599 + $next_page_no=($total_pages==$current_page)? $current_page-1:$current_page;
600 + $next_class=($total_pages==$current_page)?'disabled':'';
601 + $flag = false;
602 + if(!empty($wppm_task_fillter)){
603 + foreach($wppm_task_fillter as $key_filter=>$val_filter){
604 + foreach($val_filter as $key=>$val){
605 + $val_array = (array) $val;
606 + $tusers = $val_array['users'];
607 + $tusers_arr = explode(',',$tusers);
608 + $tproject_id = ($val_array['project']);
609 + if(!empty($tusers) && in_array($current_user->ID,$tusers_arr)){
610 + $project_user_role = $wpdb->get_var( $wpdb->prepare("SELECT role_id FROM {$wpdb->prefix}wppm_project_users WHERE proj_id = %d AND user_id = %d", absint($tproject_id), absint($cu_id)));
611 + $project_users = $wpdb->get_var( $wpdb->prepare( "SELECT users FROM {$wpdb->prefix}wppm_project WHERE id = %d", absint($tproject_id)));
612 + $project_users_arr = explode(',',(string)$project_users);
613 + if((!empty($project_user_role)) && ($project_user_role == 1) && in_array($current_user->ID,$project_users_arr)){
614 + $flag = true;
615 + break;
616 + }
617 + }
618 + }
619 + }
620 + }
621 +}
622 +$todo_status_name = $wpdb->get_var($wpdb->prepare("SELECT name FROM {$wpdb->prefix}wppm_task_statuses where id=%d",1));
623 +$inp_status_name = $wpdb->get_var($wpdb->prepare("SELECT name FROM {$wpdb->prefix}wppm_task_statuses where id=%d",2));
624 +$hold_status_name = $wpdb->get_var($wpdb->prepare("SELECT name FROM {$wpdb->prefix}wppm_task_statuses where id=%d",3));
625 +$completed_status_name = $wpdb->get_var($wpdb->prepare("SELECT name FROM {$wpdb->prefix}wppm_task_statuses where id=%d",4));
626 +$todo_status_style = (!empty($todo_status_name))? "display:inline" :"display:none;";
627 +$inp_status_style = (!empty($inp_status_name))? "display:inline" :"display:none;";
628 +$hold_status_style = (!empty($hold_status_name))? "display:inline" :"display:none;";
629 +$completed_status_style = (!empty($completed_status_name))? "display:inline" :"display:none;";
630 +if ( empty( $id ) ) {
631 + $proj_filter_style = 'display:inline;';
632 +} else {
633 + $proj_filter_style = 'display:none;';
634 +}
635 +if( isset($page) && $page === 'wppm-tasks'){
636 + $arch_filter_style = "display:inline;";
637 + $dashboard_style = "display:inline;";
47 638 }else{
48 - if($current_user->has_cap('manage_options')){
49 - $query = ( "SELECT * FROM {$wpdb->prefix}wppm_task");
50 - $no_of_rows = ( "SELECT count(*) FROM {$wpdb->prefix}wppm_task" );
51 - }else{
52 - $query = ( "SELECT Task.*
53 - FROM {$wpdb->prefix}wppm_task AS Task
54 - Left join {$wpdb->prefix}wppm_project proj ON Task.project = proj.id
55 - Left join {$wpdb->prefix}wppm_project_users proj_users ON Task.project = proj_users.proj_id
56 - where (FIND_IN_SET('$current_user->ID',Task.users)>0) OR (Task.created_by)= '$current_user->ID' OR (proj_users.user_id = '$current_user->ID' AND proj_users.role_id = 1 ) Group by Task.id");
57 - $no_of_rows = ( "SELECT count(*) FROM
58 - ( SELECT Task.*
59 - FROM {$wpdb->prefix}wppm_task AS Task
60 - Left join {$wpdb->prefix}wppm_project proj ON Task.project = proj.id
61 - Left join {$wpdb->prefix}wppm_project_users proj_users ON Task.project = proj_users.proj_id
62 - where (FIND_IN_SET('$current_user->ID',Task.users)>0) OR (Task.created_by)= '$current_user->ID' OR (proj_users.user_id = '$current_user->ID' AND proj_users.role_id = 1 ) Group by Task.id) AS Task");
63 - }
64 -}
65 -$no_of_rows = apply_filters('wppm_task_list_no_of_rows_for_grid_view',$no_of_rows);
66 -$totalrows = $wpdb->get_var($no_of_rows);
67 -$limit_start=$page_no*$task_per_page;
68 -$limit="\n LIMIT ".$limit_start.",".$task_per_page." ";
69 -$current_page=$page_no+1;
70 -$query = apply_filters('wppm_task_list_grid_view_query',$query);
71 -$query = $query.$limit;
72 -$wppm_task_fillter = $wpdb->get_results($query);
73 -$total_pages=ceil($totalrows/$task_per_page);
74 -$prev_page_no=$current_page-1;
75 -$prev_class=(!$prev_page_no)?'disabled':'';
76 -$next_page_no=($total_pages==$current_page)? $current_page-1:$current_page;
77 -$next_class=($total_pages==$current_page)?'disabled':'';
639 + $arch_filter_style = "display:none;";
640 + $dashboard_style = "display:none;";
641 +}
642 +
643 +if ( isset($page) && $page === 'wppm-archived-tasks' ) {
644 + $arch_filter_style = "display:none;";
645 +} else {
646 + $arch_filter_style = "display:flex;";
647 +}
78 648 ?>
79 649 <form name="wppm_view_project_task" id="wppm_view_project_task">
80 650 <div class="row">
81 - <div class="col-sm-6">
82 - <span class="wppm-heading-inline"> <?php echo esc_html_e('Tasks','taskbuilder');?> </span>
83 - <span class="wppm-add-new-btn btn-primary" onclick="wppm_add_new_task()"><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>
84 - <span class="wppm-add-new-btn btn-primary" 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><?php echo esc_html_e('Task List','taskbuilder');?></span></span>
651 + <div class="col-sm-12">
652 + <?php
653 + if(($current_user->has_cap('manage_options') || $wppmfunction->has_permission('add_new_task',0) || $wppm_current_user_capability=='wppm_manager'|| ($flag==true)) && (isset($page) && $page != 'wppm-archived-tasks' )){
654 + $style = "display:inline;";
655 + }else{
656 + $style = "display:none;";
657 + }
658 + $style = apply_filters('wppm_add_new_task_btn_style_grid_view',$style);
659 + ?>
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>
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>
662 + <!-- Dashboard Button -->
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'); ?>">
664 + <img src="<?php echo esc_url( WPPM_PLUGIN_URL . 'asset/images/dashboard.svg'); ?>" alt="dashboard_icon">
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>
668 + </a></span>
85 669 </div>
86 - <div id="wppm_task_search" class="col-sm-6">
87 - <input type="search" id="wppm_view_task_search_filter" 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) : "" ?>">
88 - <span><img width="25" height="15" class="wppm_task_search_filter_img" src="<?php echo esc_url( WPPM_PLUGIN_URL . 'asset/images/search.svg'); ?>" alt="search"></span>
670 + </div>
671 + <div style="display:flex;justify-content:space-between;margin-top: 20px;flex-wrap: wrap;">
672 + <div style="display:flex;flex-wrap: wrap;">
673 + <div id="wppm_task_filter_container">
674 + <div class="wppm-filter-item">
675 + <label for="wppm_task_filter"> <?php echo esc_html__('Filter','taskbuilder');?></label>
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">
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>
686 + </select>
687 + </div>
688 + <div class="wppm-filter-item wppm_project_autocomplete_container" style="<?php echo esc_attr($proj_filter_style)?>">
689 + <label for="wppm_task_list_proj_filter">
690 + <?php echo esc_html__('Project','taskbuilder');?>
691 + </label><br>
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">
693 + <option value="0" <?php echo ($proj_filter == 0)? 'selected':""?>><?php echo esc_html__('All','taskbuilder');?></option>
694 + <?php
695 + if(!empty($projects)){
696 + foreach($projects as $proj) {
697 + ?>
698 + <option value="<?php echo esc_attr($proj->id)?>" <?php echo ($proj_filter == $proj->id)? 'selected':""?>><?php echo esc_html($proj->project_name,'taskbuilder');?></option>
699 + <?php }
700 + } ?>
701 + </select>
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>
768 + <div class="wppm_display_submit">
769 + <div class="wppm-filter-actions">
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>
771 + </div>
772 + </div>
773 + </div>
89 774 </div>
775 + <div id="wppm_task_search" style="display:flex;justify-content:flex-end;margin-left: auto;">
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">
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) : "" ?>">
778 + </div>
90 779 </div>
91 - <span id="wppm_list_view_btn" onclick="wppm_get_task_list()"><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>
92 - <div class="wppm_task_container" id="wppm_task_container">
780 + <input type="hidden" name="wppm_proj_id" id="wppm_proj_id" value="<?php echo esc_attr($id);?>">
781 + <div style="display:flex;justify-content:flex-end;margin-right:10px;">
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>
783 + </div>
784 + <div class="wppm_task_container" id="wppm_task_container" style="display:flex;">
93 785 <?php
94 786 if(!empty($task_status)){
95 787 foreach($task_status as $status) {
96 788 ?>
97 - <div class="wppm_task_list" id="wppm_task_list_<?php echo esc_attr($status->id)?>">
98 - <div class="row">
99 - <div class="col-sm-12 wppm_card_header" style="background-color:<?php echo esc_attr($status->bg_color)?>;color:<?php echo esc_attr($status->color);?>;">
100 - <span class="wppm_status_name"><?php echo esc_html_e($status->name,'taskbuilder');?></span>
101 - <span class="wppm_add_new_icon" onclick="wppm_add_new_task()"><img src="<?php echo esc_url( WPPM_PLUGIN_URL . 'asset/images/add_new1.svg'); ?>" alt="add"></span>
789 + <div class="wppm_task_list" id="wppm_task_list_<?php echo esc_attr($status->id)?>" style="display:flex;justify-content:space-between;flex-direction: column;flex-basis: 20%;">
790 + <div>
791 + <div style="background-color:<?php echo esc_attr($status->bg_color)?>;color:<?php echo esc_attr($status->color);?>;padding:5px;">
792 + <span class="wppm_status_name"><?php echo esc_html($status->name);?></span>
793 + <span class="wppm_add_new_icon" onclick="wppm_add_new_task('',<?php echo (int)$id; ?>)"><img src="<?php echo esc_url( WPPM_PLUGIN_URL . 'asset/images/add_new1.svg'); ?>" alt="add"></span>
102 794 </div>
103 795 </div>
104 796 <div id="wppm_card_body_container_<?php echo esc_attr($status->id) ?>" style="height:100%;">
105 797 <?php
@@ -107,83 +799,162 @@
107 799 $total_checked_items=0;
108 800 $task_per_status = false;
109 801 $total_tasks = 0;
110 802 if(!empty($wppm_task_fillter)){
111 - foreach($wppm_task_fillter as $task){
112 - $total_tasks++;
113 - if((!empty($task)) && $task->status==$status->id){
114 - $task_per_status = true;
115 - if(isset($task->priority)){
116 - $task_priority = $wpdb->get_row( "SELECT * FROM {$wpdb->prefix}wppm_task_priorities where id = $task->priority" );
117 - }
118 - if(!empty($task->id)){
119 - $checklists = $wpdb->get_results( "SELECT * FROM {$wpdb->prefix}wppm_checklist where task_id = $task->id" );
120 - $total=$wpdb->get_var("SELECT COUNT(Items.id) AS check_id
121 - FROM {$wpdb->prefix}wppm_checklist_items AS Items
122 - Left join {$wpdb->prefix}wppm_checklist checklist ON Items.checklist_id = checklist.id
123 - WHERE checklist.task_id = $task->id");
124 - $total_checked_items=$wpdb->get_var("SELECT COUNT(Items.id) AS check_id
125 - FROM {$wpdb->prefix}wppm_checklist_items AS Items
126 - Left join {$wpdb->prefix}wppm_checklist checklist ON Items.checklist_id = checklist.id
127 - WHERE checklist.task_id = $task->id AND Items.checked=1");
128 - ?>
129 - <div class="wppm_card_body" onclick="wppm_open_task(<?php echo esc_attr($task->id)?>)" id="wppm_draggable_card_<?php echo esc_attr($task->id)?>">
130 - <div class="row">
131 - <div class="col-sm-6">
132 - <span class="wppm_td_task_priority" style="background-color:<?php echo (!empty($task_priority->bg_color))? esc_attr($task_priority->bg_color):"";?>;color:<?php echo (!empty($task_priority->color))? esc_attr($task_priority->color):"";?>"><?php echo (!empty($task_priority->name))? esc_html($task_priority->name):"" ?></span>
803 + foreach($wppm_task_fillter as $key=>$tasks){
804 + foreach($tasks as $task){
805 + $total_tasks++;
806 + $wppm_task_duration = $wppmfunction->wppm_get_duration($task->start_date,$task->end_date);
807 + if((!empty($task)) && $task->status==$status->id){
808 + $task_per_status = true;
809 + if(isset($task->priority)){
810 + $tpriority = ($task->priority);
811 + $task_priority = $wpdb->get_row(
812 + $wpdb->prepare(
813 + "SELECT * FROM {$wpdb->prefix}wppm_task_priorities
814 + WHERE id = %d",
815 + absint($tpriority)
816 + )
817 + );
818 + }
819 + if($wppm_task_time == 1){
820 + $task_end_date = $task->end_date;
821 + $teDate = new DateTime($task->end_date);
822 + if($task->end_date=='0000-00-00 00:00:00'){
823 + if($wppm_date_setting=='Y-m-d H:i:s'){
824 + $task_end_date = '0000-00-00 00:00:00';
825 + }elseif($wppm_date_setting=='d-m-Y H:i:s'){
826 + $task_end_date = '00-00-0000 00:00:00';
827 + }elseif($wppm_date_setting=='m-d-Y H:i:s'){
828 + $task_end_date = '00-00-0000 00:00:00';
829 + }else{
830 + $task_end_date = '0000-00-00 00:00:00';
831 + }
832 + }else{
833 + $task_end_date = $teDate->format($wppm_date_setting);
834 + }
835 + }elseif($wppm_task_time == 0){
836 + $teDate = new DateTime($task->end_date);
837 + $task_end_date = $teDate->format('Y-m-d');
838 + if($task->end_date=='0000-00-00 00:00:00'){
839 + if($wppm_date_setting=='Y-m-d H:i:s'){
840 + $task_end_date = '0000-00-00';
841 + }elseif($wppm_date_setting=='d-m-Y H:i:s'){
842 + $task_end_date = '00-00-0000';
843 + }elseif($wppm_date_setting=='m-d-Y H:i:s'){
844 + $task_end_date = '00-00-0000';
845 + }else{
846 + $task_end_date = '0000-00-00';
847 + }
848 + }else{
849 + if($wppm_date_setting=='Y-m-d H:i:s'){
850 + $task_end_date = $teDate->format('Y-m-d');
851 + }elseif($wppm_date_setting=='d-m-Y H:i:s'){
852 + $task_end_date = $teDate->format('d-m-Y');
853 + }elseif($wppm_date_setting=='m-d-Y H:i:s'){
854 + $task_end_date = $teDate->format('m-d-Y');
855 + }else{
856 + $task_end_date = $teDate->format('Y-m-d');
857 + }
858 + }
859 + }
860 + if(!empty($task->id)){
861 + $tid = absint( $task->id );
862 + $checklists = $wpdb->get_results(
863 + $wpdb->prepare(
864 + "SELECT * FROM {$wpdb->prefix}wppm_checklist WHERE task_id = %d",
865 + $tid
866 + )
867 + );
868 + $total = $wpdb->get_var(
869 + $wpdb->prepare(
870 + "SELECT COUNT(Items.id)
871 + FROM {$wpdb->prefix}wppm_checklist_items AS Items
872 + LEFT JOIN {$wpdb->prefix}wppm_checklist AS checklist
873 + ON Items.checklist_id = checklist.id
874 + WHERE checklist.task_id = %d",
875 + $tid
876 + )
877 + );
878 + $total_checked_items = (int) $wpdb->get_var(
879 + $wpdb->prepare(
880 + "SELECT COUNT(Items.id)
881 + FROM {$wpdb->prefix}wppm_checklist_items AS Items
882 + INNER JOIN {$wpdb->prefix}wppm_checklist AS checklist
883 + ON Items.checklist_id = checklist.id
884 + WHERE checklist.task_id = %d
885 + AND Items.checked = 1",
886 + absint($tid)
887 + )
888 + );
889 + $project_data = $wppmfunction->get_project($task->project);
890 + ?>
891 + <div class="wppm_card_body" style="background-color:<?php echo esc_attr($appearance_settings['grid-background-color'])?>!important;color:<?php echo esc_attr($appearance_settings['grid-header-text-color'])?>!important;" onclick="wppm_open_task(<?php echo esc_attr($task->id)?>,<?php echo esc_attr($id);?>)" id="wppm_draggable_card_<?php echo esc_attr($task->id)?>">
892 + <div>
893 + <div>
894 + <span class="wppm_td_task_priority" style="background-color:<?php echo (!empty($task_priority->bg_color))? esc_attr($task_priority->bg_color):"";?>;color:<?php echo (!empty($task_priority->color))? esc_attr($task_priority->color):"";?>"><?php echo (!empty($task_priority->name))? esc_html($task_priority->name):"" ?></span>
895 + </div>
896 + <div class="wppm_card_task_action">
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>
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>
899 + <div class="gpopover" id="wppm-dropdown-menu-<?php echo esc_attr($task->id);?>">
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>
902 + </div>
903 + </div>
133 904 </div>
134 - <div class="wppm_card_task_action col-sm-6">
135 - <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>
136 - <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>
137 - <div class="gpopover" id="wppm-dropdown-menu-<?php echo esc_attr($task->id);?>">
138 - <a class="dropdown-item" href="#"><?php echo esc_html_e('Edit','taskbuilder');?></a>
139 - <a class="dropdown-item" href="#"><?php echo esc_html_e('Delete','taskbuilder');?></a>
905 + <div>
906 + <div>
907 + <span class="wppm_task_name_grid_view" style="margin-left: 5px;"><?php echo esc_html($task->task_name);?></span>
908 + <span class="wppm_proj_name_grid_view">(<?php echo isset($project_data['project_name']) ? esc_html($project_data['project_name']):"";?>)</span>
140 909 </div>
141 910 </div>
142 - </div>
143 - <div class="row">
144 - <div class="col-sm-12">
145 - <span class="wppm_task_name_grid_view"><?php echo esc_html_e($task->task_name,'taskbuilder');?></span>
146 - </div>
147 - </div>
148 - <div class="row">
149 - <div class="col-sm-6 wppm_task_due_date_grid_view">
150 - <small><?php echo (isset($task->end_date))? esc_html_e($task->end_date,'taskbuilder') :"" ?></small>
151 - </div>
152 - <div class="col-sm-6" class="wppm_card_task_users" style="text-align:right;">
153 - <?php
154 - $task_users = explode(',',$task->users);
155 - $i=0;
156 - $project_data = $wppmfunction->get_project($task->project);
157 - if(!empty($project_data['users'])){
158 - $proj_users = explode(',',$project_data['users']);
159 - }
160 - if(!empty($task_users)){
161 - foreach($task_users as $user){
162 - if( (!empty($proj_users)) && (in_array($user,$proj_users))){
163 - $i++;
164 - if( $i <= 4 ){
165 - if(!empty($user)){
166 - $userdata = get_userdata( $user );
167 - ?>
168 - <a href="#" title="<?php echo esc_attr($userdata->display_name)?>">
169 - <?php echo get_avatar($user, 25, "mysteryman");?>
170 - </a>
171 - <?php }
911 + <div>
912 + <?php if($wppm_deafault_time_duration_task==0) { ?>
913 + <div class="wppm_task_due_date_grid_view" style="margin-left: 5px;">
914 + <?php $style = ($task->status!=4 && $task->end_date < $current_date) ? "color:#FF0000":"color:#2C3E50"; ?>
915 + <small style="<?php echo esc_attr($style); ?>"><?php echo (isset($task_end_date))? esc_html($task_end_date):"" ?></small>
916 + </div>
917 + <?php }elseif( $wppm_deafault_time_duration_task==1){ ?>
918 + <div class="wppm_task_due_date_grid_view" style="margin-left: 5px;">
919 + <?php $style = ($task->status!=4 && $task->end_date < $current_date) ? "color:#FF0000":"color:#2C3E50"; ?>
920 + <small style="<?php echo esc_attr($style); ?>"><?php echo (isset($wppm_task_duration))? esc_html($wppm_task_duration):"" ?></small>
921 + </div>
922 + <?php } ?>
923 + <div class="wppm_card_task_users" style="text-align:right;">
924 + <?php
925 + $task_users = explode(',',$task->users);
926 + $i=0;
927 + if(!empty($project_data['users'])){
928 + $proj_users = explode(',',$project_data['users']);
929 + }
930 + if(!empty($task_users)){
931 + foreach($task_users as $user){
932 + if( (!empty($proj_users)) && (in_array($user,$proj_users))){
933 + $i++;
934 + if( $i <= 4 ){
935 + if(!empty($user)){
936 + $userdata = get_userdata( $user );
937 + ?>
938 + <a href="#" title="<?php echo esc_attr($userdata->display_name)?>">
939 + <?php echo get_avatar($user, 25, "mysteryman");?>
940 + </a>
941 + <?php }
942 + }
172 943 }
173 944 }
174 945 }
175 - }
176 - if($i > 4){
177 - ?>
178 - <a href="#" class="wppm_avatar">
179 - <span id="wppm_avatar" style="background-color:black;" class="avatar">+<?php echo esc_html($i-4) ?></span>
180 - </a>
181 - <?php } ?>
946 + if($i > 4){
947 + ?>
948 + <a href="#" class="wppm_avatar">
949 + <span id="wppm_avatar" style="background-color:black;" class="avatar">+<?php echo esc_html($i-4) ?></span>
950 + </a>
951 + <?php } ?>
952 + </div>
182 953 </div>
183 954 </div>
184 - </div>
185 - <?php
955 + <?php
956 + }
186 957 }
187 958 }
188 959 }
189 960 }
@@ -188,11 +959,11 @@
188 959 }
189 960 }
190 961 if($task_per_status==false){
191 962 ?>
192 - <div class="row">
193 - <div class="col-sm-12 wppm_empty_container">
194 - <?php echo esc_html_e('Empty','taskbuilder'); ?>
963 + <div>
964 + <div style="margin-left:5px;font-family: 'OpenSans-Semibold', 'Helvetica Neue', Arial, Helvetica, sans-serif; font-size: 14px;">
965 + <?php echo esc_html__('Empty','taskbuilder'); ?>
195 966 </div>
196 967 </div>
197 968 <?php
198 969 }
@@ -202,29 +973,88 @@
202 973 <?php }
203 974 }
204 975 ?>
205 976 <input type="hidden" action="wppm_drag_and_drop_card">
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' ) ); ?>">
206 978 </div>
207 979 <div class="row wppm_task_pagination_container">
208 980 <div class="col-sm-4">
209 - <?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) ?>&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')?>
210 982 </div>
211 983 <div class="wppm_task_pagination col-sm-4" style="<?php echo (esc_attr($total_pages)==0)? "display:none;":"display:flex;"?>">
212 984 <span class="wppm-pagination-txt">
213 - <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>
214 986 </span>
215 987 <span <?php echo esc_attr($prev_class) ?>
216 988 style="<?php echo (isset($prev_class) && esc_attr($prev_class) == 'disabled') ? 'display:none;':'display:block;'?>cursor:pointer;">
217 - <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>
218 990 </span>
219 991 <span <?php echo esc_attr($next_class) ?>
220 992 style="<?php echo (isset($next_class) && esc_attr($next_class) == 'disabled')?'display:none;':'display:block;'?>cursor:pointer;">
221 - <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>
222 994 </span>
223 995 </div>
224 996 </div>
225 997 </form>
998 +<style>
999 + .select2-selection--single {
1000 + height: 30px!important;
1001 + }
1002 + .select2-dropdown:hover {
1003 + color: #23527c!important;;
1004 + }
1005 + .select2-results__options{
1006 + font:15px "Helvetica Neue",Arial,Helvetica,sans-serif !important;
1007 + margin: 0!important;
1008 + line-height: inherit!important;
1009 + }
1010 + .select2-selection__rendered{
1011 + font:15px "Helvetica Neue",Arial,Helvetica,sans-serif !important;
1012 + margin-top: 5px!important;
1013 + }
1014 + .select2-selection__rendered:hover{
1015 + color: #2271b1 !important;
1016 + }
1017 + .select2-container--default .select2-results__option--highlighted.select2-results__option--selectable{
1018 + background-color: #e85f08!important;
1019 + color: white !important;
1020 + }
1021 + .select2-container {
1022 + max-width: 150px !important;
1023 + min-width: 150px !important;
1024 + }
1025 + .select2-selection--multiple {
1026 + max-width: 290px !important;
1027 + min-width: 290px !important;
1028 + }
1029 + #wppm_task_filter{
1030 + min-height: 30px !important;
1031 + max-height: 35px !important;
1032 + }
1033 + #wppm_view_project_task .wppm-add-new-btn:hover{
1034 + background-color: <?php echo esc_attr($appearance_settings['menu-button-hover-color'])?>!important;
1035 + }
1036 +</style><?php
1037 +if (!isset($advanced_filter) || !is_array($advanced_filter)) {
1038 + $advanced_filter = [];
1039 +}?>
226 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); ?>;
227 1057 jQuery( document ).ready( function( jQuery ) {
228 1058 dragula([
229 1059 <?php foreach($task_status as $status) { ?>
230 1060 document.getElementById("wppm_card_body_container_<?php echo esc_attr($status->id) ?>"),
@@ -232,14 +1062,191 @@
232 1062 ], {removeOnSpill: false})
233 1063 .on('drop', function (el,target,source) {
234 1064 wppm_drag_drop_card(el,target,source);
235 1065 });
236 -
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 + });
237 1244 jQuery("input[name='wppm_view_task_search_filter']").keypress(function(e) {
238 1245 //Enter key
239 1246 if (e.which == 13) {
240 1247 e.preventDefault();
241 - wppm_display_grid_view();
1248 + wppm_display_grid_view('<?php echo esc_js($page) ?>','<?php echo esc_js($id) ?>');
242 1249 }
243 1250 });
244 1251 })
245 1252 function wppm_show_dropdown_menu(task_id){
@@ -250,11 +1257,80 @@
250 1257 var data = {
251 1258 action: 'wppm_drag_and_drop_card',
252 1259 el:el.id,
253 1260 target: target.id,
254 - source:source.id
1261 + source:source.id,
1262 + _ajax_nonce:jQuery("#wppm_drag_and_drop_card_ajax_nonce").val()
255 1263 };
256 1264 jQuery.post(wppm_admin.ajax_url, data, function(response) {
257 - wppm_display_grid_view();
1265 + wppm_display_grid_view('<?php echo esc_js($page) ?>','<?php echo esc_js($id) ?>');
258 1266 });
259 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 + }
1305 + jQuery('#wppm_task_list_proj_filter').select2({ dropdownAutoWidth: true, width: 'auto' });
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 + });
1335 +
260 1336 </script>