PluginProbe
Taskbuilder – Project Management & Task Management Tool With Kanban Board / 6.0.7
Taskbuilder – Project Management & Task Management Tool With Kanban Board v6.0.7
6.0.7 6.0.6 6.0.5 6.0.2 6.0.3 6.0.4 6.0.1 6.0.0 5.0.8 5.0.9 4.0.9 5.0.0 5.0.1 5.0.2 5.0.3 5.0.4 5.0.5 5.0.6 5.0.7 trunk 1.0.0 1.0.1 1.0.2 1.0.3 1.0.4 All 59 releases
taskbuilder / includes / admin / projects / projects_list.php

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

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