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
taskbuilder / includes / admin / projects / projects_list.php

projects_list.php in Taskbuilder – Project Management & Task Management Tool With Kanban Board 6.0.6, at includes/admin/projects/projects_list.php

870 lines 54.9 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2 if ( ! defined( 'ABSPATH' ) ) {
3 exit; // Exit if accessed directly
4 }
5 global $wpdb,$wppmfunction,$current_user;
6 $status = $wpdb->get_results( "SELECT * FROM {$wpdb->prefix}wppm_project_statuses" );
7 $categories = $wpdb->get_results( "SELECT * FROM {$wpdb->prefix}wppm_project_categories" );
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 );
31 $wppm_date_setting = get_option('wppm_date_setting');
32 $wppm_deafault_time_duration_project = get_option('wppm_display_time_duration_project');
33 $wppm_current_user_capability = get_user_meta( $current_user->ID, 'wppm_capability', true );
34 $proj_per_page = 20;
35 $page_no = (isset($_POST['page_no'])) ? intval(sanitize_text_field($_POST['page_no'])): '0';
36 $page = isset($_POST['page']) ? sanitize_text_field(wp_unslash($_POST['page'])):"";
37 $search_tag = isset($_POST['project_search']) ? sanitize_text_field($_POST['project_search']) : '';
38 $order = isset($_POST['order']) ? sanitize_text_field($_POST['order']) :"ASC";
39 $sort_by = isset($_POST['sort_by']) ? sanitize_text_field($_POST['sort_by']):"project_name";
40 $filter_by = isset($_POST['wppm_project_filter']) ? sanitize_text_field($_POST['wppm_project_filter']) : "all";
41 $is_archieved = !empty($_POST['is_archieved']) ? 1 : 0;
42 if ( isset( $_POST['filters'] ) ) {
43 if ( is_string( $_POST['filters'] ) ) {
44 $advanced_filter = json_decode( stripslashes( sanitize_text_field( wp_unslash( $_POST['filters'] ) ) ), true );
45 } elseif ( is_array( $_POST['filters'] ) ) {
46 $raw_filters = wp_unslash( $_POST['filters'] );
47 $advanced_filter = array(
48 'created_by' => array_map( 'absint', (array) ( $raw_filters['created_by'] ?? array() ) ),
49 'assigned' => array_map( 'absint', (array) ( $raw_filters['assigned'] ?? array() ) ),
50 'category' => array_map( 'absint', (array) ( $raw_filters['category'] ?? array() ) ),
51 'start_date' => sanitize_text_field( $raw_filters['start_date'] ?? '' ),
52 'end_date' => sanitize_text_field( $raw_filters['end_date'] ?? '' ),
53 );
54 } else {
55 $advanced_filter = array();
56 }
57 } elseif ( ! empty( $_COOKIE['tb_proj_list_filters'] ) ) {
58 $advanced_filter = json_decode( stripslashes( sanitize_text_field( wp_unslash( $_COOKIE['tb_proj_list_filters'] ) ) ), true );
59 } else {
60 $advanced_filter = array();
61 }
62 if ( ! is_array( $advanced_filter ) ) {
63 $advanced_filter = array();
64 }
65 $current_date = wp_date('Y-m-d');
66 $wppm_pl_filter = "1=1";
67 $wppm_hide_completed_status_proj = get_option('wppm_hide_completed_status_proj');
68 $cu_id = esc_sql($current_user->ID);
69 $wppm_hide_proj_statuses_from_frontend = get_option('wppm_hide_proj_statuses_from_frontend');
70 if(!empty($wppm_hide_proj_statuses_from_frontend)){
71 $wppm_hide_proj_statuses_from_frontend = explode(",",$wppm_hide_proj_statuses_from_frontend);
72 } else {
73 $wppm_hide_proj_statuses_from_frontend = '';
74 }
75 $is_admin = ( $wppm_current_user_capability === 'wppm_admin' || current_user_can('manage_options') ) ? 1 : 0;
76 $filters = array(
77 'sort_by' => $sort_by,
78 'order' => $order,
79 'search' => $search_tag,
80 'filter'=>$filter_by
81 );
82 $pl_filters = isset( $_COOKIE['wppm_proj_filters'] ) ? sanitize_text_field( wp_unslash( $_COOKIE['wppm_proj_filters'] ) ) : $filters;
83 if(!is_array($pl_filters)){
84 $pl_filters = json_decode($pl_filters);
85 $pl_filters_arr = (array) $pl_filters;
86 } else{
87 $pl_filters_arr = $filters;
88 }
89 $search_tag = isset($_POST['project_search']) ? sanitize_text_field($_POST['project_search']) : $pl_filters_arr['search'];
90 $order = isset($_POST['order']) ? sanitize_text_field($_POST['order']) :$pl_filters_arr['order'];
91 $sort_by = isset($_POST['sort_by']) ? sanitize_text_field($_POST['sort_by']):$pl_filters_arr['sort_by'];
92 $filter_by = isset($_POST['wppm_project_filter']) ? sanitize_text_field($_POST['wppm_project_filter']) : $pl_filters_arr['filter'];
93 if($sort_by == ""){
94 $sort_by = 'project_name';
95 }
96 $filters = array(
97 'sort_by' => $sort_by,
98 'order' => $order,
99 'search'=>$search_tag,
100 'filter'=>$filter_by
101 );
102 setcookie('wppm_proj_filters',wp_json_encode( $filters ),time() + 3600);
103
104 $allowed_sort_by = [
105 'project_name' => 'project_name',
106 'status' => 'proj_statuses.name',
107 'category' => 'proj_categories.name',
108 'start_date' => 'start_date',
109 'end_date' => 'end_date',
110 'TIMESTAMPDIFF(SECOND, start_date, end_date)'=> 'TIMESTAMPDIFF(SECOND, start_date, end_date)'
111 ];
112 // Resolve sort_by safely
113 $sort_key = isset($pl_filters_arr['sort_by'])
114 ? sanitize_text_field($pl_filters_arr['sort_by'])
115 : 'project_name';
116
117 $sort_by = $allowed_sort_by[$sort_key] ?? 'project_name';
118 $order = ( isset($pl_filters_arr['order']) && strtoupper($pl_filters_arr['order']) === 'ASC' )
119 ? 'ASC'
120 : 'DESC';
121 if($filter_by=='all'){
122 if($wppm_hide_completed_status_proj == 0){
123 $wppm_pl_filter = "status!='4'";
124 }
125 }
126 if($filter_by=='4'){
127 $wppm_pl_filter = "status='4'";
128 }elseif($filter_by=='overdue'){
129 $wppm_pl_filter = "status!='4' AND (CAST(end_date AS DATE)) < '$current_date'";
130 }elseif($filter_by == 'unassigned'){
131 $wppm_pl_filter = "users=''";
132 }elseif($filter_by == '1'){
133 $wppm_pl_filter = "status='1'";
134 }elseif($filter_by == '2'){
135 $wppm_pl_filter = "status='2'";
136 }elseif($filter_by == '3'){
137 $wppm_pl_filter = "status='3'";
138 }elseif($filter_by == 'mine'){
139 $wppm_pl_filter = "(FIND_IN_SET('$current_user->ID',users)>0)";
140 }elseif($filter_by == 'active'){
141 $wppm_pl_filter = " (FIND_IN_SET('$current_user->ID', users) OR created_by = '$current_user->ID' OR $is_admin = 1 )
142 AND status != 4";
143 }
144
145 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))){
146 foreach($wppm_hide_proj_statuses_from_frontend as $status){
147 $wppm_pl_filter .= " AND status != '$status'";
148 }
149 }
150 $advanced_conditions = array();
151 if ( ! empty( $advanced_filter['created_by'] ) ) {
152 $created_by_ids = array_map( 'intval', (array) $advanced_filter['created_by'] );
153 $advanced_conditions[] = "created_by IN (" . implode( ',', $created_by_ids ) . ")";
154 }
155 if ( ! empty( $advanced_filter['assigned'] ) ) {
156 $assigned_ids = array_map( 'intval', (array) $advanced_filter['assigned'] );
157 $assigned_sql = array();
158 foreach ( $assigned_ids as $id ) {
159 $assigned_sql[] = "FIND_IN_SET('$id', users)";
160 }
161 $advanced_conditions[] = "(" . implode( ' OR ', $assigned_sql ) . ")";
162 }
163 if ( ! empty( $advanced_filter['category'] ) ) {
164 $category_ids = array_map( 'intval', (array) $advanced_filter['category'] );
165 $advanced_conditions[] = "cat_id IN (" . implode( ',', $category_ids ) . ")";
166 }
167 if ( ! empty( $advanced_filter['start_date'] ) && preg_match( '/^\d{4}-\d{2}-\d{2}$/', $advanced_filter['start_date'] ) ) {
168 $advanced_conditions[] = $wpdb->prepare( "(CAST(start_date AS DATE)) >= %s", $advanced_filter['start_date'] );
169 }
170 if ( ! empty( $advanced_filter['end_date'] ) && preg_match( '/^\d{4}-\d{2}-\d{2}$/', $advanced_filter['end_date'] ) ) {
171 $advanced_conditions[] = $wpdb->prepare( "(CAST(end_date AS DATE)) <= %s", $advanced_filter['end_date'] );
172 }
173 if ( ! empty( $advanced_conditions ) ) {
174 $wppm_pl_filter .= " AND " . implode( " AND ", $advanced_conditions );
175 }
176 $wppm_project_time = get_option('wppm_project_time');
177 $wppm_default_project_date = get_option('wppm_default_project_date');
178 $sort_by = apply_filters('wppm_project_list_sort_by_query',$sort_by);
179 $order = apply_filters('wppm_project_list_order_query',$order);
180 $search_tag_text = '%'.$wpdb->esc_like($search_tag).'%';
181 if (!empty($search_tag)) {
182 $search_tag_text = '%' . $wpdb->esc_like($search_tag) . '%';
183 $query = "SELECT Project.*
184 FROM {$wpdb->prefix}wppm_project AS Project
185 LEFT JOIN {$wpdb->prefix}wppm_project_statuses proj_statuses ON Project.status = proj_statuses.id
186 LEFT JOIN {$wpdb->prefix}wppm_project_categories proj_categories ON Project.cat_id = proj_categories.id
187 LEFT JOIN {$wpdb->base_prefix}users user ON FIND_IN_SET(user.ID, Project.users) > 0
188 LEFT JOIN {$wpdb->prefix}wppm_project_meta proj_meta ON Project.id = proj_meta.project_id";
189 // SAFE search condition
190 $search_sql = $wpdb->prepare(
191 "(Project.project_name LIKE %s
192 OR proj_statuses.name LIKE %s
193 OR proj_categories.name LIKE %s
194 OR user.display_name LIKE %s)",
195 $search_tag_text,
196 $search_tag_text,
197 $search_tag_text,
198 $search_tag_text
199 );
200 if ($current_user->has_cap('manage_options') || $wppm_current_user_capability == 'wppm_admin') {
201 // �
202 Admin (safe)
203 $where = " WHERE $wppm_pl_filter AND $search_sql";
204 } else {
205 // �
206 Non-admin (safe)
207 $where = $wpdb->prepare(
208 " WHERE $wppm_pl_filter
209 AND $search_sql
210 AND (
211 FIND_IN_SET(%d, Project.users) > 0
212 OR (
213 proj_meta.meta_key = 'public_project'
214 AND proj_meta.meta_value = 1
215 )
216 OR Project.created_by = %d
217 )",
218 $current_user->ID,
219 $cu_id
220 );
221 }
222 } else {
223 if ($sort_by == 'project_name' || $sort_by == 'start_date' || $sort_by == 'end_date') {
224 $query = "SELECT Project.*
225 FROM {$wpdb->prefix}wppm_project AS Project
226 LEFT JOIN {$wpdb->prefix}wppm_project_meta proj_meta ON Project.id = proj_meta.project_id";
227 } else {
228 $query = "SELECT Project.*
229 FROM {$wpdb->prefix}wppm_project AS Project
230 LEFT JOIN {$wpdb->prefix}wppm_project_statuses proj_statuses ON Project.status = proj_statuses.id
231 LEFT JOIN {$wpdb->prefix}wppm_project_categories proj_categories ON Project.cat_id = proj_categories.id
232 LEFT JOIN {$wpdb->prefix}wppm_project_meta proj_meta ON Project.id = proj_meta.project_id";
233 }
234 if ($current_user->has_cap('manage_options') || $wppm_current_user_capability == 'wppm_admin') {
235 $where = " WHERE $wppm_pl_filter";
236 } else {
237 $where = $wpdb->prepare(
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 )",
247 $current_user->ID,
248 $cu_id
249 );
250 }
251 }
252 $archived_where = '';
253 if ( isset( $is_archieved ) && $is_archieved === 1 ) {
254 $archived_where = ' AND Project.is_archived = 1';
255 } else {
256 $archived_where = ' AND Project.is_archived = 0';
257 }
258 $where .= $archived_where;
259 $no_of_rows = ( "SELECT count(*) FROM ($query");
260 $no_of_rows = apply_filters('wppm_project_list_no_of_rows',$no_of_rows,$wppm_pl_filter,$search_tag);
261 $where = apply_filters('wppm_project_list_query_where',$where, $wppm_pl_filter,$search_tag);
262 $query .= $where." Group by Project.id ORDER BY $sort_by $order";
263 $no_of_rows .= $where." Group by Project.id) AS Project";
264 $totalrows = $wpdb->get_var( $no_of_rows );
265 $query = apply_filters('wppm_project_list_query',$query);
266 $limit_start=$page_no*$proj_per_page;
267 $limit="\n LIMIT ".$limit_start.",".$proj_per_page." ";
268 $query = $query.$limit;
269 $wppm_fillter = $wpdb->get_results($query);
270 $new_status_name = $wpdb->get_var( "SELECT name FROM {$wpdb->prefix}wppm_project_statuses where id='".esc_sql(1)."'" );
271 $inp_status_name = $wpdb->get_var( "SELECT name FROM {$wpdb->prefix}wppm_project_statuses where id='".esc_sql(2)."'" );
272 $hold_status_name = $wpdb->get_var( "SELECT name FROM {$wpdb->prefix}wppm_project_statuses where id='".esc_sql(3)."'" );
273 $completed_status_name = $wpdb->get_var( "SELECT name FROM {$wpdb->prefix}wppm_project_statuses where id='".esc_sql(4)."'" );
274 $new_style = (!empty($new_status_name))? "display:inline" :"display:none;";
275 $inp_status_style = (!empty($inp_status_name))? "display:inline" :"display:none;";
276 $hold_status_style = (!empty($hold_status_name))? "display:inline" :"display:none;";
277 $complete_status_style = (!empty($completed_status_name))? "display:inline" :"display:none;";
278 ?>
279 <form id="wppm_project_list_frm">
280 <div id="wppm-container">
281 <div id="wppm_project_list_container" class="wppm_bootstrap">
282 <div class="row">
283 <div class="col-sm-12" id="wppm_heading_inline">
284 <span class="wppm-heading-inline">
285 <?php echo !empty($is_archieved) ? esc_html__('Archived Projects', 'taskbuilder') : esc_html__('Projects', 'taskbuilder'); ?>
286 </span>
287 <?php if($current_user->has_cap('manage_options') || $wppm_current_user_capability == 'wppm_manager'|| $wppm_current_user_capability == 'wppm_admin'){ ?>
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>
289 <?php } ?>
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>
291 <?php if($current_user->has_cap('manage_options') || $wppm_current_user_capability == 'wppm_manager'|| $wppm_current_user_capability == 'wppm_admin' ){ ?>
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>
293 <?php } ?>
294 </div>
295 </div>
296 <div style="display:flex;justify-content:space-between;margin-top:20px;flex-wrap: wrap;">
297 <div style="display:flex;flex-wrap: wrap;">
298 <div id="wppm_project_filter_container">
299 <div class="wppm-bulk-actions" style="margin-bottom: 10px;">
300 <button
301 id="wppm-bulk-actions-btn"
302 class="wppm-button small secondary"
303 type="button"
304 style="display:none;padding:14px;font: 13px Helvetica Neue, Arial, Helvetica, sans-serif !important"
305 data-popover="wppm-bulk-actions">
306 <?php esc_attr_e( 'Bulk Actions ', 'taskbuilder' ); ?><img style="color:#313042" src="<?php echo esc_url( WPPM_PLUGIN_URL . 'asset/images/wppm_chevron_down_icon.svg'); ?>" alt="chevron_down">
307 </button>
308 <div id="wppm-bulk-actions" class="gpopover wppm-popover-menu wppm-proj-bulk-actions">
309 <div class="wppm-popover-menu-item" onclick="wppm_bulk_change_status('<?php echo esc_attr( wp_create_nonce( 'wppm_bulk_change_status' ) ); ?>');">
310 <span><img style="margin-right:5px;" src="<?php echo esc_url( WPPM_PLUGIN_URL . 'asset/images/gps-navigation.svg'); ?>" alt="status"><?php echo esc_html_e('Change Status','taskbuilder'); ?></span>
311 </div>
312 <div class="wppm-popover-menu-item" onclick="wppm_bulk_change_category('<?php echo esc_attr( wp_create_nonce( 'wppm_bulk_change_category' ) ); ?>');">
313 <span><img style="margin-right:5px;" src="<?php echo esc_url( WPPM_PLUGIN_URL . 'asset/images/tags.svg'); ?>" alt="category"><?php echo esc_html_e('Change Category','taskbuilder'); ?></span>
314 </div>
315 <div class="wppm-popover-menu-item" onclick="wppm_bulk_assign_users('<?php echo esc_attr( wp_create_nonce( 'wppm_bulk_assign_users' ) ); ?>');">
316 <span><img style="margin-right:5px;" src="<?php echo esc_url( WPPM_PLUGIN_URL . 'asset/images/users.svg'); ?>" alt="users"><?php echo esc_html_e('Assign Co-workers','taskbuilder'); ?></span>
317 </div>
318 <div class="wppm-popover-menu-item" onclick="wppm_bulk_delete_project('<?php echo esc_attr( wp_create_nonce( 'wppm_bulk_assign_users' ) ); ?>');">
319 <span><img style="margin-right:5px;" src="<?php echo esc_url( WPPM_PLUGIN_URL . 'asset/images/trash-alt-solid.svg'); ?>" alt="delete"><?php echo esc_html_e('Delete','taskbuilder'); ?></span>
320 </div>
321 </div>
322 </div>
323 <div class="wppm-filter-item">
324 <label for="wppm_project_filter"> <?php echo esc_html_e('Filter','taskbuilder');?></label>
325 <select id="wppm_project_filter" name="wppm_project_filter" onchange="wppm_apply_project_filter(<?php echo $is_archieved ?>)">
326 <option value="all"<?php echo ($filter_by == "all")? 'selected':""?>><?php echo esc_html_e('All','taskbuilder');?></option>
327 <option style="<?php echo esc_attr($new_style) ?>" value="1" <?php echo ($filter_by == "1")? 'selected':""?>><?php echo esc_html($new_status_name);?></option>
328 <option style="<?php echo esc_attr($inp_status_style) ?>" value="2" <?php echo ($filter_by == "2")? 'selected':""?>><?php echo esc_html($inp_status_name);?></option>
329 <option style="<?php echo esc_attr($hold_status_style) ?>" value="3" <?php echo ($filter_by == "3")? 'selected':""?>><?php echo esc_html($hold_status_name);?></option>
330 <option style="<?php echo esc_attr($complete_status_style) ?>" value="4" <?php echo ($filter_by == "4")? 'selected':""?>><?php echo esc_html($completed_status_name);?></option>
331 <option value="mine" <?php echo ($filter_by == "mine")? 'selected':""?>><?php echo esc_html_e('Mine','taskbuilder');?></option>
332 <option value="unassigned" <?php echo ($filter_by == "unassigned")? 'selected':""?>><?php echo esc_html_e('Unassigned','taskbuilder');?></option>
333 <option value="overdue" <?php echo ($filter_by == "overdue")? 'selected':""?>><?php echo esc_html_e('Overdue','taskbuilder');?></option>
334 </select>
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>
390 <div class="wppm_display_submit">
391 <div class="wppm-filter-actions">
392 <span class="wppm-link" onclick="wppm_pl_reset_filter(<?php echo $is_archieved ?>)"> <?php echo esc_html_e('Reset','taskbuilder');?></span>
393 </div>
394 </div>
395 </div>
396 </div>
397 <div id="wppm_project_and_task_search" style="display:flex;justify-content:flex-end;">
398 <img width="25px" id="wppm_project_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">
399 <input type="search" id="wppm_project_search_filter" style="margin-right:10px;" name="wppm_project_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) : "" ?>">
400 </div>
401 </div>
402 <script>
403 jQuery('#wppm-more-actions-btn, #wppm-bulk-actions-btn').gpopover({width: 200});
404 </script>
405 <div class="table-responsive">
406 <table id="wppm_project_table" class="wppm_table table">
407 <tr>
408 <th class="wppm_table_header" style="background-color:<?php echo esc_attr($appearance_settings['list-header-background-color'])?>" onchange="wppm_bulk_select_change()">
409 <div class="checkbox-container">
410 <input id="wppm_bulk_select_option" class="wppm-bulk-selector" type="checkbox" onchange="wppm_bulk_select_change();"/>
411 <label for="wppm_bulk_select_option"></label>
412 </div>
413 </th>
414 <th class="wppm_table_header" style="background-color:<?php echo esc_attr($appearance_settings['list-header-background-color'])?>">
415 <span id="wppm_proj_name_th" style="color:<?php echo esc_attr($appearance_settings['list-header-text-color'])?>"><?php echo esc_html_e('Project','taskbuilder'); ?></span>
416 <img width="16" height="16" onclick="wppm_sort_up_project_list('project_name','ASC')" style = "<?php echo ($sort_by == 'project_name' && $order == 'DESC') ? 'display:inline': 'display:none;'?>" class="wppm_chevron_img" id="wppm_chevron_sort_up_project_name_img" src="<?php echo esc_url( WPPM_PLUGIN_URL . 'asset/images/sort_up_icon.svg'); ?>" alt="chevron_sort_up_icon">
417 <img width="16" height="16" onclick="wppm_sort_up_project_list('project_name','DESC')" style = "<?php echo ($sort_by == 'project_name' && $order == 'ASC') ? 'display:inline': 'display:none;'?>" class="wppm_chevron_img" id="wppm_chevron_sort_down_project_name_img" src="<?php echo esc_url( WPPM_PLUGIN_URL . 'asset/images/sort_down_icon.svg'); ?>" alt="chevron_sort_down_icon">
418 </th>
419 <th class="wppm_table_header" style="background-color:<?php echo esc_attr($appearance_settings['list-header-background-color'])?>">
420 <span id="wppm_project_status_th" style="color:<?php echo esc_attr($appearance_settings['list-header-text-color'])?>"><?php echo esc_html_e('Status','taskbuilder'); ?></span>
421 <img width="16" height="16" onclick="wppm_sort_up_project_list('status','ASC')" style = "<?php echo ($sort_by == 'proj_statuses.name' && $order == 'DESC') ? 'display:inline': 'display:none;'?>" class="wppm_chevron_img" id="wppm_chevron_sort_up_project_status_img" src="<?php echo esc_url( WPPM_PLUGIN_URL . 'asset/images/sort_up_icon.svg'); ?>" alt="chevron_sort_up_icon">
422 <img width="16" height="16" onclick="wppm_sort_up_project_list('status','DESC')" style = "<?php echo ($sort_by == 'proj_statuses.name' && $order == 'ASC') ? 'display:inline': 'display:none;'?>" class="wppm_chevron_img" id="wppm_chevron_sort_down_project_status_img" class="wppm_chevron_img" src="<?php echo esc_url( WPPM_PLUGIN_URL . 'asset/images/sort_down_icon.svg'); ?>" alt="chevron_sort_down_icon">
423 </th>
424 <th class="wppm_table_header" style="background-color:<?php echo esc_attr($appearance_settings['list-header-background-color'])?>">
425 <span id="wppm_proj_list_users_th" style="color:<?php echo esc_attr($appearance_settings['list-header-text-color'])?>"><?php echo esc_html_e('Users','taskbuilder'); ?></span></th>
426 <th class="wppm_table_header" style="background-color:<?php echo esc_attr($appearance_settings['list-header-background-color'])?>">
427 <span id="wppm_project_category_th" style="color:<?php echo esc_attr($appearance_settings['list-header-text-color'])?>"><?php echo esc_html_e('Category','taskbuilder'); ?></span>
428 <img width="16" height="16" onclick="wppm_sort_up_project_list('category','ASC')" style = "<?php echo ($sort_by == 'proj_categories.name' && $order == 'DESC') ? 'display:inline': 'display:none;'?>" class="wppm_chevron_img" id="wppm_chevron_sort_up_project_cat_img" src="<?php echo esc_url( WPPM_PLUGIN_URL . 'asset/images/sort_up_icon.svg'); ?>" alt="chevron_sort_up_icon">
429 <img width="16" height="16" onclick="wppm_sort_up_project_list('category','DESC')" style = "<?php echo ($sort_by == 'proj_categories.name' && $order == 'ASC') ? 'display:inline': 'display:none;'?>" class="wppm_chevron_img" id="wppm_chevron_sort_down_project_cat_img" class="wppm_chevron_img" src="<?php echo esc_url( WPPM_PLUGIN_URL . 'asset/images/sort_down_icon.svg'); ?>" alt="chevron_sort_down_icon">
430 </th>
431 <?php if($wppm_default_project_date==1 && $wppm_deafault_time_duration_project==0){ ?>
432 <th class="wppm_table_header" style="background-color:<?php echo esc_attr($appearance_settings['list-header-background-color'])?>">
433 <span id="wppm_project_start_date_th" style="color:<?php echo esc_attr($appearance_settings['list-header-text-color'])?>"><?php echo esc_html_e('Start Date','taskbuilder'); ?></span>
434 <img width="16" height="16" onclick="wppm_sort_up_project_list('start_date','ASC')" style = "<?php echo ($sort_by == 'start_date' && $order == 'DESC') ? 'display:inline': 'display:none;'?>" class="wppm_chevron_img" id="wppm_chevron_sort_up_project_start_date_img" src="<?php echo esc_url( WPPM_PLUGIN_URL . 'asset/images/sort_up_icon.svg'); ?>" alt="chevron_sort_up_icon">
435 <img width="16" height="16" onclick="wppm_sort_up_project_list('start_date','DESC')" style = "<?php echo ($sort_by == 'start_date' && $order == 'ASC') ? 'display:inline': 'display:none;'?>" class="wppm_chevron_img" id="wppm_chevron_sort_down_project_start_date_img" class="wppm_chevron_img" src="<?php echo esc_url( WPPM_PLUGIN_URL . 'asset/images/sort_down_icon.svg'); ?>" alt="chevron_sort_down_icon">
436 </th>
437 <th class="wppm_table_header" style="background-color:<?php echo esc_attr($appearance_settings['list-header-background-color'])?>">
438 <span id="wppm_project_end_date_th" style="color:<?php echo esc_attr($appearance_settings['list-header-text-color'])?>"><?php echo esc_html_e('End Date','taskbuilder'); ?></span>
439 <img width="16" height="16" onclick="wppm_sort_up_project_list('end_date','ASC')" style = "<?php echo ($sort_by == 'end_date' && $order == 'DESC') ? 'display:inline': 'display:none;'?>" class="wppm_chevron_img" id="wppm_chevron_sort_up_project_end_date_img" src="<?php echo esc_url( WPPM_PLUGIN_URL . 'asset/images/sort_up_icon.svg'); ?>" alt="chevron_sort_up_icon">
440 <img width="16" height="16" onclick="wppm_sort_up_project_list('end_date','DESC')" style = "<?php echo ($sort_by == 'end_date' && $order == 'ASC') ? 'display:inline': 'display:none;'?>" class="wppm_chevron_img" id="wppm_chevron_sort_down_project_end_date_img" class="wppm_chevron_img" src="<?php echo esc_url( WPPM_PLUGIN_URL . 'asset/images/sort_down_icon.svg'); ?>" alt="chevron_sort_down_icon">
441 </th>
442 <?php }
443 if( $wppm_deafault_time_duration_project==1){ ?>
444 <th class="wppm_table_header" style="background-color:<?php echo esc_attr($appearance_settings['list-header-background-color'])?>">
445 <span id="wppm_project_time_duration_th" style="color:<?php echo esc_attr($appearance_settings['list-header-text-color'])?>"><?php echo esc_html_e('Duration','taskbuilder'); ?></span>
446 <img width="16" height="16" onclick="wppm_sort_up_project_list('TIMESTAMPDIFF(SECOND, start_date, end_date)','ASC')" style = "<?php echo ($sort_by == 'TIMESTAMPDIFF(SECOND, start_date, end_date)' && $order == 'DESC') ? 'display:inline': 'display:none;'?>" class="wppm_chevron_img" id="wppm_chevron_sort_up_project_time_duration_img" src="<?php echo esc_url( WPPM_PLUGIN_URL . 'asset/images/sort_up_icon.svg'); ?>" alt="chevron_sort_up_icon">
447 <img width="16" height="16" onclick="wppm_sort_up_project_list('TIMESTAMPDIFF(SECOND, start_date, end_date)','DESC')" style = "<?php echo ($sort_by == 'TIMESTAMPDIFF(SECOND, start_date, end_date)' && $order == 'ASC') ? 'display:inline': 'display:none;'?>" class="wppm_chevron_img" id="wppm_chevron_sort_down_project_time_duration_img" class="wppm_chevron_img" src="<?php echo esc_url( WPPM_PLUGIN_URL . 'asset/images/sort_down_icon.svg'); ?>" alt="chevron_sort_down_icon">
448 </th>
449 <?php }?>
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>
451 <th class="wppm_table_header" style="background-color:<?php echo esc_attr($appearance_settings['list-header-background-color'])?>"></th>
452 </tr>
453 <tbody>
454 <?php
455 $total_projects=0;
456 $users = array();
457 if(!empty($wppm_fillter)){
458 foreach( $wppm_fillter as $project ){
459 $total_projects++;
460 $proejctdata = $wppmfunction->get_project($project->id);
461 $wppm_proj_duration = $wppmfunction->wppm_get_duration($project->start_date,$project->end_date);
462 $pstatus= absint($project->status);
463 $status = $wpdb->get_row( "SELECT * FROM {$wpdb->prefix}wppm_project_statuses where id='$pstatus'" );
464 $users = explode(",",$project->users);
465 $pid= absint($project->id);
466 if(isset($project->cat_id)){
467 $pcat_id = absint($project->cat_id);
468 $category = $wpdb->get_var( "SELECT name FROM {$wpdb->prefix}wppm_project_categories where id='$pcat_id'" );
469 }
470 if(isset($project->id)){
471 if($current_user->has_cap('manage_options') || $wppm_current_user_capability == 'wppm_admin'){
472 $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) ");
473 }else{
474 $query =("SELECT count(*) FROM
475 ( SELECT Task.*
476 FROM {$wpdb->prefix}wppm_task AS Task
477 Left join {$wpdb->prefix}wppm_project proj ON Task.project = proj.id
478 Left join {$wpdb->prefix}wppm_project_users proj_users ON Task.project = proj_users.proj_id
479 Left join {$wpdb->prefix}wppm_project_meta proj_meta ON proj.id = proj_meta.project_id
480 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");
481 $no_of_tasks = $wpdb->get_var($query);
482 }
483 $no_of_tasks = apply_filters('wppm_no_of_task_proj_list_query',$no_of_tasks,$project->id);
484 }
485 if($wppm_project_time == 1){
486 $psDate = new DateTime($project->start_date);
487 $peDate = new DateTime($project->end_date);
488 if($project->start_date=='0000-00-00 00:00:00'){
489 if($wppm_date_setting=='Y-m-d H:i:s'){
490 $proj_start_date = '0000-00-00 00:00:00';
491 }elseif($wppm_date_setting=='d-m-Y H:i:s'){
492 $proj_start_date = '00-00-0000 00:00:00';
493 }elseif($wppm_date_setting=='m-d-Y H:i:s'){
494 $proj_start_date = '00-00-0000 00:00:00';
495 }else{
496 $proj_start_date = '0000-00-00 00:00:00';
497 }
498 }if($project->end_date=='0000-00-00 00:00:00'){
499 if($wppm_date_setting=='Y-m-d H:i:s'){
500 $proj_end_date = '0000-00-00 00:00:00';
501 }elseif($wppm_date_setting=='d-m-Y H:i:s'){
502 $proj_end_date = '00-00-0000 00:00:00';
503 }elseif($wppm_date_setting=='m-d-Y H:i:s'){
504 $proj_end_date = '00-00-0000 00:00:00';
505 }else{
506 $proj_end_date = '0000-00-00 00:00:00';
507 }
508 }
509 if($project->start_date!='0000-00-00 00:00:00'){
510 if(!empty($wppm_date_setting)){
511 $proj_start_date = $psDate->format($wppm_date_setting);
512 }else{
513 $proj_start_date = isset($project->start_date)? $project->start_date:"";
514 }
515 }
516 if($project->end_date!='0000-00-00 00:00:00'){
517 if(!empty($wppm_date_setting)){
518 $proj_end_date = $peDate->format($wppm_date_setting);
519 }else{
520 $proj_end_date = isset($project->end_date) ? $project->end_date: "" ;
521 }
522 }
523 } elseif($wppm_project_time == 0){
524 $psDate = new DateTime($project->start_date);
525 $peDate = new DateTime($project->end_date);
526 $proj_start_date = $psDate->format('Y-m-d');
527 $proj_end_date = $peDate->format('Y-m-d');
528 if($project->start_date=='0000-00-00 00:00:00'){
529 if($wppm_date_setting=='Y-m-d H:i:s'){
530 $proj_start_date = '0000-00-00';
531 }elseif($wppm_date_setting=='d-m-Y H:i:s'){
532 $proj_start_date = '00-00-0000';
533 }elseif($wppm_date_setting=='m-d-Y H:i:s'){
534 $proj_start_date = '00-00-0000';
535 }else{
536 $proj_start_date = '0000-00-00';
537 }
538 }
539 if($project->end_date=='0000-00-00 00:00:00'){
540 if($wppm_date_setting=='Y-m-d H:i:s'){
541 $proj_end_date = '0000-00-00';
542 }elseif($wppm_date_setting=='d-m-Y H:i:s'){
543 $proj_end_date = '00-00-0000';
544 }elseif($wppm_date_setting=='m-d-Y H:i:s'){
545 $proj_end_date = '00-00-0000';
546 }else{
547 $proj_end_date = '0000-00-00';
548 }
549
550 }if($project->start_date!='0000-00-00 00:00:00'){
551 if($wppm_date_setting=='Y-m-d H:i:s'){
552 $proj_start_date = $psDate->format('Y-m-d');
553 }elseif($wppm_date_setting=='d-m-Y H:i:s'){
554 $proj_start_date = $psDate->format('d-m-Y');
555 }elseif($wppm_date_setting=='m-d-Y H:i:s'){
556 $proj_start_date = $psDate->format('m-d-Y');
557 }else{
558 $proj_start_date = $psDate->format('Y-m-d');
559 }
560 }
561 if($project->end_date!='0000-00-00 00:00:00'){
562 if($wppm_date_setting=='Y-m-d H:i:s'){
563 $proj_end_date = $peDate->format('Y-m-d');
564 }elseif($wppm_date_setting=='d-m-Y H:i:s'){
565 $proj_end_date = $peDate->format('d-m-Y');
566 }elseif($wppm_date_setting=='m-d-Y H:i:s'){
567 $proj_end_date = $peDate->format('m-d-Y');
568 }else{
569 $proj_end_date = $peDate->format('Y-m-d');
570 }
571 }
572 }
573 ?>
574 <tr onclick="if(link)wppm_open_project(<?php echo esc_attr($project->id) ?>)">
575 <td class="bulk-selector" onmouseover="link=false;" onmouseout="link=true;">
576 <div class="wppm-pl-item-selector">
577 <div class="checkbox-container">
578 <input id="wppm_bulk_select_<?php echo esc_attr($project->id) ?>" class="wppm-bulk-select" type="checkbox" onchange="wppm_bulk_item_select_change();" value="<?php echo esc_attr( $project->id ); ?>"/>
579 <label for="wppm_bulk_select_<?php echo esc_attr($project->id) ?>"></label>
580 </div>
581 </div>
582 </td>
583 <td onmouseover="link=true;"><?php echo esc_html($project->project_name) ?></td>
584 <td onmouseover="link=true;"><span class="wppm_td_project_status" style="background-color:<?php echo esc_attr($status->bg_color);?>; color: <?php echo esc_attr($status->color); ?>"><?php echo esc_html($status->name) ?></span></td>
585 <td onmouseover="link=true;">
586 <?php
587 $i=0;
588 if(!empty(array_filter($users))){
589 foreach($users as $user){
590 $i++;
591 if( $i <= 4 ){
592 $user_info = get_user_by('id', $user );
593 if(!empty($user_info)){
594 ?>
595 <a href="#" title="<?php echo esc_html($user_info->display_name) ?>">
596 <?php echo get_avatar($user_info->ID, 25, "mysteryman");?>
597 </a> <?php
598 }
599 }
600 }
601 } else{
602 esc_html_e('None','taskbuilder');
603 }
604 if($i > 4){
605 ?>
606 <a href="#" class="wppm_avatar">
607 <span id="wppm_avatar" style="background-color:black;" class="avatar">+<?php echo esc_html($i-4) ?></span>
608 </a>
609 <?php } ?>
610 </td>
611 <td onmouseover="link=true;" class="wppm_table_td"><?php echo isset($category) ? esc_html($category): "" ?></td>
612 <?php if($wppm_default_project_date==1 && $wppm_deafault_time_duration_project==0){ ?>
613 <td onmouseover="link=true;" class="wppm_table_td"><?php echo isset($proj_start_date) ? esc_html($proj_start_date): "" ?></td>
614 <?php
615 if(!empty($proj_end_date) && $project->status!=4 && $proj_end_date < $current_date && ($proj_end_date != '0000-00-00 00:00:00' && $proj_end_date != '00-00-0000 00:00:00' && $proj_end_date != '00-00-0000' && $proj_end_date != '0000-00-00')) {
616 $style = "color:#FF0000";
617 } else {
618 $style = "color:#2C3E50";
619 } ?>
620 <td onmouseover="link=true;" class="wppm_table_td"><span style="<?php echo esc_attr($style); ?>"><?php echo isset($proj_end_date) ? esc_html($proj_end_date):"" ?></span></td>
621 <?php } ?>
622 <?php if($wppm_deafault_time_duration_project==1){ ?>
623 <?php
624 if(!empty($proj_end_date) && $project->status!=4 && $proj_end_date < $current_date && ($proj_end_date != '0000-00-00 00:00:00' && $proj_end_date != '00-00-0000 00:00:00' && $proj_end_date != '00-00-0000' && $proj_end_date != '0000-00-00')) {
625 $style = "color:#FF0000";
626 } else {
627 $style = "color:#2C3E50";
628 } ?>
629 <td onmouseover="link=true;" class="wppm_table_td"><span style="<?php echo esc_attr($style); ?>"><?php echo isset($wppm_proj_duration) ? esc_html($wppm_proj_duration):"" ?></span></td>
630 <?php } ?>
631 <td onmouseover="link=true;" class="wppm_table_td"><?php echo isset($no_of_tasks) ? esc_html($no_of_tasks):"" ?></td>
632 <td onmouseover="link=true;" class="wppm_delete_action">
633 <?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"; ?>
634 <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>
635 <?php ?>
636 </td>
637 </tr>
638 <?php
639 }
640 }
641 ?>
642 </tbody>
643 </table>
644 <?php
645 $total_pages=ceil($totalrows/$proj_per_page);
646 $current_page=$page_no+1;
647 $prev_page_no=$current_page-1;
648 $prev_class=($prev_page_no==0)?'disabled':'';
649 $next_page_no=($total_pages==$current_page)? $current_page-1:$current_page;
650 $next_class=($total_pages==$current_page)?'disabled':'';
651 ?>
652 <div class="wppm_project_result" style="<?php echo esc_attr($total_pages==0)? '':'display: none;';?>"><?php echo esc_html_e('Your search request returned no results.','taskbuilder');?></div>
653 <hr style="<?php echo esc_attr($total_pages==0)? '':'display: none;';?>">
654 </div>
655 <div class="row wppm_proj_pagination_container">
656 <div class="col-sm-4">
657 <?php echo esc_html_e('Total:','taskbuilder'); ?>&nbsp;<?php echo esc_html($total_projects) ?>&nbsp;<?php echo esc_html_e('of','taskbuilder') ?>&nbsp;<?php echo esc_html($totalrows) ?>&nbsp;<?php echo esc_html_e('Projects','taskbuilder')?>
658 </div>
659 <div class="col-sm-4">
660 <div class="wppm_proj_pagination" style="<?php echo esc_attr($total_pages==0)? "display:none;":"display:flex;"?>">
661 <span class="wppm-pagination-txt">
662 <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>
663 </span>
664 <span
665 <?php echo esc_html($prev_class) ?>
666 style="<?php echo (isset($prev_class) && esc_attr($prev_class) == 'disabled') ? 'display:none;':'display:block;'?>">
667 <a class="wppm_pagination_prev" onclick="return wppm_load_prev_page(<?php echo esc_attr($prev_page_no) ?>,<?php echo esc_attr($page_no) ?>,'<?php echo esc_attr($sort_by)?>','<?php echo esc_attr($order) ?>','<?php echo esc_attr($is_archieved)?>');"><?php echo esc_html_e('PREV','taskbuilder');?></a>
668 </span>
669 <span
670 <?php echo esc_attr($next_class) ?>
671 style="<?php echo (isset($next_class) && $next_class == 'disabled')?'display:none;':'display:block;'?>cursor:pointer;">
672 <a class="wppm_pagination_next" onclick="return wppm_load_next_page('<?php echo esc_attr($next_page_no) ?>','<?php echo esc_attr($page_no) ?>','<?php echo esc_attr($sort_by)?>','<?php echo esc_attr($order) ?>','<?php echo esc_attr($is_archieved)?>');"><?php echo esc_html_e('NEXT','taskbuilder');?></a>
673 </span>
674 </div>
675 </div>
676 </div>
677 </div>
678 </div>
679 </form>
680 <style>
681 #wppm_project_table tr:nth-child(even) td{
682 background-color:<?php echo esc_attr($appearance_settings['list-item-even-background-color'])?>!important;
683 color:<?php echo esc_attr($appearance_settings['list-item-even-text-color'])?>!important;
684 }
685 #wppm_project_table tr:nth-child(odd) td{
686 background-color:<?php echo esc_attr($appearance_settings['list-item-odd-background-color'])?>!important;
687 color:<?php echo esc_attr($appearance_settings['list-item-odd-text-color'])?>!important;
688 }
689 #wppm_project_table tr:hover td{
690 background-color:<?php echo esc_attr($appearance_settings['list-item-hover-background-color'])?>!important;
691 }
692 #wppm_project_table tr:hover td{
693 color: <?php echo esc_attr($appearance_settings['list-item-hover-text-color'])?>!important;
694 }
695 #wppm_add_new_project_btn:hover,#wppm_project_list:hover,#wppm_archieve_project_btn:hover{
696 background-color: <?php echo esc_attr($appearance_settings['list-header-button-hover-color'])?>!important;
697 }
698 </style>
699 <script type="text/javascript">
700 jQuery( document ).ready( function( jQuery ) {
701 let createdBy = <?php echo wp_json_encode(array_map('strval', $advanced_filter['created_by'] ?? [])); ?>;
702 let assignedUsers = <?php echo wp_json_encode(array_map('strval', $advanced_filter['assigned'] ?? [])); ?>;
703 let categoryIds = <?php echo wp_json_encode(array_map('strval', $advanced_filter['category'] ?? [])); ?>;
704 jQuery('#tb-created-by').select2({ width: '100%', dropdownParent: jQuery('#tb-advanced-panel') });
705 jQuery('#tb-assigned').select2({ width: '100%', dropdownParent: jQuery('#tb-advanced-panel') });
706 jQuery('#tb-category').select2({ width: '100%', dropdownParent: jQuery('#tb-advanced-panel') });
707 jQuery('#tb-created-by').val(createdBy).trigger('change');
708 jQuery('#tb-assigned').val(assignedUsers).trigger('change');
709 jQuery('#tb-category').val(categoryIds).trigger('change');
710 jQuery('#tb-start-date').val('<?php echo esc_attr($advanced_filter['start_date'] ?? ''); ?>');
711 jQuery('#tb-end-date').val('<?php echo esc_attr($advanced_filter['end_date'] ?? ''); ?>');
712
713 window.projectFilters = window.projectFilters || {
714 created_by: createdBy,
715 assigned: assignedUsers,
716 category: categoryIds,
717 start_date: '<?php echo esc_js($advanced_filter['start_date'] ?? ''); ?>',
718 end_date: '<?php echo esc_js($advanced_filter['end_date'] ?? ''); ?>'
719 };
720
721 jQuery(document).off("click", "#tb-apply-filter").on("click", "#tb-apply-filter", function (e) {
722 e.preventDefault();
723 window.projectFilters = {
724 created_by: jQuery("#tb-created-by").val() || [],
725 assigned: jQuery("#tb-assigned").val() || [],
726 category: jQuery("#tb-category").val() || [],
727 start_date: jQuery("#tb-start-date").val() || "",
728 end_date: jQuery("#tb-end-date").val() || ""
729 };
730 renderActiveFilters(window.projectFilters);
731 setProjectListFilterCookie(window.projectFilters);
732 triggerProjectFilter(1, window.projectFilters, <?php echo (int) $is_archieved; ?>);
733 });
734
735 jQuery(document).off("click", ".tb-remove").on("click", ".tb-remove", function () {
736 let key = jQuery(this).attr("data-key");
737 let value = jQuery(this).attr("data-value");
738 if (key === "date") {
739 window.projectFilters.start_date = "";
740 window.projectFilters.end_date = "";
741 jQuery("#tb-start-date").val("");
742 jQuery("#tb-end-date").val("");
743 } else {
744 window.projectFilters[key] = (window.projectFilters[key] || [])
745 .map(String)
746 .filter(v => v !== String(value));
747 jQuery(`#tb-${key}`).val(window.projectFilters[key]).trigger("change");
748 }
749 jQuery(this).closest(".tb-chip").remove();
750 syncUIWithFilters(window.projectFilters);
751 setProjectListFilterCookie(window.projectFilters);
752 triggerProjectFilter(1, window.projectFilters, <?php echo (int) $is_archieved; ?>);
753 });
754
755 jQuery(document).off("click", "#tb-reset-filter").on("click", "#tb-reset-filter", function () {
756 resetProjectFilters(<?php echo (int) $is_archieved; ?>);
757 });
758
759 let savedProjectFilters = getProjectListFilterCookie();
760 if (savedProjectFilters && typeof savedProjectFilters === "object") {
761 window.projectFilters = {
762 created_by: savedProjectFilters.created_by || [],
763 assigned: savedProjectFilters.assigned || [],
764 category: savedProjectFilters.category || [],
765 start_date: savedProjectFilters.start_date || "",
766 end_date: savedProjectFilters.end_date || ""
767 };
768 }
769 setTimeout(function () {
770 syncUIWithFilters(window.projectFilters);
771 renderActiveFilters(window.projectFilters);
772 }, 100);
773
774 jQuery(document).off("click", "#tb-advanced-toggle").on("click", "#tb-advanced-toggle", function (e) {
775 e.stopPropagation();
776 jQuery("#tb-advanced-panel").toggleClass("tb-open");
777 });
778 jQuery(document).off("click", "#tb-backdrop").on("click", "#tb-backdrop", function () {
779 jQuery("#tb-advanced-panel").removeClass("tb-open");
780 jQuery(this).removeClass("active");
781 });
782 jQuery(document).off("click.tbProjOutside").on("click.tbProjOutside", function (e) {
783 if (window.innerWidth > 768) {
784 if (!jQuery(e.target).closest("#tb-advanced-panel, #tb-advanced-toggle").length) {
785 jQuery("#tb-advanced-panel").removeClass("tb-open");
786 }
787 }
788 });
789 jQuery(document).off("click", "#tb-close-filters").on("click", "#tb-close-filters", function () {
790 jQuery("#tb-advanced-panel").removeClass("tb-open");
791 jQuery("#tb-backdrop").removeClass("active");
792 });
793
794 jQuery("input[name='wppm_project_search_filter']").keypress(function(e) {
795 //Enter key
796 if (e.which == 13) {
797 wppm_project_search_filter(<?php echo $is_archieved ?>);
798 }
799 });
800 jQuery("#wppm_proj_name_th").hover(function(){
801 jQuery('#wppm_chevron_sort_up_project_name_img').show();
802 jQuery('#wppm_chevron_sort_down_project_name_img').hide();
803 });
804 jQuery("#wppm_project_status_th").hover(function(){
805 jQuery('#wppm_chevron_sort_up_project_status_img').show();
806 jQuery('#wppm_chevron_sort_down_project_status_img').hide();
807 });
808 jQuery("#wppm_project_category_th").hover(function(){
809 jQuery('#wppm_chevron_sort_up_project_cat_img').show();
810 jQuery('#wppm_chevron_sort_down_project_cat_img').hide();
811 });
812 jQuery("#wppm_project_start_date_th").hover(function(){
813 jQuery('#wppm_chevron_sort_up_project_start_date_img').show();
814 jQuery('#wppm_chevron_sort_down_project_start_date_img').hide();
815 });
816 jQuery("#wppm_project_end_date_th").hover(function(){
817 jQuery('#wppm_chevron_sort_up_project_end_date_img').show();
818 jQuery('#wppm_chevron_sort_down_project_end_date_img').hide();
819 });
820 jQuery("#wppm_project_time_duration_th").hover(function(){
821 jQuery('#wppm_chevron_sort_up_project_time_duration_img').show();
822 jQuery('#wppm_chevron_sort_down_project_time_duration_img').hide();
823 });
824 jQuery(".wppm_delete_action").on("click", function(e){
825 e.preventDefault();
826 return false;
827 });
828
829 jQuery('#wppm_project_list_frm').on('submit', function (e) {
830 var dataform = new FormData(jQuery('#wppm_project_list_frm')[0]);
831 jQuery.ajax({
832 url: wppm_admin.ajax_url,
833 type: 'POST',
834 data: dataform,
835 processData: false,
836 contentType: false,
837 success: function () {
838 alert('form was submitted');
839 }
840 });
841 });
842 });
843 /**
844 * Bulk item selector change
845 */
846 function wppm_bulk_item_select_change() {
847 jQuery("#wppm-bulk-actions-btn").show();
848 var items = jQuery(".wppm-bulk-select:checked");
849 var checked = items.length === 0 ? false : true;
850 if(checked){
851 jQuery(".wppm-bulk-selector").prop("checked", checked);
852 }else{
853 jQuery("#wppm-bulk-actions-btn").hide();
854 jQuery(".wppm-bulk-selector").prop("checked", false);
855 }
856 }
857 </script>
858 <?php
859 add_action('wp_footer', 'wppm_page_inline_script', 999999999999999999);
860 do_action('wppm_after_shortcode_loaded');
861 if(!function_exists('wppm_page_inline_script')) {
862 function wppm_page_inline_script() { ?>
863 <script type="text/javascript">
864 jQuery( document ).ready( function( jQuery ) {
865 wppm_get_project_list();
866 });
867 </script>
868 <?php }
869 }
870 ?>