PluginProbe
Taskbuilder – Project Management & Task Management Tool With Kanban Board / trunk
Taskbuilder – Project Management & Task Management Tool With Kanban Board vtrunk
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 trunk, at includes/admin/projects/projects_list.php

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