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

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