PluginProbe
Taskbuilder – Project Management & Task Management Tool With Kanban Board / 6.0.2
Taskbuilder – Project Management & Task Management Tool With Kanban Board v6.0.2
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 1.0.6 All 57 releases
taskbuilder / includes / admin / projects / projects_list.php

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

647 lines 43.0 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 $appearance_settings = get_option("wppm-ap-project-list");
9 $wppm_date_setting = get_option('wppm_date_setting');
10 $wppm_deafault_time_duration_project = get_option('wppm_display_time_duration_project');
11 $wppm_current_user_capability = get_user_meta( $current_user->ID, 'wppm_capability', true );
12 $proj_per_page = 20;
13 $page_no = (isset($_POST['page_no'])) ? intval(sanitize_text_field($_POST['page_no'])): '0';
14 $page = isset($_POST['page']) ? sanitize_text_field(wp_unslash($_POST['page'])):"";
15 $search_tag = isset($_POST['project_search']) ? sanitize_text_field($_POST['project_search']) : '';
16 $order = isset($_POST['order']) ? sanitize_text_field($_POST['order']) :"ASC";
17 $sort_by = isset($_POST['sort_by']) ? sanitize_text_field($_POST['sort_by']):"project_name";
18 $filter_by = isset($_POST['wppm_project_filter']) ? sanitize_text_field($_POST['wppm_project_filter']) : "all";
19 $is_archieved = !empty($_POST['is_archieved']) ? 1 : 0;
20 $current_date = wp_date('Y-m-d');
21 $wppm_pl_filter = "1=1";
22 $wppm_hide_completed_status_proj = get_option('wppm_hide_completed_status_proj');
23 $cu_id = esc_sql($current_user->ID);
24 $wppm_hide_proj_statuses_from_frontend = get_option('wppm_hide_proj_statuses_from_frontend');
25 if(!empty($wppm_hide_proj_statuses_from_frontend)){
26 $wppm_hide_proj_statuses_from_frontend = explode(",",$wppm_hide_proj_statuses_from_frontend);
27 } else {
28 $wppm_hide_proj_statuses_from_frontend = '';
29 }
30 $filters = array(
31 'sort_by' => $sort_by,
32 'order' => $order,
33 'search' => $search_tag,
34 'filter'=>$filter_by
35 );
36 $pl_filters = isset( $_COOKIE['wppm_proj_filters'] ) ? sanitize_text_field( wp_unslash( $_COOKIE['wppm_proj_filters'] ) ) : $filters;
37 if(!is_array($pl_filters)){
38 $pl_filters = json_decode($pl_filters);
39 $pl_filters_arr = (array) $pl_filters;
40 } else{
41 $pl_filters_arr = $filters;
42 }
43 $search_tag = isset($_POST['project_search']) ? sanitize_text_field($_POST['project_search']) : $pl_filters_arr['search'];
44 $order = isset($_POST['order']) ? sanitize_text_field($_POST['order']) :$pl_filters_arr['order'];
45 $sort_by = isset($_POST['sort_by']) ? sanitize_text_field($_POST['sort_by']):$pl_filters_arr['sort_by'];
46 $filter_by = isset($_POST['wppm_project_filter']) ? sanitize_text_field($_POST['wppm_project_filter']) : $pl_filters_arr['filter'];
47 if($sort_by == ""){
48 $sort_by = 'project_name';
49 }
50 $filters = array(
51 'sort_by' => $sort_by,
52 'order' => $order,
53 'search'=>$search_tag,
54 'filter'=>$filter_by
55 );
56 setcookie('wppm_proj_filters',wp_json_encode( $filters ),time() + 3600);
57
58 $allowed_sort_by = [
59 'project_name' => 'project_name',
60 'status' => 'proj_statuses.name',
61 'category' => 'proj_categories.name',
62 'start_date' => 'start_date',
63 'end_date' => 'end_date',
64 'TIMESTAMPDIFF(SECOND, start_date, end_date)'=> 'TIMESTAMPDIFF(SECOND, start_date, end_date)'
65 ];
66 // Resolve sort_by safely
67 $sort_key = isset($pl_filters_arr['sort_by'])
68 ? sanitize_text_field($pl_filters_arr['sort_by'])
69 : 'project_name';
70
71 $sort_by = $allowed_sort_by[$sort_key] ?? 'project_name';
72 $order = ( isset($pl_filters_arr['order']) && strtoupper($pl_filters_arr['order']) === 'ASC' )
73 ? 'ASC'
74 : 'DESC';
75 if($filter_by=='all'){
76 if($wppm_hide_completed_status_proj == 0){
77 $wppm_pl_filter = "status!='4'";
78 }
79 }
80 if($filter_by=='4'){
81 $wppm_pl_filter = "status='4'";
82 }elseif($filter_by=='overdue'){
83 $wppm_pl_filter = "status!='4' AND (CAST(end_date AS DATE)) < '$current_date'";
84 }elseif($filter_by == 'unassigned'){
85 $wppm_pl_filter = "users=''";
86 }elseif($filter_by == '1'){
87 $wppm_pl_filter = "status='1'";
88 }elseif($filter_by == '2'){
89 $wppm_pl_filter = "status='2'";
90 }elseif($filter_by == '3'){
91 $wppm_pl_filter = "status='3'";
92 }elseif($filter_by == 'mine'){
93 $wppm_pl_filter = "(FIND_IN_SET('$current_user->ID',users)>0)";
94 }
95
96 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 foreach($wppm_hide_proj_statuses_from_frontend as $status){
98 $wppm_pl_filter .= " AND status != '$status'";
99 }
100 }
101 $wppm_project_time = get_option('wppm_project_time');
102 $wppm_default_project_date = get_option('wppm_default_project_date');
103 $sort_by = apply_filters('wppm_project_list_sort_by_query',$sort_by);
104 $order = apply_filters('wppm_project_list_order_query',$order);
105 $search_tag_text = '%'.$wpdb->esc_like($search_tag).'%';
106 if (!empty($search_tag)) {
107 $search_tag_text = '%' . $wpdb->esc_like($search_tag) . '%';
108 $query = "SELECT Project.*
109 FROM {$wpdb->prefix}wppm_project AS Project
110 LEFT JOIN {$wpdb->prefix}wppm_project_statuses proj_statuses ON Project.status = proj_statuses.id
111 LEFT JOIN {$wpdb->prefix}wppm_project_categories proj_categories ON Project.cat_id = proj_categories.id
112 LEFT JOIN {$wpdb->base_prefix}users user ON FIND_IN_SET(user.ID, Project.users) > 0
113 LEFT JOIN {$wpdb->prefix}wppm_project_meta proj_meta ON Project.id = proj_meta.project_id";
114 // SAFE search condition
115 $search_sql = $wpdb->prepare(
116 "(Project.project_name LIKE %s
117 OR proj_statuses.name LIKE %s
118 OR proj_categories.name LIKE %s
119 OR user.display_name LIKE %s)",
120 $search_tag_text,
121 $search_tag_text,
122 $search_tag_text,
123 $search_tag_text
124 );
125 if ($current_user->has_cap('manage_options') || $wppm_current_user_capability == 'wppm_admin') {
126 // �
127 Admin (safe)
128 $where = " WHERE $wppm_pl_filter AND $search_sql";
129 } else {
130 // �
131 Non-admin (safe)
132 $where = $wpdb->prepare(
133 " WHERE $wppm_pl_filter
134 AND $search_sql
135 AND (
136 FIND_IN_SET(%d, Project.users) > 0
137 OR (
138 proj_meta.meta_key = 'public_project'
139 AND proj_meta.meta_value = 1
140 )
141 OR Project.created_by = %d
142 )",
143 $current_user->ID,
144 $cu_id
145 );
146 }
147 } else {
148 if ($sort_by == 'project_name' || $sort_by == 'start_date' || $sort_by == 'end_date') {
149 $query = "SELECT Project.*
150 FROM {$wpdb->prefix}wppm_project AS Project
151 LEFT JOIN {$wpdb->prefix}wppm_project_meta proj_meta ON Project.id = proj_meta.project_id";
152 } else {
153 $query = "SELECT Project.*
154 FROM {$wpdb->prefix}wppm_project AS Project
155 LEFT JOIN {$wpdb->prefix}wppm_project_statuses proj_statuses ON Project.status = proj_statuses.id
156 LEFT JOIN {$wpdb->prefix}wppm_project_categories proj_categories ON Project.cat_id = proj_categories.id
157 LEFT JOIN {$wpdb->prefix}wppm_project_meta proj_meta ON Project.id = proj_meta.project_id";
158 }
159 if ($current_user->has_cap('manage_options') || $wppm_current_user_capability == 'wppm_admin') {
160 $where = " WHERE $wppm_pl_filter";
161 } else {
162 $where = $wpdb->prepare(
163 " WHERE (
164 $wppm_pl_filter
165 AND (
166 FIND_IN_SET(%d, Project.users) > 0
167 OR (
168 proj_meta.meta_key = 'public_project'
169 AND proj_meta.meta_value = 1
170 )
171 )
172 OR Project.created_by = %d
173 )",
174 $current_user->ID,
175 $cu_id
176 );
177 }
178 }
179 $archived_where = '';
180 if ( isset( $is_archieved ) && $is_archieved === 1 ) {
181 $archived_where = ' AND Project.is_archived = 1';
182 } else {
183 $archived_where = ' AND Project.is_archived = 0';
184 }
185 $where .= $archived_where;
186 $no_of_rows = ( "SELECT count(*) FROM ($query");
187 $no_of_rows = apply_filters('wppm_project_list_no_of_rows',$no_of_rows,$wppm_pl_filter,$search_tag);
188 $where = apply_filters('wppm_project_list_query_where',$where, $wppm_pl_filter,$search_tag);
189 $query .= $where." Group by Project.id ORDER BY $sort_by $order";
190 $no_of_rows .= $where." Group by Project.id) AS Project";
191 $totalrows = $wpdb->get_var( $no_of_rows );
192 $query = apply_filters('wppm_project_list_query',$query);
193 $limit_start=$page_no*$proj_per_page;
194 $limit="\n LIMIT ".$limit_start.",".$proj_per_page." ";
195 $query = $query.$limit;
196 $wppm_fillter = $wpdb->get_results($query);
197 $new_status_name = $wpdb->get_var( "SELECT name FROM {$wpdb->prefix}wppm_project_statuses where id='".esc_sql(1)."'" );
198 $inp_status_name = $wpdb->get_var( "SELECT name FROM {$wpdb->prefix}wppm_project_statuses where id='".esc_sql(2)."'" );
199 $hold_status_name = $wpdb->get_var( "SELECT name FROM {$wpdb->prefix}wppm_project_statuses where id='".esc_sql(3)."'" );
200 $completed_status_name = $wpdb->get_var( "SELECT name FROM {$wpdb->prefix}wppm_project_statuses where id='".esc_sql(4)."'" );
201 $new_style = (!empty($new_status_name))? "display:inline" :"display:none;";
202 $inp_status_style = (!empty($inp_status_name))? "display:inline" :"display:none;";
203 $hold_status_style = (!empty($hold_status_name))? "display:inline" :"display:none;";
204 $complete_status_style = (!empty($completed_status_name))? "display:inline" :"display:none;";
205 ?>
206 <form id="wppm_project_list_frm">
207 <div id="wppm-container">
208 <div id="wppm_project_list_container" class="wppm_bootstrap">
209 <div class="row">
210 <div class="col-sm-12" id="wppm_heading_inline">
211 <span class="wppm-heading-inline">
212 <?php echo !empty($is_archieved) ? esc_html__('Archived Projects', 'taskbuilder') : esc_html__('Projects', 'taskbuilder'); ?>
213 </span>
214 <?php if($current_user->has_cap('manage_options') || $wppm_current_user_capability == 'wppm_manager'|| $wppm_current_user_capability == 'wppm_admin'){ ?>
215 <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>
216 <?php } ?>
217 <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>
218 <?php if($current_user->has_cap('manage_options') || $wppm_current_user_capability == 'wppm_manager'|| $wppm_current_user_capability == 'wppm_admin' ){ ?>
219 <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>
220 <?php } ?>
221 </div>
222 </div>
223 <div style="display:flex;justify-content:space-between;margin-top:20px;flex-wrap: wrap;">
224 <div style="display:flex;flex-wrap: wrap;">
225 <div id="wppm_project_filter_container">
226 <div class="wppm-bulk-actions" style="margin-bottom: 10px;">
227 <button
228 id="wppm-bulk-actions-btn"
229 class="wppm-button small secondary"
230 type="button"
231 style="display:none;padding:14px;font: 13px Helvetica Neue, Arial, Helvetica, sans-serif !important"
232 data-popover="wppm-bulk-actions">
233 <?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">
234 </button>
235 <div id="wppm-bulk-actions" class="gpopover wppm-popover-menu wppm-proj-bulk-actions">
236 <div class="wppm-popover-menu-item" onclick="wppm_bulk_change_status('<?php echo esc_attr( wp_create_nonce( 'wppm_bulk_change_status' ) ); ?>');">
237 <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>
238 </div>
239 <div class="wppm-popover-menu-item" onclick="wppm_bulk_change_category('<?php echo esc_attr( wp_create_nonce( 'wppm_bulk_change_category' ) ); ?>');">
240 <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>
241 </div>
242 <div class="wppm-popover-menu-item" onclick="wppm_bulk_assign_users('<?php echo esc_attr( wp_create_nonce( 'wppm_bulk_assign_users' ) ); ?>');">
243 <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>
244 </div>
245 <div class="wppm-popover-menu-item" onclick="wppm_bulk_delete_project('<?php echo esc_attr( wp_create_nonce( 'wppm_bulk_assign_users' ) ); ?>');">
246 <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>
247 </div>
248 </div>
249 </div>
250 <div class="wppm-filter-item">
251 <label for="wppm_project_filter"> <?php echo esc_html_e('Filter','taskbuilder');?></label>
252 <select id="wppm_project_filter" name="wppm_project_filter" onchange="wppm_apply_project_filter(<?php echo $is_archieved ?>)">
253 <option value="all"<?php echo ($filter_by == "all")? 'selected':""?>><?php echo esc_html_e('All','taskbuilder');?></option>
254 <option style="<?php echo esc_attr($new_style) ?>" value="1" <?php echo ($filter_by == "1")? 'selected':""?>><?php echo esc_html($new_status_name);?></option>
255 <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>
256 <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>
257 <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>
258 <option value="mine" <?php echo ($filter_by == "mine")? 'selected':""?>><?php echo esc_html_e('Mine','taskbuilder');?></option>
259 <option value="unassigned" <?php echo ($filter_by == "unassigned")? 'selected':""?>><?php echo esc_html_e('Unassigned','taskbuilder');?></option>
260 <option value="overdue" <?php echo ($filter_by == "overdue")? 'selected':""?>><?php echo esc_html_e('Overdue','taskbuilder');?></option>
261 </select>
262 </div>
263 <div class="wppm_display_submit">
264 <div class="wppm-filter-actions">
265 <span class="wppm-link" onclick="wppm_pl_reset_filter(<?php echo $is_archieved ?>)"> <?php echo esc_html_e('Reset','taskbuilder');?></span>
266 </div>
267 </div>
268 </div>
269 </div>
270 <div id="wppm_project_and_task_search" style="display:flex;justify-content:flex-end;">
271 <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">
272 <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) : "" ?>">
273 </div>
274 </div>
275 <script>
276 jQuery('#wppm-more-actions-btn, #wppm-bulk-actions-btn').gpopover({width: 200});
277 </script>
278 <div class="table-responsive">
279 <table id="wppm_project_table" class="wppm_table table">
280 <tr>
281 <th class="wppm_table_header" style="background-color:<?php echo esc_attr($appearance_settings['list-header-background-color'])?>" onchange="wppm_bulk_select_change()">
282 <div class="checkbox-container">
283 <input id="wppm_bulk_select_option" class="wppm-bulk-selector" type="checkbox" onchange="wppm_bulk_select_change();"/>
284 <label for="wppm_bulk_select_option"></label>
285 </div>
286 </th>
287 <th class="wppm_table_header" style="background-color:<?php echo esc_attr($appearance_settings['list-header-background-color'])?>">
288 <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>
289 <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">
290 <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">
291 </th>
292 <th class="wppm_table_header" style="background-color:<?php echo esc_attr($appearance_settings['list-header-background-color'])?>">
293 <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>
294 <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">
295 <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">
296 </th>
297 <th class="wppm_table_header" style="background-color:<?php echo esc_attr($appearance_settings['list-header-background-color'])?>">
298 <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>
299 <th class="wppm_table_header" style="background-color:<?php echo esc_attr($appearance_settings['list-header-background-color'])?>">
300 <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>
301 <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">
302 <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">
303 </th>
304 <?php if($wppm_default_project_date==1 && $wppm_deafault_time_duration_project==0){ ?>
305 <th class="wppm_table_header" style="background-color:<?php echo esc_attr($appearance_settings['list-header-background-color'])?>">
306 <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>
307 <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">
308 <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">
309 </th>
310 <th class="wppm_table_header" style="background-color:<?php echo esc_attr($appearance_settings['list-header-background-color'])?>">
311 <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>
312 <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">
313 <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">
314 </th>
315 <?php }
316 if( $wppm_deafault_time_duration_project==1){ ?>
317 <th class="wppm_table_header" style="background-color:<?php echo esc_attr($appearance_settings['list-header-background-color'])?>">
318 <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>
319 <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">
320 <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">
321 </th>
322 <?php }?>
323 <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>
324 <th class="wppm_table_header" style="background-color:<?php echo esc_attr($appearance_settings['list-header-background-color'])?>"></th>
325 </tr>
326 <tbody>
327 <?php
328 $total_projects=0;
329 $users = array();
330 if(!empty($wppm_fillter)){
331 foreach( $wppm_fillter as $project ){
332 $total_projects++;
333 $proejctdata = $wppmfunction->get_project($project->id);
334 $wppm_proj_duration = $wppmfunction->wppm_get_duration($project->start_date,$project->end_date);
335 $pstatus= absint($project->status);
336 $status = $wpdb->get_row( "SELECT * FROM {$wpdb->prefix}wppm_project_statuses where id='$pstatus'" );
337 $users = explode(",",$project->users);
338 $pid= absint($project->id);
339 if(isset($project->cat_id)){
340 $pcat_id = absint($project->cat_id);
341 $category = $wpdb->get_var( "SELECT name FROM {$wpdb->prefix}wppm_project_categories where id='$pcat_id'" );
342 }
343 if(isset($project->id)){
344 if($current_user->has_cap('manage_options') || $wppm_current_user_capability == 'wppm_admin'){
345 $no_of_tasks = $wpdb->get_var("SELECT count(*) FROM {$wpdb->prefix}wppm_task WHERE project='$pid' ");
346 }else{
347 $query =("SELECT count(*) FROM
348 ( SELECT Task.*
349 FROM {$wpdb->prefix}wppm_task AS Task
350 Left join {$wpdb->prefix}wppm_project proj ON Task.project = proj.id
351 Left join {$wpdb->prefix}wppm_project_users proj_users ON Task.project = proj_users.proj_id
352 Left join {$wpdb->prefix}wppm_project_meta proj_meta ON proj.id = proj_meta.project_id
353 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");
354 $no_of_tasks = $wpdb->get_var($query);
355 }
356 $no_of_tasks = apply_filters('wppm_no_of_task_proj_list_query',$no_of_tasks,$project->id);
357 }
358 if($wppm_project_time == 1){
359 $psDate = new DateTime($project->start_date);
360 $peDate = new DateTime($project->end_date);
361 if($project->start_date=='0000-00-00 00:00:00'){
362 if($wppm_date_setting=='Y-m-d H:i:s'){
363 $proj_start_date = '0000-00-00 00:00:00';
364 }elseif($wppm_date_setting=='d-m-Y H:i:s'){
365 $proj_start_date = '00-00-0000 00:00:00';
366 }elseif($wppm_date_setting=='m-d-Y H:i:s'){
367 $proj_start_date = '00-00-0000 00:00:00';
368 }else{
369 $proj_start_date = '0000-00-00 00:00:00';
370 }
371 }if($project->end_date=='0000-00-00 00:00:00'){
372 if($wppm_date_setting=='Y-m-d H:i:s'){
373 $proj_end_date = '0000-00-00 00:00:00';
374 }elseif($wppm_date_setting=='d-m-Y H:i:s'){
375 $proj_end_date = '00-00-0000 00:00:00';
376 }elseif($wppm_date_setting=='m-d-Y H:i:s'){
377 $proj_end_date = '00-00-0000 00:00:00';
378 }else{
379 $proj_end_date = '0000-00-00 00:00:00';
380 }
381 }
382 if($project->start_date!='0000-00-00 00:00:00'){
383 if(!empty($wppm_date_setting)){
384 $proj_start_date = $psDate->format($wppm_date_setting);
385 }else{
386 $proj_start_date = isset($project->start_date)? $project->start_date:"";
387 }
388 }
389 if($project->end_date!='0000-00-00 00:00:00'){
390 if(!empty($wppm_date_setting)){
391 $proj_end_date = $peDate->format($wppm_date_setting);
392 }else{
393 $proj_end_date = isset($project->end_date) ? $project->end_date: "" ;
394 }
395 }
396 } elseif($wppm_project_time == 0){
397 $psDate = new DateTime($project->start_date);
398 $peDate = new DateTime($project->end_date);
399 $proj_start_date = $psDate->format('Y-m-d');
400 $proj_end_date = $peDate->format('Y-m-d');
401 if($project->start_date=='0000-00-00 00:00:00'){
402 if($wppm_date_setting=='Y-m-d H:i:s'){
403 $proj_start_date = '0000-00-00';
404 }elseif($wppm_date_setting=='d-m-Y H:i:s'){
405 $proj_start_date = '00-00-0000';
406 }elseif($wppm_date_setting=='m-d-Y H:i:s'){
407 $proj_start_date = '00-00-0000';
408 }else{
409 $proj_start_date = '0000-00-00';
410 }
411 }
412 if($project->end_date=='0000-00-00 00:00:00'){
413 if($wppm_date_setting=='Y-m-d H:i:s'){
414 $proj_end_date = '0000-00-00';
415 }elseif($wppm_date_setting=='d-m-Y H:i:s'){
416 $proj_end_date = '00-00-0000';
417 }elseif($wppm_date_setting=='m-d-Y H:i:s'){
418 $proj_end_date = '00-00-0000';
419 }else{
420 $proj_end_date = '0000-00-00';
421 }
422
423 }if($project->start_date!='0000-00-00 00:00:00'){
424 if($wppm_date_setting=='Y-m-d H:i:s'){
425 $proj_start_date = $psDate->format('Y-m-d');
426 }elseif($wppm_date_setting=='d-m-Y H:i:s'){
427 $proj_start_date = $psDate->format('d-m-Y');
428 }elseif($wppm_date_setting=='m-d-Y H:i:s'){
429 $proj_start_date = $psDate->format('m-d-Y');
430 }else{
431 $proj_start_date = $psDate->format('Y-m-d');
432 }
433 }
434 if($project->end_date!='0000-00-00 00:00:00'){
435 if($wppm_date_setting=='Y-m-d H:i:s'){
436 $proj_end_date = $peDate->format('Y-m-d');
437 }elseif($wppm_date_setting=='d-m-Y H:i:s'){
438 $proj_end_date = $peDate->format('d-m-Y');
439 }elseif($wppm_date_setting=='m-d-Y H:i:s'){
440 $proj_end_date = $peDate->format('m-d-Y');
441 }else{
442 $proj_end_date = $peDate->format('Y-m-d');
443 }
444 }
445 }
446 ?>
447 <tr onclick="if(link)wppm_open_project(<?php echo esc_attr($project->id) ?>)">
448 <td class="bulk-selector" onmouseover="link=false;" onmouseout="link=true;">
449 <div class="wppm-pl-item-selector">
450 <div class="checkbox-container">
451 <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 ); ?>"/>
452 <label for="wppm_bulk_select_<?php echo esc_attr($project->id) ?>"></label>
453 </div>
454 </div>
455 </td>
456 <td onmouseover="link=true;"><?php echo esc_html($project->project_name) ?></td>
457 <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>
458 <td onmouseover="link=true;">
459 <?php
460 $i=0;
461 if(!empty(array_filter($users))){
462 foreach($users as $user){
463 $i++;
464 if( $i <= 4 ){
465 $user_info = get_user_by('id', $user );
466 if(!empty($user_info)){
467 ?>
468 <a href="#" title="<?php echo esc_html($user_info->display_name) ?>">
469 <?php echo get_avatar($user_info->ID, 25, "mysteryman");?>
470 </a> <?php
471 }
472 }
473 }
474 } else{
475 esc_html_e('None','taskbuilder');
476 }
477 if($i > 4){
478 ?>
479 <a href="#" class="wppm_avatar">
480 <span id="wppm_avatar" style="background-color:black;" class="avatar">+<?php echo esc_html($i-4) ?></span>
481 </a>
482 <?php } ?>
483 </td>
484 <td onmouseover="link=true;" class="wppm_table_td"><?php echo isset($category) ? esc_html($category): "" ?></td>
485 <?php if($wppm_default_project_date==1 && $wppm_deafault_time_duration_project==0){ ?>
486 <td onmouseover="link=true;" class="wppm_table_td"><?php echo isset($proj_start_date) ? esc_html($proj_start_date): "" ?></td>
487 <?php
488 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')) {
489 $style = "color:#FF0000";
490 } else {
491 $style = "color:#2C3E50";
492 } ?>
493 <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>
494 <?php } ?>
495 <?php if($wppm_deafault_time_duration_project==1){ ?>
496 <?php
497 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')) {
498 $style = "color:#FF0000";
499 } else {
500 $style = "color:#2C3E50";
501 } ?>
502 <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>
503 <?php } ?>
504 <td onmouseover="link=true;" class="wppm_table_td"><?php echo isset($no_of_tasks) ? esc_html($no_of_tasks):"" ?></td>
505 <td onmouseover="link=true;" class="wppm_delete_action">
506 <?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"; ?>
507 <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>
508 <?php ?>
509 </td>
510 </tr>
511 <?php
512 }
513 }
514 ?>
515 </tbody>
516 </table>
517 <?php
518 $total_pages=ceil($totalrows/$proj_per_page);
519 $current_page=$page_no+1;
520 $prev_page_no=$current_page-1;
521 $prev_class=($prev_page_no==0)?'disabled':'';
522 $next_page_no=($total_pages==$current_page)? $current_page-1:$current_page;
523 $next_class=($total_pages==$current_page)?'disabled':'';
524 ?>
525 <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>
526 <hr style="<?php echo esc_attr($total_pages==0)? '':'display: none;';?>">
527 </div>
528 <div class="row wppm_proj_pagination_container">
529 <div class="col-sm-4">
530 <?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')?>
531 </div>
532 <div class="col-sm-4">
533 <div class="wppm_proj_pagination" style="<?php echo esc_attr($total_pages==0)? "display:none;":"display:flex;"?>">
534 <span class="wppm-pagination-txt">
535 <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>
536 </span>
537 <span
538 <?php echo esc_html($prev_class) ?>
539 style="<?php echo (isset($prev_class) && esc_attr($prev_class) == 'disabled') ? 'display:none;':'display:block;'?>">
540 <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>
541 </span>
542 <span
543 <?php echo esc_attr($next_class) ?>
544 style="<?php echo (isset($next_class) && $next_class == 'disabled')?'display:none;':'display:block;'?>cursor:pointer;">
545 <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>
546 </span>
547 </div>
548 </div>
549 </div>
550 </div>
551 </div>
552 </form>
553 <style>
554 #wppm_project_table tr:nth-child(even) td{
555 background-color:<?php echo esc_attr($appearance_settings['list-item-even-background-color'])?>!important;
556 color:<?php echo esc_attr($appearance_settings['list-item-even-text-color'])?>!important;
557 }
558 #wppm_project_table tr:nth-child(odd) td{
559 background-color:<?php echo esc_attr($appearance_settings['list-item-odd-background-color'])?>!important;
560 color:<?php echo esc_attr($appearance_settings['list-item-odd-text-color'])?>!important;
561 }
562 #wppm_project_table tr:hover td{
563 background-color:<?php echo esc_attr($appearance_settings['list-item-hover-background-color'])?>!important;
564 }
565 #wppm_project_table tr:hover td{
566 color: <?php echo esc_attr($appearance_settings['list-item-hover-text-color'])?>!important;
567 }
568 </style>
569 <script type="text/javascript">
570 jQuery( document ).ready( function( jQuery ) {
571 jQuery("input[name='wppm_project_search_filter']").keypress(function(e) {
572 //Enter key
573 if (e.which == 13) {
574 wppm_project_search_filter(<?php echo $is_archieved ?>);
575 }
576 });
577 jQuery("#wppm_proj_name_th").hover(function(){
578 jQuery('#wppm_chevron_sort_up_project_name_img').show();
579 jQuery('#wppm_chevron_sort_down_project_name_img').hide();
580 });
581 jQuery("#wppm_project_status_th").hover(function(){
582 jQuery('#wppm_chevron_sort_up_project_status_img').show();
583 jQuery('#wppm_chevron_sort_down_project_status_img').hide();
584 });
585 jQuery("#wppm_project_category_th").hover(function(){
586 jQuery('#wppm_chevron_sort_up_project_cat_img').show();
587 jQuery('#wppm_chevron_sort_down_project_cat_img').hide();
588 });
589 jQuery("#wppm_project_start_date_th").hover(function(){
590 jQuery('#wppm_chevron_sort_up_project_start_date_img').show();
591 jQuery('#wppm_chevron_sort_down_project_start_date_img').hide();
592 });
593 jQuery("#wppm_project_end_date_th").hover(function(){
594 jQuery('#wppm_chevron_sort_up_project_end_date_img').show();
595 jQuery('#wppm_chevron_sort_down_project_end_date_img').hide();
596 });
597 jQuery("#wppm_project_time_duration_th").hover(function(){
598 jQuery('#wppm_chevron_sort_up_project_time_duration_img').show();
599 jQuery('#wppm_chevron_sort_down_project_time_duration_img').hide();
600 });
601 jQuery(".wppm_delete_action").on("click", function(e){
602 e.preventDefault();
603 return false;
604 });
605
606 jQuery('#wppm_project_list_frm').on('submit', function (e) {
607 var dataform = new FormData(jQuery('#wppm_project_list_frm')[0]);
608 jQuery.ajax({
609 url: wppm_admin.ajax_url,
610 type: 'POST',
611 data: dataform,
612 processData: false,
613 contentType: false,
614 success: function () {
615 alert('form was submitted');
616 }
617 });
618 });
619 });
620 /**
621 * Bulk item selector change
622 */
623 function wppm_bulk_item_select_change() {
624 jQuery("#wppm-bulk-actions-btn").show();
625 var items = jQuery(".wppm-bulk-select:checked");
626 var checked = items.length === 0 ? false : true;
627 if(checked){
628 jQuery(".wppm-bulk-selector").prop("checked", checked);
629 }else{
630 jQuery("#wppm-bulk-actions-btn").hide();
631 jQuery(".wppm-bulk-selector").prop("checked", false);
632 }
633 }
634 </script>
635 <?php
636 add_action('wp_footer', 'wppm_page_inline_script', 999999999999999999);
637 do_action('wppm_after_shortcode_loaded');
638 if(!function_exists('wppm_page_inline_script')) {
639 function wppm_page_inline_script() { ?>
640 <script type="text/javascript">
641 jQuery( document ).ready( function( jQuery ) {
642 wppm_get_project_list();
643 });
644 </script>
645 <?php }
646 }
647 ?>