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

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