PluginProbe
Taskbuilder – Project Management & Task Management Tool With Kanban Board / 6.0.7
Taskbuilder – Project Management & Task Management Tool With Kanban Board v6.0.7
6.0.7 6.0.6 6.0.5 6.0.2 6.0.3 6.0.4 6.0.1 6.0.0 5.0.8 5.0.9 4.0.9 5.0.0 5.0.1 5.0.2 5.0.3 5.0.4 5.0.5 5.0.6 5.0.7 trunk 1.0.0 1.0.1 1.0.2 1.0.3 1.0.4 All 59 releases
← All changes | includes/admin/projects/projects_list.php +246 -19 6.0.2 → 6.0.7 View file →
@@ -4,12 +4,36 @@
4 4 }
5 5 global $wpdb,$wppmfunction,$current_user;
6 6 $status = $wpdb->get_results( "SELECT * FROM {$wpdb->prefix}wppm_project_statuses" );
7 7 $categories = $wpdb->get_results( "SELECT * FROM {$wpdb->prefix}wppm_project_categories" );
8 -$appearance_settings = get_option("wppm-ap-project-list");
8 +$pb_users = get_users(array(
9 + 'orderby' => 'display_name',
10 + 'order' => 'ASC'
11 +));
12 +$assigned_project_users = $wpdb->get_col( "SELECT DISTINCT users FROM {$wpdb->prefix}wppm_project WHERE users != ''" );
13 +$all_assigned_proj_users = array();
14 +foreach ( $assigned_project_users as $row ) {
15 + foreach ( explode( ',', $row ) as $uid ) {
16 + $uid = trim( $uid );
17 + if ( $uid !== '' ) {
18 + $all_assigned_proj_users[] = $uid;
19 + }
20 + }
21 +}
22 +$all_assigned_proj_users = array_unique( $all_assigned_proj_users );
23 +$appearance_settings = wp_parse_args(
24 + get_option( "wppm-ap-project-list", array() ),
25 + array(
26 + 'list-header-button-background-color' => '#0052CC',
27 + 'list-header-button-hover-color' => '#0065ff',
28 + 'list-header-button-text-color' => '#fff',
29 + )
30 +);
9 31 $wppm_date_setting = get_option('wppm_date_setting');
10 32 $wppm_deafault_time_duration_project = get_option('wppm_display_time_duration_project');
11 33 $wppm_current_user_capability = get_user_meta( $current_user->ID, 'wppm_capability', true );
34 +$wppm_can_create_project = ($current_user->has_cap('manage_options')) || $wppm_current_user_capability == 'wppm_manager'|| $wppm_current_user_capability == 'wppm_admin';
35 +$wppm_can_create_project = apply_filters( 'wppm_can_create_project', $wppm_can_create_project, $current_user->ID );
12 36 $proj_per_page = 20;
13 37 $page_no = (isset($_POST['page_no'])) ? intval(sanitize_text_field($_POST['page_no'])): '0';
14 38 $page = isset($_POST['page']) ? sanitize_text_field(wp_unslash($_POST['page'])):"";
15 39 $search_tag = isset($_POST['project_search']) ? sanitize_text_field($_POST['project_search']) : '';
@@ -16,8 +40,31 @@
16 40 $order = isset($_POST['order']) ? sanitize_text_field($_POST['order']) :"ASC";
17 41 $sort_by = isset($_POST['sort_by']) ? sanitize_text_field($_POST['sort_by']):"project_name";
18 42 $filter_by = isset($_POST['wppm_project_filter']) ? sanitize_text_field($_POST['wppm_project_filter']) : "all";
19 43 $is_archieved = !empty($_POST['is_archieved']) ? 1 : 0;
44 +if ( isset( $_POST['filters'] ) ) {
45 + if ( is_string( $_POST['filters'] ) ) {
46 + $advanced_filter = json_decode( stripslashes( sanitize_text_field( wp_unslash( $_POST['filters'] ) ) ), true );
47 + } elseif ( is_array( $_POST['filters'] ) ) {
48 + $raw_filters = wp_unslash( $_POST['filters'] );
49 + $advanced_filter = array(
50 + 'created_by' => array_map( 'absint', (array) ( $raw_filters['created_by'] ?? array() ) ),
51 + 'assigned' => array_map( 'absint', (array) ( $raw_filters['assigned'] ?? array() ) ),
52 + 'category' => array_map( 'absint', (array) ( $raw_filters['category'] ?? array() ) ),
53 + 'start_date' => sanitize_text_field( $raw_filters['start_date'] ?? '' ),
54 + 'end_date' => sanitize_text_field( $raw_filters['end_date'] ?? '' ),
55 + );
56 + } else {
57 + $advanced_filter = array();
58 + }
59 +} elseif ( ! empty( $_COOKIE['tb_proj_list_filters'] ) ) {
60 + $advanced_filter = json_decode( stripslashes( sanitize_text_field( wp_unslash( $_COOKIE['tb_proj_list_filters'] ) ) ), true );
61 +} else {
62 + $advanced_filter = array();
63 +}
64 +if ( ! is_array( $advanced_filter ) ) {
65 + $advanced_filter = array();
66 +}
20 67 $current_date = wp_date('Y-m-d');
21 68 $wppm_pl_filter = "1=1";
22 69 $wppm_hide_completed_status_proj = get_option('wppm_hide_completed_status_proj');
23 70 $cu_id = esc_sql($current_user->ID);
@@ -26,8 +73,9 @@
26 73 $wppm_hide_proj_statuses_from_frontend = explode(",",$wppm_hide_proj_statuses_from_frontend);
27 74 } else {
28 75 $wppm_hide_proj_statuses_from_frontend = '';
29 76 }
77 +$is_admin = ( $wppm_current_user_capability === 'wppm_admin' || current_user_can('manage_options') ) ? 1 : 0;
30 78 $filters = array(
31 79 'sort_by' => $sort_by,
32 80 'order' => $order,
33 81 'search' => $search_tag,
@@ -90,8 +138,11 @@
90 138 }elseif($filter_by == '3'){
91 139 $wppm_pl_filter = "status='3'";
92 140 }elseif($filter_by == 'mine'){
93 141 $wppm_pl_filter = "(FIND_IN_SET('$current_user->ID',users)>0)";
142 +}elseif($filter_by == 'active'){
143 + $wppm_pl_filter = " (FIND_IN_SET('$current_user->ID', users) OR created_by = '$current_user->ID' OR $is_admin = 1 )
144 + AND status != 4";
94 145 }
95 146
96 147 if(!empty($wppm_hide_proj_statuses_from_frontend) && is_array($wppm_hide_proj_statuses_from_frontend) && ((isset($_POST['is_frontend'])) && (sanitize_text_field($_POST['is_frontend'])==1))){
97 148 foreach($wppm_hide_proj_statuses_from_frontend as $status){
@@ -97,8 +148,34 @@
97 148 foreach($wppm_hide_proj_statuses_from_frontend as $status){
98 149 $wppm_pl_filter .= " AND status != '$status'";
99 150 }
100 151 }
152 +$advanced_conditions = array();
153 +if ( ! empty( $advanced_filter['created_by'] ) ) {
154 + $created_by_ids = array_map( 'intval', (array) $advanced_filter['created_by'] );
155 + $advanced_conditions[] = "created_by IN (" . implode( ',', $created_by_ids ) . ")";
156 +}
157 +if ( ! empty( $advanced_filter['assigned'] ) ) {
158 + $assigned_ids = array_map( 'intval', (array) $advanced_filter['assigned'] );
159 + $assigned_sql = array();
160 + foreach ( $assigned_ids as $id ) {
161 + $assigned_sql[] = "FIND_IN_SET('$id', users)";
162 + }
163 + $advanced_conditions[] = "(" . implode( ' OR ', $assigned_sql ) . ")";
164 +}
165 +if ( ! empty( $advanced_filter['category'] ) ) {
166 + $category_ids = array_map( 'intval', (array) $advanced_filter['category'] );
167 + $advanced_conditions[] = "cat_id IN (" . implode( ',', $category_ids ) . ")";
168 +}
169 +if ( ! empty( $advanced_filter['start_date'] ) && preg_match( '/^\d{4}-\d{2}-\d{2}$/', $advanced_filter['start_date'] ) ) {
170 + $advanced_conditions[] = $wpdb->prepare( "(CAST(start_date AS DATE)) >= %s", $advanced_filter['start_date'] );
171 +}
172 +if ( ! empty( $advanced_filter['end_date'] ) && preg_match( '/^\d{4}-\d{2}-\d{2}$/', $advanced_filter['end_date'] ) ) {
173 + $advanced_conditions[] = $wpdb->prepare( "(CAST(end_date AS DATE)) <= %s", $advanced_filter['end_date'] );
174 +}
175 +if ( ! empty( $advanced_conditions ) ) {
176 + $wppm_pl_filter .= " AND " . implode( " AND ", $advanced_conditions );
177 +}
101 178 $wppm_project_time = get_option('wppm_project_time');
102 179 $wppm_default_project_date = get_option('wppm_default_project_date');
103 180 $sort_by = apply_filters('wppm_project_list_sort_by_query',$sort_by);
104 181 $order = apply_filters('wppm_project_list_order_query',$order);
@@ -157,19 +234,17 @@
157 234 if ($current_user->has_cap('manage_options') || $wppm_current_user_capability == 'wppm_admin') {
158 235 $where = " WHERE $wppm_pl_filter";
159 236 } else {
160 237 $where = $wpdb->prepare(
161 - " WHERE (
162 - $wppm_pl_filter
163 - AND (
164 - FIND_IN_SET(%d, Project.users) > 0
165 - OR (
166 - proj_meta.meta_key = 'public_project'
167 - AND proj_meta.meta_value = 1
168 - )
169 - )
170 - OR Project.created_by = %d
171 - )",
238 + " WHERE $wppm_pl_filter
239 + AND (
240 + FIND_IN_SET(%d, Project.users) > 0
241 + OR (
242 + proj_meta.meta_key = 'public_project'
243 + AND proj_meta.meta_value = 1
244 + )
245 + OR Project.created_by = %d
246 + )",
172 247 $current_user->ID,
173 248 $cu_id
174 249 );
175 250 }
@@ -208,14 +283,14 @@
208 283 <div class="col-sm-12" id="wppm_heading_inline">
209 284 <span class="wppm-heading-inline">
210 285 <?php echo !empty($is_archieved) ? esc_html__('Archived Projects', 'taskbuilder') : esc_html__('Projects', 'taskbuilder'); ?>
211 286 </span>
212 - <?php if($current_user->has_cap('manage_options') || $wppm_current_user_capability == 'wppm_manager'|| $wppm_current_user_capability == 'wppm_admin'){ ?>
213 - <span class="wppm-add-new-btn btn-primary" id="wppm_add_new_project_btn" onclick="wppm_add_new_project()"><span style="margin-right:5px;"><img id="wppm_add_new_project_icon" src="<?php echo esc_url( WPPM_PLUGIN_URL . 'asset/images/plus_icon.svg'); ?>" alt="plus_icon"></span><span><?php echo esc_html_e('Add New','taskbuilder');?></span></span>
287 + <?php if($wppm_can_create_project){ ?>
288 + <span class="wppm-add-new-btn btn-primary" id="wppm_add_new_project_btn" onclick="wppm_add_new_project()" style="background-color:<?php echo esc_attr($appearance_settings['list-header-button-background-color'])?>;color:<?php echo esc_attr($appearance_settings['list-header-button-text-color'])?>;"><span style="margin-right:5px;"><img id="wppm_add_new_project_icon" src="<?php echo esc_url( WPPM_PLUGIN_URL . 'asset/images/plus_icon.svg'); ?>" alt="plus_icon"></span><span><?php echo esc_html_e('Add New','taskbuilder');?></span></span>
214 289 <?php } ?>
215 - <span class="wppm-add-new-btn btn-primary" id="wppm_project_list" onclick="wppm_get_project_list()" ><span style="margin-right:5px;"><img id ="wppm_project_list_icon" src="<?php echo esc_url( WPPM_PLUGIN_URL . 'asset/images/list-symbol.svg'); ?>" alt="list-symbol"></span><span><?php echo esc_html_e('Project List','taskbuilder');?></span></span>
290 + <span class="wppm-add-new-btn btn-primary" id="wppm_project_list" onclick="wppm_get_project_list()" style="background-color:<?php echo esc_attr($appearance_settings['list-header-button-background-color'])?>;color:<?php echo esc_attr($appearance_settings['list-header-button-text-color'])?>;"><span style="margin-right:5px;"><img id ="wppm_project_list_icon" src="<?php echo esc_url( WPPM_PLUGIN_URL . 'asset/images/list-symbol.svg'); ?>" alt="list-symbol"></span><span><?php echo esc_html_e('Project List','taskbuilder');?></span></span>
216 291 <?php if($current_user->has_cap('manage_options') || $wppm_current_user_capability == 'wppm_manager'|| $wppm_current_user_capability == 'wppm_admin' ){ ?>
217 - <span class="wppm-add-new-btn btn-primary"" id="wppm_archieve_project_btn" title="Archive Project" onclick="wppm_archieve_project_list()"><img src="<?php echo esc_url( WPPM_PLUGIN_URL . 'asset/images/archive_project.svg'); ?>" alt="archive"><span style="margin-left:5px;"><span><?php echo esc_html_e('Archive Project','taskbuilder');?></span></span>
292 + <span class="wppm-add-new-btn btn-primary"" id="wppm_archieve_project_btn" title="Archive Project" onclick="wppm_archieve_project_list()" style="background-color:<?php echo esc_attr($appearance_settings['list-header-button-background-color'])?>;color:<?php echo esc_attr($appearance_settings['list-header-button-text-color'])?>;"><img src="<?php echo esc_url( WPPM_PLUGIN_URL . 'asset/images/archive_project.svg'); ?>" alt="archive"><span style="margin-left:5px;"><span><?php echo esc_html_e('Archive Project','taskbuilder');?></span></span>
218 293 <?php } ?>
219 294 </div>
220 295 </div>
221 296 <div style="display:flex;justify-content:space-between;margin-top:20px;flex-wrap: wrap;">
@@ -257,8 +332,62 @@
257 332 <option value="unassigned" <?php echo ($filter_by == "unassigned")? 'selected':""?>><?php echo esc_html_e('Unassigned','taskbuilder');?></option>
258 333 <option value="overdue" <?php echo ($filter_by == "overdue")? 'selected':""?>><?php echo esc_html_e('Overdue','taskbuilder');?></option>
259 334 </select>
260 335 </div>
336 + <div class="tb-filters" style="display:flex;margin-left: 4px;">
337 + <div class="tb-filter-bar">
338 + <span id="tb-advanced-toggle" class="tb-btn" style="margin: 10px 10px 10px 2px !important;">
339 + <?php echo esc_html_e('⚙️ Filters', 'taskbuilder'); ?>
340 + </span>
341 + <div id="tb-active-filters" class="tb-chips"></div>
342 + <div id="tb-advanced-panel" class="tb-popover">
343 + <div class="tb-mobile-header">
344 + <span><?php echo esc_html_e('Filters', 'taskbuilder'); ?></span>
345 + <button type="button" id="tb-close-filters">✕</button>
346 + </div>
347 + <div class="tb-arrow"></div>
348 + <div class="tb-section">
349 + <h4> <?php echo esc_html_e('Created By', 'taskbuilder'); ?></h4>
350 + <select id="tb-created-by" class="form-control" multiple>
351 + <?php if(!empty($pb_users)){ foreach($pb_users as $pb_user): ?>
352 + <option value="<?php echo esc_attr($pb_user->ID); ?>"><?php echo esc_html($pb_user->display_name); ?></option>
353 + <?php endforeach; } ?>
354 + </select>
355 + <h4> <?php echo esc_html_e('Co-workers', 'taskbuilder'); ?></h4>
356 + <select id="tb-assigned" class="form-control" multiple>
357 + <?php
358 + if(!empty($all_assigned_proj_users)){
359 + foreach($all_assigned_proj_users as $auid){
360 + $auser = get_userdata($auid);
361 + if($auser){ ?>
362 + <option value="<?php echo esc_attr($auid); ?>"><?php echo esc_html($auser->display_name); ?></option>
363 + <?php }
364 + }
365 + }
366 + ?>
367 + </select>
368 + </div>
369 + <div class="tb-section">
370 + <h4> <?php echo esc_html_e('Category', 'taskbuilder'); ?></h4>
371 + <select id="tb-category" class="form-control" multiple>
372 + <?php if(!empty($categories)){ foreach($categories as $pb_cat){ ?>
373 + <option value="<?php echo esc_attr($pb_cat->id); ?>"><?php echo esc_html($pb_cat->name); ?></option>
374 + <?php } } ?>
375 + </select>
376 + </div>
377 + <div class="tb-section">
378 + <h4> <?php echo esc_html_e('Date', 'taskbuilder'); ?></h4>
379 + <input type="date" class="form-control" id="tb-start-date">
380 + <input type="date" class="form-control" id="tb-end-date">
381 + </div>
382 + <div id="tb-filter-actions">
383 + <button class="wppm-submit-btn" id="tb-apply-filter" type="button"><?php echo esc_html_e('Apply', 'taskbuilder'); ?></button>
384 + <button class="wppm_reset_btn" id="tb-reset-filter" type="button"><?php echo esc_html_e('Reset', 'taskbuilder'); ?></button>
385 + </div>
386 + </div>
387 + </div>
388 + <div id="tb-backdrop"></div>
389 + </div>
261 390 <div class="wppm_display_submit">
262 391 <div class="wppm-filter-actions">
263 392 <span class="wppm-link" onclick="wppm_pl_reset_filter(<?php echo $is_archieved ?>)"> <?php echo esc_html_e('Reset','taskbuilder');?></span>
264 393 </div>
@@ -319,8 +448,9 @@
319 448 </th>
320 449 <?php }?>
321 450 <th class="wppm_table_header" style="background-color:<?php echo esc_attr($appearance_settings['list-header-background-color'])?>"><span style="color:<?php echo esc_attr($appearance_settings['list-header-text-color'])?>"><?php echo esc_html_e('No. of tasks','taskbuilder'); ?></span></th>
322 451 <th class="wppm_table_header" style="background-color:<?php echo esc_attr($appearance_settings['list-header-background-color'])?>"></th>
452 + <?php do_action('wppm_project_list_extra_column_header'); ?>
323 453 </tr>
324 454 <tbody>
325 455 <?php
326 456 $total_projects=0;
@@ -339,17 +469,17 @@
339 469 $category = $wpdb->get_var( "SELECT name FROM {$wpdb->prefix}wppm_project_categories where id='$pcat_id'" );
340 470 }
341 471 if(isset($project->id)){
342 472 if($current_user->has_cap('manage_options') || $wppm_current_user_capability == 'wppm_admin'){
343 - $no_of_tasks = $wpdb->get_var("SELECT count(*) FROM {$wpdb->prefix}wppm_task WHERE project='$pid' ");
473 + $no_of_tasks = $wpdb->get_var("SELECT count(*) FROM {$wpdb->prefix}wppm_task WHERE project='$pid' AND (parent_task_id = 0 OR parent_task_id IS NULL) ");
344 474 }else{
345 - $query =("SELECT count(*) FROM
475 + $query =("SELECT count(*) FROM
346 476 ( SELECT Task.*
347 477 FROM {$wpdb->prefix}wppm_task AS Task
348 478 Left join {$wpdb->prefix}wppm_project proj ON Task.project = proj.id
349 479 Left join {$wpdb->prefix}wppm_project_users proj_users ON Task.project = proj_users.proj_id
350 480 Left join {$wpdb->prefix}wppm_project_meta proj_meta ON proj.id = proj_meta.project_id
351 - where Task.project = '$pid' 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 ) OR (proj.id = proj_meta.project_id AND proj_meta.meta_key='public_project' AND proj_meta.meta_value=1) OR ( Task.project = proj.id AND proj.created_by='$cu_id')) Group by Task.id ) AS Task");
481 + where Task.project = '$pid' AND (Task.parent_task_id = 0 OR Task.parent_task_id IS NULL) 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 ) OR (proj.id = proj_meta.project_id AND proj_meta.meta_key='public_project' AND proj_meta.meta_value=1) OR ( Task.project = proj.id AND proj.created_by='$cu_id')) Group by Task.id ) AS Task");
352 482 $no_of_tasks = $wpdb->get_var($query);
353 483 }
354 484 $no_of_tasks = apply_filters('wppm_no_of_task_proj_list_query',$no_of_tasks,$project->id);
355 485 }
@@ -504,8 +634,9 @@
504 634 <?php $style = (($current_user->ID && $current_user->has_cap('manage_options')) || ($wppmfunction->has_project_permission('delete_project',esc_attr($project->id))) || $wppm_current_user_capability == 'wppm_admin' || ($proejctdata['created_by']==$current_user->ID && $wppm_current_user_capability == 'wppm_manager') )? "display:inline":"display:none"; ?>
505 635 <span style="<?php echo esc_attr($style); ?>" onclick="wppm_delete_project(<?php echo esc_attr($project->id) ?>)"><img src="<?php echo esc_url( WPPM_PLUGIN_URL . 'asset/images/trash.svg'); ?>" alt="delete"></span>
506 636 <?php ?>
507 637 </td>
638 + <?php do_action('wppm_project_list_extra_column_cell', $project); ?>
508 639 </tr>
509 640 <?php
510 641 }
511 642 }
@@ -562,11 +693,107 @@
562 693 }
563 694 #wppm_project_table tr:hover td{
564 695 color: <?php echo esc_attr($appearance_settings['list-item-hover-text-color'])?>!important;
565 696 }
697 + #wppm_add_new_project_btn:hover,#wppm_project_list:hover,#wppm_archieve_project_btn:hover{
698 + background-color: <?php echo esc_attr($appearance_settings['list-header-button-hover-color'])?>!important;
699 + }
566 700 </style>
567 701 <script type="text/javascript">
568 702 jQuery( document ).ready( function( jQuery ) {
703 + let createdBy = <?php echo wp_json_encode(array_map('strval', $advanced_filter['created_by'] ?? [])); ?>;
704 + let assignedUsers = <?php echo wp_json_encode(array_map('strval', $advanced_filter['assigned'] ?? [])); ?>;
705 + let categoryIds = <?php echo wp_json_encode(array_map('strval', $advanced_filter['category'] ?? [])); ?>;
706 + jQuery('#tb-created-by').select2({ width: '100%', dropdownParent: jQuery('#tb-advanced-panel') });
707 + jQuery('#tb-assigned').select2({ width: '100%', dropdownParent: jQuery('#tb-advanced-panel') });
708 + jQuery('#tb-category').select2({ width: '100%', dropdownParent: jQuery('#tb-advanced-panel') });
709 + jQuery('#tb-created-by').val(createdBy).trigger('change');
710 + jQuery('#tb-assigned').val(assignedUsers).trigger('change');
711 + jQuery('#tb-category').val(categoryIds).trigger('change');
712 + jQuery('#tb-start-date').val('<?php echo esc_attr($advanced_filter['start_date'] ?? ''); ?>');
713 + jQuery('#tb-end-date').val('<?php echo esc_attr($advanced_filter['end_date'] ?? ''); ?>');
714 +
715 + window.projectFilters = window.projectFilters || {
716 + created_by: createdBy,
717 + assigned: assignedUsers,
718 + category: categoryIds,
719 + start_date: '<?php echo esc_js($advanced_filter['start_date'] ?? ''); ?>',
720 + end_date: '<?php echo esc_js($advanced_filter['end_date'] ?? ''); ?>'
721 + };
722 +
723 + jQuery(document).off("click", "#tb-apply-filter").on("click", "#tb-apply-filter", function (e) {
724 + e.preventDefault();
725 + window.projectFilters = {
726 + created_by: jQuery("#tb-created-by").val() || [],
727 + assigned: jQuery("#tb-assigned").val() || [],
728 + category: jQuery("#tb-category").val() || [],
729 + start_date: jQuery("#tb-start-date").val() || "",
730 + end_date: jQuery("#tb-end-date").val() || ""
731 + };
732 + renderActiveFilters(window.projectFilters);
733 + setProjectListFilterCookie(window.projectFilters);
734 + triggerProjectFilter(1, window.projectFilters, <?php echo (int) $is_archieved; ?>);
735 + });
736 +
737 + jQuery(document).off("click", ".tb-remove").on("click", ".tb-remove", function () {
738 + let key = jQuery(this).attr("data-key");
739 + let value = jQuery(this).attr("data-value");
740 + if (key === "date") {
741 + window.projectFilters.start_date = "";
742 + window.projectFilters.end_date = "";
743 + jQuery("#tb-start-date").val("");
744 + jQuery("#tb-end-date").val("");
745 + } else {
746 + window.projectFilters[key] = (window.projectFilters[key] || [])
747 + .map(String)
748 + .filter(v => v !== String(value));
749 + jQuery(`#tb-${key}`).val(window.projectFilters[key]).trigger("change");
750 + }
751 + jQuery(this).closest(".tb-chip").remove();
752 + syncUIWithFilters(window.projectFilters);
753 + setProjectListFilterCookie(window.projectFilters);
754 + triggerProjectFilter(1, window.projectFilters, <?php echo (int) $is_archieved; ?>);
755 + });
756 +
757 + jQuery(document).off("click", "#tb-reset-filter").on("click", "#tb-reset-filter", function () {
758 + resetProjectFilters(<?php echo (int) $is_archieved; ?>);
759 + });
760 +
761 + let savedProjectFilters = getProjectListFilterCookie();
762 + if (savedProjectFilters && typeof savedProjectFilters === "object") {
763 + window.projectFilters = {
764 + created_by: savedProjectFilters.created_by || [],
765 + assigned: savedProjectFilters.assigned || [],
766 + category: savedProjectFilters.category || [],
767 + start_date: savedProjectFilters.start_date || "",
768 + end_date: savedProjectFilters.end_date || ""
769 + };
770 + }
771 + setTimeout(function () {
772 + syncUIWithFilters(window.projectFilters);
773 + renderActiveFilters(window.projectFilters);
774 + }, 100);
775 +
776 + jQuery(document).off("click", "#tb-advanced-toggle").on("click", "#tb-advanced-toggle", function (e) {
777 + e.stopPropagation();
778 + jQuery("#tb-advanced-panel").toggleClass("tb-open");
779 + });
780 + jQuery(document).off("click", "#tb-backdrop").on("click", "#tb-backdrop", function () {
781 + jQuery("#tb-advanced-panel").removeClass("tb-open");
782 + jQuery(this).removeClass("active");
783 + });
784 + jQuery(document).off("click.tbProjOutside").on("click.tbProjOutside", function (e) {
785 + if (window.innerWidth > 768) {
786 + if (!jQuery(e.target).closest("#tb-advanced-panel, #tb-advanced-toggle").length) {
787 + jQuery("#tb-advanced-panel").removeClass("tb-open");
788 + }
789 + }
790 + });
791 + jQuery(document).off("click", "#tb-close-filters").on("click", "#tb-close-filters", function () {
792 + jQuery("#tb-advanced-panel").removeClass("tb-open");
793 + jQuery("#tb-backdrop").removeClass("active");
794 + });
795 +
569 796 jQuery("input[name='wppm_project_search_filter']").keypress(function(e) {
570 797 //Enter key
571 798 if (e.which == 13) {
572 799 wppm_project_search_filter(<?php echo $is_archieved ?>);