PluginProbe
Taskbuilder – Project Management & Task Management Tool With Kanban Board / 6.0.6
Taskbuilder – Project Management & Task Management Tool With Kanban Board v6.0.6
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 1.0.5 All 58 releases
← All changes | includes/admin/tasks/wppm_tasks_list.php +1319 -229 1.0.46.0.6 View file →
@@ -3,270 +3,1360 @@
3 3 exit; // Exit if accessed directly
4 4 }
5 5 global $current_user,$wpdb,$wppmfunction;
6 6 $task_per_page = 20;
7 -$page_no = isset($_POST['page_no']) ? intval(sanitize_text_field($_POST['page_no'])): '0';
8 -$search_tag = isset($_POST['task_search']) ? sanitize_text_field($_POST['task_search']) : '';
7 +$page_no = isset($_POST['page_no']) ? intval(sanitize_text_field(wp_unslash($_POST['page_no']))) : '0';
8 +$project_id = isset($_POST['project_id']) ? intval(sanitize_text_field(wp_unslash($_POST['project_id']))) : "0";
9 +$search_tag = isset($_POST['task_search']) ? sanitize_text_field(wp_unslash($_POST['task_search'])) : '';
10 +$order = isset($_POST['order']) ? sanitize_text_field(wp_unslash($_POST['order'])) :"ASC";
11 +$sort_by = isset($_POST['sort_by']) ? sanitize_text_field(wp_unslash($_POST['sort_by'])):"task_name";
12 +$filter_by = isset($_POST['wppm_task_filter']) ? sanitize_text_field(wp_unslash($_POST['wppm_task_filter'])) : "all";
13 +if (isset($_POST['filters'])) {
14 + if (is_string($_POST['filters'])) {
15 + $advanced_filter = json_decode( stripslashes( sanitize_text_field( wp_unslash($_POST['filters']))),true );
16 + } elseif (is_array($_POST['filters'])) {
17 + $raw_filters = wp_unslash($_POST['filters']);
18 + $advanced_filter = [
19 + 'created_by' => array_map('absint', (array) ($raw_filters['created_by'] ?? [])),
20 + 'assigned' => array_map('absint', (array) ($raw_filters['assigned'] ?? [])),
21 + 'priority' => array_map('absint', (array) ($raw_filters['priority'] ?? [])),
22 + 'start_date' => sanitize_text_field($raw_filters['start_date'] ?? ''),
23 + 'end_date' => sanitize_text_field($raw_filters['end_date'] ?? ''),
24 + ];
25 + } else {
26 + $advanced_filter = [];
27 + }
28 +}else{
29 + $advanced_filter = [];
30 +}
31 +///$advanced_filter = isset($_POST['filters']) ? (($_POST['filters'])) : "array()";
32 +$proj_filter = isset($_POST['wppm_proj_filter']) ? sanitize_text_field(wp_unslash($_POST['wppm_proj_filter'])) : "0";
33 +$proj_attr = isset($_POST['wppm_project_attr']) ? sanitize_text_field(wp_unslash($_POST['wppm_project_attr'])):"";
34 +$public_projects = isset($_POST['public_projects']) ? sanitize_text_field(wp_unslash($_POST['public_projects'])):"0";
35 +$tb_start_date = isset($_POST['tb_start_date']) ? sanitize_text_field($_POST['tb_start_date']) : '';
36 +$tb_end_date = isset($_POST['tb_end_date']) ? sanitize_text_field($_POST['tb_end_date']) : '';
37 +$tb_created_by = isset($_POST['tb_created_by']) ? sanitize_text_field($_POST['tb_created_by']) : '';
38 +$page = isset($_POST['page']) ? sanitize_text_field(wp_unslash($_POST['page'])):"";
39 +$priorities = $wpdb->get_results("SELECT id, name FROM {$wpdb->prefix}wppm_task_priorities ORDER BY id ASC ");
40 +$users = get_users(array(
41 + 'orderby' => 'display_name',
42 + 'order' => 'ASC'
43 +));
44 +$assigned_users = $wpdb->get_col( " SELECT DISTINCT users FROM {$wpdb->prefix}wppm_task WHERE users != ''");
45 +$all_assigned = [];
46 +foreach ($assigned_users as $row) {
47 + $ids = explode(',', $row);
48 + foreach ($ids as $id) {
49 + $all_assigned[] = trim($id);
50 + }
51 +}
52 +$all_assigned = array_unique($all_assigned);
53 +$wppm_current_user_capability = get_user_meta( $current_user->ID, 'wppm_capability', true );
54 +$wppm_create_tasks_coworkers_permission = get_option('wppm_allow_coworkers_create_task');
55 +$orderby_proj_sql = esc_sql(sanitize_sql_orderby( "project_name" ));
56 +$wppm_date_setting = get_option('wppm_date_setting');
57 +$wppm_hide_completed_status_task = get_option('wppm_hide_completed_status_task');
58 +$wppm_hide_task_statuses_from_frontend = get_option('wppm_hide_task_statuses_from_frontend');
59 +$wppm_deafault_time_duration_task = get_option('wppm_display_time_duration_task');
60 +if(!empty($wppm_hide_task_statuses_from_frontend)){
61 + $wppm_hide_task_statuses_from_frontend = explode(",",$wppm_hide_task_statuses_from_frontend);
62 +} else {
63 + $wppm_hide_task_statuses_from_frontend = '';
64 +}
65 +$proj_attr = esc_sql($proj_attr);
66 +$is_frontend = 0;
67 +if ( ! empty( $proj_attr ) ) {
68 + $wppm_proj_attr = $wpdb->prepare(
69 + ' AND (proj.project_name = %s)',
70 + $proj_attr
71 + );
72 +} else {
73 + $wppm_proj_attr = '';
74 +}
75 +$current_date = wp_date('Y-m-d');
76 +$current_date = esc_sql($current_date );
77 +$cu_id = esc_sql($current_user->ID);
78 +$archived_where = '';
79 +if ( isset( $page ) && $page === 'wppm-archived-tasks' ) {
80 + $archived_where = ' AND Task.is_archived = 1';
81 +} elseif ( isset( $page ) && $page === 'wppm-tasks' ) {
82 + $archived_where = ' AND Task.is_archived = 0';
83 +}
84 +$wppm_task_time = get_option('wppm_task_time');
85 +$query = "SELECT proj.*
86 +FROM {$wpdb->prefix}wppm_project AS proj
87 +LEFT JOIN {$wpdb->prefix}wppm_project_meta AS proj_meta ON proj.id = proj_meta.project_id";
88 +if ( $current_user->has_cap( 'manage_options' ) || $wppm_current_user_capability === 'wppm_admin' ) {
89 + if ( ! empty( $proj_attr ) ) {
90 + $where = $wpdb->prepare(
91 + " WHERE proj.project_name = %s
92 + GROUP BY proj.id
93 + ORDER BY $orderby_proj_sql",
94 + $proj_attr
95 + );
96 + } else {
97 + if ( ! empty( $public_projects ) ) {
98 + $where = $wpdb->prepare(
99 + " WHERE proj_meta.meta_key = %s
100 + AND proj_meta.meta_value = %d
101 + GROUP BY proj.id
102 + ORDER BY $orderby_proj_sql",
103 + 'public_project',
104 + 1
105 + );
106 + } else {
107 + $where = " GROUP BY proj.id ORDER BY $orderby_proj_sql";
108 + }
109 + }
110 +} else {
111 + if ( ! empty( $public_projects ) ) {
112 + $where = $wpdb->prepare(
113 + " WHERE (
114 + proj_meta.meta_key = %s
115 + AND proj_meta.meta_value = %d
116 + )
117 + $wppm_proj_attr
118 + GROUP BY proj.id
119 + ORDER BY $orderby_proj_sql",
120 + 'public_project',
121 + 1
122 + );
123 +
124 + } else {
125 + $where = $wpdb->prepare(
126 + " WHERE (
127 + FIND_IN_SET(%d, proj.users)
128 + OR (
129 + proj_meta.meta_key = %s
130 + AND proj_meta.meta_value = %d
131 + )
132 + OR proj.created_by = %d
133 + )
134 + $wppm_proj_attr
135 + GROUP BY proj.id
136 + ORDER BY $orderby_proj_sql",
137 + $current_user->ID,
138 + 'public_project',
139 + 1,
140 + $cu_id
141 + );
142 + }
143 +}
144 +$where = apply_filters('wppm_project_filter_in_task_list_where',$where);
145 +$query.= $where;
146 +$projects = $wpdb->get_results($query);
147 +$appearance_settings = get_option("wppm-ap-task-list");
148 +$filters = array(
149 + 'sort_by' => $sort_by,
150 + 'order' => $order,
151 + 'search' => $search_tag,
152 + 'filter'=>$filter_by,
153 + 'proj_filter' =>$proj_filter
154 +);
155 +$tl_filters = isset( $_COOKIE['wppm_filters'] ) ? sanitize_text_field( wp_unslash( $_COOKIE['wppm_filters'] ) ) : $filters;
156 +$tl_advanced_filters = [];
157 +if ( !empty($_COOKIE['tb_list_filters']) ) {
158 + $tl_advanced_filters = json_decode(
159 + stripslashes($_COOKIE['tb_list_filters']),
160 + true
161 + );
162 + if ( ! is_array($tl_advanced_filters) ) {
163 + $tl_advanced_filters = [];
164 + }
165 +}
166 +//$tl_advanced_filters = isset( $_COOKIE['wppm_advanced_filters'] ) ? sanitize_text_field( wp_unslash( $_COOKIE['wppm_advanced_filters'] ) ) : $tl_advanced_filters;
167 +
168 +if(!is_array($tl_filters)){
169 + $tl_filters = json_decode($tl_filters);
170 + $tl_filters_arr = (array) $tl_filters;
171 +} else{
172 + $tl_filters_arr = $filters;
173 +}
174 +$wppm_tl_filter = "1=1";
175 +$order = isset($_POST['order']) ? sanitize_text_field(wp_unslash($_POST['order'])) :$tl_filters_arr['order'];
176 +$sort_by = isset($_POST['sort_by']) ? sanitize_text_field(wp_unslash($_POST['sort_by'])):$tl_filters_arr['sort_by'];
177 +$search_tag = isset($_POST['task_search']) ? sanitize_text_field(wp_unslash($_POST['task_search'])) : $tl_filters_arr['search'];
178 +$filter_by = isset($_POST['wppm_task_filter']) ? sanitize_text_field(wp_unslash($_POST['wppm_task_filter'])) : $tl_filters_arr['filter'];
179 +$proj_filter = isset($_POST['wppm_proj_filter']) ? sanitize_text_field(wp_unslash($_POST['wppm_proj_filter'])) : $tl_filters_arr['proj_filter'];
180 +$proj_filter = esc_sql($proj_filter);
181 +if($sort_by == ""){
182 + $sort_by = 'task_name';
183 +}
184 +$filters = array(
185 + 'sort_by' => $sort_by,
186 + 'order' => $order,
187 + 'search'=>$search_tag,
188 + 'filter'=>$filter_by,
189 + 'proj_filter'=>$proj_filter
190 +);
191 +setcookie('wppm_filters',wp_json_encode( $filters ),time() + 3600);
192 +//setcookie('wppm_advanced_filters',wp_json_encode( $tl_advanced_filters ),time() + 3600);
193 +// Allowed sort columns
194 +$allowed_sort_by = [
195 + 'project' => 'proj.project_name',
196 + 'status' => 'task_statuses.name',
197 + 'priority' => 'task_priorities.name',
198 + 'start_date' => 'Task.start_date',
199 + 'end_date' => 'Task.end_date',
200 + 'TIMESTAMPDIFF(SECOND, Task.start_date, Task.end_date)' => 'TIMESTAMPDIFF(SECOND, Task.start_date, Task.end_date)',
201 +];
202 +
203 +// Resolve sort_by safely
204 +$sort_key = isset($_POST['sort_by'])
205 + ? sanitize_text_field(wp_unslash($_POST['sort_by']))
206 + : ($tl_filters_arr['sort_by'] ?? 'task_name');
207 +
208 +$sort_by = $allowed_sort_by[$sort_key] ?? 'Task.task_name';
209 +// Resolve order safely
210 +$order = (isset($_POST['order']) && strtoupper(wp_unslash($_POST['order'])) === 'ASC')
211 + ? 'ASC'
212 + : 'DESC';
213 +
214 +if($filter_by=='all'){
215 + if($wppm_hide_completed_status_task == 0){
216 + $wppm_tl_filter = "Task.status!='4'";
217 + }
218 +}
219 +if($filter_by=='4'){
220 + $wppm_tl_filter = "Task.status='4'";
221 +}elseif($filter_by=='overdue'){
222 + $wppm_tl_filter = "Task.status!='4' AND (CAST(Task.end_date AS DATE)) < '$current_date'";
223 +}elseif($filter_by == 'unassigned'){
224 + $wppm_tl_filter = "Task.users=''";
225 +}elseif($filter_by == '1'){
226 + $wppm_tl_filter = "Task.status='1'";
227 +}elseif($filter_by == '2'){
228 + $wppm_tl_filter = "Task.status='2'";
229 +}elseif($filter_by == '3'){
230 + $wppm_tl_filter = "Task.status='3'";
231 +}elseif($filter_by == 'mine'){
232 + $wppm_tl_filter = "(FIND_IN_SET('$current_user->ID',Task.users)>0)";
233 +}elseif($filter_by == 'archived'){
234 + $wppm_tl_filter = "Task.is_archived = 1";
235 +} elseif($filter_by == 'today'){
236 + $wppm_tl_filter = "DATE(Task.end_date) = CURDATE()";
237 +}elseif($filter_by == 'upcoming'){
238 + $wppm_tl_filter = "DATE(Task.end_date) BETWEEN CURDATE() AND DATE_ADD(CURDATE(), INTERVAL 7 DAY) AND Task.status != 4 AND Task.active = 1 AND Task.is_archived = 0";
239 +}elseif ($filter_by == 'mytasks') {
240 + $wppm_tl_filter = "(
241 + FIND_IN_SET('$current_user->ID', Task.users)
242 + OR Task.created_by = '$current_user->ID'
243 + )
244 + AND Task.status != 4
245 + AND Task.active = 1
246 + AND Task.is_archived = 0";
247 +
248 +}
249 +
250 +if(!empty($tl_advanced_filters['created_by'])){
251 + $created_by_ids = array_map('intval', $tl_advanced_filters['created_by']);
252 + $wppm_tl_filter .= " AND Task.created_by IN (" . implode(',', $created_by_ids) . ")";
253 +}
254 +if(!empty($tl_advanced_filters['assigned'])){
255 + $assigned_ids = array_map('intval', $tl_advanced_filters['assigned']);
256 + $assigned_sql = [];
257 + foreach ($assigned_ids as $id) {
258 + $assigned_sql[] = "FIND_IN_SET('$id', Task.users)";
259 + }
260 + $wppm_tl_filter .= " AND (" . implode(' OR ', $assigned_sql) . ")";
261 +}
262 +if(!empty($tl_advanced_filters['priority'])){
263 + $priority = array_map('intval', $tl_advanced_filters['priority']);
264 + $wppm_tl_filter .= " AND Task.priority IN (" . implode(',', $priority) . ")";
265 +}
266 +if(!empty($tl_advanced_filters['start_date'])){
267 + $start_date = sanitize_text_field($tl_advanced_filters['start_date']);
268 + $wppm_tl_filter .= $wpdb->prepare(" AND (CAST(Task.start_date AS DATE)) >= %s", $start_date);
269 +}
270 +if(!empty($tl_advanced_filters['end_date'])){
271 + $end_date = sanitize_text_field($tl_advanced_filters['end_date']);
272 + $wppm_tl_filter .= $wpdb->prepare(" AND (CAST(Task.end_date AS DATE)) <= %s", $end_date);
273 +}
274 +
275 +$advanced_conditions = [];
276 +// Created By
277 +if (!empty($advanced_filter['created_by'])) {
278 + $created_by_ids = array_map('intval', $advanced_filter['created_by']);
279 + $advanced_conditions[] = "Task.created_by IN (" . implode(',', $created_by_ids) . ")";
280 +}
281 +// Assigned Users
282 +if (!empty($advanced_filter['assigned'])) {
283 + $assigned_ids = array_map('intval', $advanced_filter['assigned']);
284 + $assigned_sql = [];
285 + foreach ($assigned_ids as $id) {
286 + $assigned_sql[] = "FIND_IN_SET('$id', Task.users)";
287 + }
288 + $advanced_conditions[] = "(" . implode(' OR ', $assigned_sql) . ")";
289 +}
290 +// Priority
291 +if (!empty($advanced_filter['priority'])) {
292 + $priority = array_map('intval', $advanced_filter['priority']);
293 + $advanced_conditions[] = "Task.priority IN (" . implode(',', $priority) . ")";
294 +}
295 +// Start Date
296 +if (!empty($advanced_filter['start_date'])) {
297 + $start_date = sanitize_text_field($advanced_filter['start_date']);
298 + $advanced_conditions[] = $wpdb->prepare("(CAST(Task.start_date AS DATE)) >= %s", $start_date);
299 +}
300 +// End Date
301 +if (!empty($advanced_filter['end_date'])) {
302 + $end_date = sanitize_text_field($advanced_filter['end_date']);
303 + $advanced_conditions[] = $wpdb->prepare("(CAST(Task.end_date AS DATE)) <= %s", $end_date);
304 +}
305 +if (!empty($advanced_conditions)) {
306 + $wppm_tl_filter .= " AND " . implode(" AND ", $advanced_conditions);
307 +}
308 +// Subtasks are shown only within their parent task, never as their own row in the task list.
309 +$wppm_tl_filter .= " AND (Task.parent_task_id = 0 OR Task.parent_task_id IS NULL)";
310 +//setcookie('wppm_advanced_filters',wp_json_encode( $advanced_filter ),time() + 3600);
311 +if(!empty($wppm_hide_task_statuses_from_frontend) && is_array($wppm_hide_task_statuses_from_frontend) && ((isset($_POST['is_frontend'])) && (sanitize_text_field(wp_unslash($_POST['is_frontend']))==1))){
312 + foreach($wppm_hide_task_statuses_from_frontend as $status){
313 + $wppm_tl_filter .= " AND Task.status != '$status'";
314 + }
315 +}
316 +if ( $proj_filter != 0 || $project_id != 0 ) {
317 + if ( $project_id != 0 ) {
318 + $proj_filter = $project_id;
319 + }
320 + $proj_filter = absint( $proj_filter );
321 + $wppm_task_by_proj_filter = $wpdb->prepare(
322 + "Task.project = %d",
323 + $proj_filter
324 + );
325 +} else {
326 + $wppm_task_by_proj_filter = "1=1";
327 +}
328 +$wppm_default_task_date = get_option('wppm_default_task_date');
329 +$search_tag_text = "";
9 330 if(!empty($search_tag)){
10 - $search_tag_text = '%'.$search_tag.'%';
11 - if($current_user->has_cap('manage_options')){
12 - $query = ("SELECT Task.*
331 + $search_tag_text = '%'.$wpdb->esc_like($search_tag).'%';
332 + $query = ("SELECT Task.*
13 333 FROM {$wpdb->prefix}wppm_task AS Task
14 334 Left join {$wpdb->prefix}wppm_project proj ON Task.project = proj.id
15 335 Left join {$wpdb->prefix}wppm_task_statuses task_statuses ON Task.status = task_statuses.id
16 336 Left join {$wpdb->prefix}wppm_task_priorities task_priorities ON Task.priority = task_priorities.id
17 - Left join {$wpdb->base_prefix}users user ON (FIND_IN_SET(user.id,Task.users)>0) AND user.display_name LIKE '$search_tag_text'
18 - where Task.task_name LIKE '$search_tag_text' OR proj.project_name LIKE '$search_tag_text' OR task_statuses.name LIKE '$search_tag_text' OR task_priorities.name LIKE '$search_tag_text' OR user.display_name LIKE '$search_tag_text' Group by Task.id");
19 - $no_of_rows = ("SELECT count(*) FROM
20 - (SELECT Task.*
21 - FROM {$wpdb->prefix}wppm_task AS Task
22 - Left join {$wpdb->prefix}wppm_project proj ON Task.project = proj.id
23 - Left join {$wpdb->prefix}wppm_task_statuses task_statuses ON Task.status = task_statuses.id
24 - Left join {$wpdb->prefix}wppm_task_priorities task_priorities ON Task.priority = task_priorities.id
25 - Left join {$wpdb->base_prefix}users user ON (FIND_IN_SET(user.id,Task.users)>0) AND user.display_name LIKE '$search_tag_text'
26 - where Task.task_name LIKE '$search_tag_text' OR proj.project_name LIKE '$search_tag_text' OR task_statuses.name LIKE '$search_tag_text' OR task_priorities.name LIKE '$search_tag_text' OR user.display_name LIKE '$search_tag_text' Group by Task.id) AS Task");
27 - }else{
28 - $query = ("SELECT Task.*
29 - FROM {$wpdb->prefix}wppm_task AS Task
30 - Left join {$wpdb->prefix}wppm_project proj ON Task.project = proj.id
31 - Left join {$wpdb->prefix}wppm_task_statuses task_statuses ON Task.status = task_statuses.id
32 - Left join {$wpdb->prefix}wppm_task_priorities task_priorities ON Task.priority = task_priorities.id
33 337 Left join {$wpdb->prefix}wppm_project_users proj_users ON Task.project = proj_users.proj_id
34 - Left join {$wpdb->base_prefix}users user ON (FIND_IN_SET(user.id,Task.users)>0) AND user.display_name LIKE '$search_tag_text'
35 - where ((FIND_IN_SET('$current_user->ID',Task.users)>0) OR (Task.created_by= '$current_user->ID') OR (proj_users.user_id = '$current_user->ID' AND proj_users.role_id = 1 )) AND (Task.task_name LIKE '$search_tag_text' OR proj.project_name LIKE '$search_tag_text' OR task_statuses.name LIKE '$search_tag_text' OR task_priorities.name LIKE '$search_tag_text' OR user.display_name LIKE '$search_tag_text') Group by Task.id");
36 - $no_of_rows = ("SELECT count(*) FROM
37 - (SELECT Task.*
38 - FROM {$wpdb->prefix}wppm_task AS Task
39 - Left join {$wpdb->prefix}wppm_project proj ON Task.project = proj.id
40 - Left join {$wpdb->prefix}wppm_task_statuses task_statuses ON Task.status = task_statuses.id
41 - Left join {$wpdb->prefix}wppm_task_priorities task_priorities ON Task.priority = task_priorities.id
42 - Left join {$wpdb->prefix}wppm_project_users proj_users ON Task.project = proj_users.proj_id
43 - Left join {$wpdb->base_prefix}users user ON (FIND_IN_SET(user.id,Task.users)>0) AND user.display_name LIKE '$search_tag_text'
44 - where ((FIND_IN_SET('$current_user->ID',Task.users)>0) OR (Task.created_by= '$current_user->ID') OR (proj_users.user_id = '$current_user->ID' AND proj_users.role_id = 1 )) AND (Task.task_name LIKE '$search_tag_text' OR proj.project_name LIKE '$search_tag_text' OR task_statuses.name LIKE '$search_tag_text' OR task_priorities.name LIKE '$search_tag_text' OR user.display_name LIKE '$search_tag_text') Group by Task.id) AS Task");
45 - }
46 -}else{
47 - if($current_user->has_cap('manage_options')){
48 - $query = ( "SELECT * FROM {$wpdb->prefix}wppm_task");
49 - $no_of_rows = ( "SELECT count(*) FROM {$wpdb->prefix}wppm_task" );
338 + Left join {$wpdb->base_prefix}users user ON (FIND_IN_SET(user.ID,Task.users)>0)
339 + Left join {$wpdb->prefix}wppm_project_meta proj_meta ON Task.project = proj_meta.project_id");
340 +}
341 +else{
342 + if($current_user->has_cap('manage_options') || $wppm_current_user_capability == 'wppm_admin'){
343 + if($sort_by=='task_name'|| $sort_by=='start_date' || $sort_by=='end_date'){
344 + $query = ( "SELECT Task.* 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_meta proj_meta ON Task.project = proj_meta.project_id
347 + ");
348 + } else{
349 + $query = ( "SELECT Task.* FROM {$wpdb->prefix}wppm_task AS Task
350 + Left join {$wpdb->prefix}wppm_project proj ON Task.project = proj.id
351 + Left join {$wpdb->prefix}wppm_task_statuses task_statuses ON Task.status = task_statuses.id
352 + Left join {$wpdb->prefix}wppm_task_priorities task_priorities ON Task.priority = task_priorities.id
353 + Left join {$wpdb->prefix}wppm_project_meta proj_meta ON Task.project = proj_meta.project_id
354 + ");
355 + }
50 356 }else{
51 357 $query = ( "SELECT Task.*
52 358 FROM {$wpdb->prefix}wppm_task AS Task
53 359 Left join {$wpdb->prefix}wppm_project proj ON Task.project = proj.id
54 360 Left join {$wpdb->prefix}wppm_project_users proj_users ON Task.project = proj_users.proj_id
55 - where (FIND_IN_SET('$current_user->ID',Task.users)>0) OR (Task.created_by= '$current_user->ID') OR (proj_users.user_id = '$current_user->ID' AND proj_users.role_id = 1 ) Group by Task.id");
56 - $no_of_rows = ( "SELECT count(*) FROM
57 - ( SELECT Task.*
58 - FROM {$wpdb->prefix}wppm_task AS Task
59 - Left join {$wpdb->prefix}wppm_project proj ON Task.project = proj.id
60 - Left join {$wpdb->prefix}wppm_project_users proj_users ON Task.project = proj_users.proj_id
61 - where (FIND_IN_SET('$current_user->ID',Task.users)>0) OR (Task.created_by = '$current_user->ID') OR (proj_users.user_id = '$current_user->ID' AND proj_users.role_id = 1 )Group by Task.id) AS Task");
361 + Left join {$wpdb->prefix}wppm_task_statuses task_statuses ON Task.status = task_statuses.id
362 + Left join {$wpdb->prefix}wppm_task_priorities task_priorities ON Task.priority = task_priorities.id
363 + Left join {$wpdb->prefix}wppm_project_meta proj_meta ON Task.project = proj_meta.project_id
364 + ");
62 365 }
63 366 }
64 -$no_of_rows = apply_filters('wppm_task_list_no_of_rows',$no_of_rows);
367 +$no_of_rows = ( "SELECT count(*) FROM ($query");
368 +if(!empty($search_tag )){
369 + if($current_user->has_cap('manage_options') || $wppm_current_user_capability == 'wppm_admin'){
370 + if(!empty($public_projects)){
371 + //$where = " where (proj_meta.meta_key='public_project' AND proj_meta.meta_value=1) AND $wppm_tl_filter AND $wppm_task_by_proj_filter AND (Task.task_name LIKE '$search_tag_text' OR proj.project_name LIKE '$search_tag_text' OR task_statuses.name LIKE '$search_tag_text' OR task_priorities.name LIKE '$search_tag_text' OR user.display_name LIKE '$search_tag_text') $wppm_proj_attr ";
372 + $where = $wpdb->prepare( " WHERE (proj_meta.meta_key='public_project' AND proj_meta.meta_value=1) AND $wppm_tl_filter AND $wppm_task_by_proj_filter
373 + AND (
374 + Task.task_name LIKE %s
375 + OR proj.project_name LIKE %s
376 + OR task_statuses.name LIKE %s
377 + OR task_priorities.name LIKE %s
378 + OR user.display_name LIKE %s
379 + ) $wppm_proj_attr",
380 + $search_tag_text,
381 + $search_tag_text,
382 + $search_tag_text,
383 + $search_tag_text,
384 + $search_tag_text
385 + );
386 + }else{
387 + $where = $wpdb->prepare(
388 + " WHERE $wppm_tl_filter
389 + AND $wppm_task_by_proj_filter
390 + AND (
391 + Task.task_name LIKE %s
392 + OR proj.project_name LIKE %s
393 + OR task_statuses.name LIKE %s
394 + OR task_priorities.name LIKE %s
395 + OR user.display_name LIKE %s
396 + )
397 + $wppm_proj_attr",
398 + $search_tag_text,
399 + $search_tag_text,
400 + $search_tag_text,
401 + $search_tag_text,
402 + $search_tag_text
403 + );
404 + }
405 + } else{
406 + if(!empty($public_projects)){
407 + $where = $wpdb->prepare(
408 + " WHERE
409 + (proj_meta.meta_key='public_project' AND proj_meta.meta_value=1) AND (proj.is_archived = 0)
410 + AND $wppm_tl_filter
411 + AND $wppm_task_by_proj_filter
412 + AND (
413 + (
414 + FIND_IN_SET(%d, Task.users) > 0
415 + OR Task.created_by = %d
416 + OR (
417 + proj_users.user_id = %d
418 + AND proj_users.role_id = 1
419 + AND FIND_IN_SET(%d, proj.users) > 0
420 + )
421 + OR (
422 + Task.project = proj_meta.project_id
423 + AND proj_meta.meta_key='public_project'
424 + AND proj_meta.meta_value=1
425 + )
426 + OR (
427 + proj.created_by = %d
428 + AND FIND_IN_SET(%d, proj.users) > 0
429 + )
430 + )
431 + AND (
432 + Task.task_name LIKE %s
433 + OR proj.project_name LIKE %s
434 + OR task_statuses.name LIKE %s
435 + OR task_priorities.name LIKE %s
436 + OR user.display_name LIKE %s
437 + )
438 + )
439 + $wppm_proj_attr",
440 + $current_user->ID,
441 + $cu_id,
442 + $cu_id,
443 + $current_user->ID,
444 + $cu_id,
445 + $current_user->ID,
446 + $search_tag_text,
447 + $search_tag_text,
448 + $search_tag_text,
449 + $search_tag_text,
450 + $search_tag_text
451 + );
452 + }else{
453 + $where = $wpdb->prepare(
454 + " WHERE
455 + (proj.is_archived = 0)
456 + AND $wppm_tl_filter
457 + AND $wppm_task_by_proj_filter
458 + AND (
459 + (
460 + FIND_IN_SET(%d, Task.users) > 0
461 + OR Task.created_by = %d
462 + OR (
463 + proj_users.user_id = %d
464 + AND proj_users.role_id = 1
465 + AND FIND_IN_SET(%d, proj.users) > 0
466 + )
467 + OR (
468 + Task.project = proj_meta.project_id
469 + AND proj_meta.meta_key='public_project'
470 + AND proj_meta.meta_value=1
471 + )
472 + OR (
473 + proj.created_by = %d
474 + AND FIND_IN_SET(%d, proj.users) > 0
475 + )
476 + )
477 + AND (
478 + Task.task_name LIKE %s
479 + OR proj.project_name LIKE %s
480 + OR task_statuses.name LIKE %s
481 + OR task_priorities.name LIKE %s
482 + OR user.display_name LIKE %s
483 + )
484 + )
485 + $wppm_proj_attr",
486 + $current_user->ID,
487 + $cu_id,
488 + $cu_id,
489 + $current_user->ID,
490 + $cu_id,
491 + $current_user->ID,
492 + $search_tag_text,
493 + $search_tag_text,
494 + $search_tag_text,
495 + $search_tag_text,
496 + $search_tag_text
497 + );
498 + }
499 + }
500 +}else{
501 + if($current_user->has_cap('manage_options') || $wppm_current_user_capability == 'wppm_admin'){
502 + if(!empty($public_projects)){
503 + $where = $wpdb->prepare(
504 + " WHERE
505 + (proj_meta.meta_key = %s AND proj_meta.meta_value = %d)
506 + AND (proj.is_archived = 0)
507 + AND $wppm_tl_filter
508 + AND $wppm_task_by_proj_filter
509 + $wppm_proj_attr",
510 + 'public_project',
511 + 1
512 + );
513 + }else{
514 + $where = " where (proj.is_archived = 0) AND $wppm_tl_filter AND $wppm_task_by_proj_filter $wppm_proj_attr";
515 + }
516 + } else{
517 + if(!empty($public_projects)){
518 + $where = $wpdb->prepare(
519 + " WHERE
520 + (
521 + proj_meta.meta_key = %s
522 + AND proj_meta.meta_value = %d
523 + )
524 + AND (proj.is_archived = 0)
525 + AND $wppm_tl_filter
526 + AND $wppm_task_by_proj_filter
527 + $wppm_proj_attr",
528 + 'public_project',
529 + 1
530 + );
531 + }else{
532 + $where = $wpdb->prepare(
533 + " WHERE
534 + (proj.is_archived = 0)
535 + AND $wppm_tl_filter
536 + AND $wppm_task_by_proj_filter
537 + AND (
538 + (
539 + FIND_IN_SET(%d, Task.users) > 0
540 + )
541 + OR (
542 + Task.created_by = %d
543 + )
544 + OR (
545 + proj_users.user_id = %d
546 + AND proj_users.role_id = %d
547 + AND FIND_IN_SET(%d, proj.users) > 0
548 + )
549 + OR (
550 + Task.project = proj_meta.project_id
551 + AND proj_meta.meta_key = %s
552 + AND proj_meta.meta_value = %d
553 + )
554 + OR (
555 + proj.created_by = %d
556 + AND FIND_IN_SET(%d, proj.users) > 0
557 + )
558 + )
559 + $wppm_proj_attr",
560 + $current_user->ID,
561 + $cu_id,
562 + $cu_id,
563 + 1,
564 + $current_user->ID,
565 + 'public_project',
566 + 1,
567 + $cu_id,
568 + $current_user->ID
569 + );
570 + }
571 + }
572 +}
573 +$query = apply_filters('wppm_task_list_list_view_query',$query,$search_tag_text);
574 +$no_of_rows= apply_filters('wppm_task_list_number_of_rows_query',$no_of_rows,$search_tag_text);
575 +$where = apply_filters('wppm_task_list_query_where',$where, $wppm_tl_filter,$search_tag_text);
576 +if($filter_by != 'archived'){
577 + $where .= $archived_where;
578 +}
579 +$no_of_rows_where = $where." Group by Task.id) AS Task";
580 +$no_of_rows .= $no_of_rows_where;
581 +$no_of_rows = apply_filters('wppm_task_list_no_of_rows',$no_of_rows,$wppm_tl_filter,$search_tag_text);
582 +$totalrows = $wpdb->get_var($no_of_rows);
583 +$query .= $where." Group by Task.id ORDER BY ".$sort_by." ".$order."";
65 584 $query = apply_filters('wppm_task_list_query',$query);
66 -$totalrows = $wpdb->get_var($no_of_rows);
67 585 $limit_start=$page_no*$task_per_page;
68 586 $limit="\n LIMIT ".$limit_start.",".$task_per_page." ";
69 587 $task_id_array = array();
70 588 $query = $query.$limit;
71 589 $wppm_task_fillter = $wpdb->get_results($query);
590 +$flag = false;
591 +$project_creator = $wpdb->get_var($wpdb->prepare("SELECT created_by FROM {$wpdb->prefix}wppm_project WHERE created_by = %d",$cu_id));
592 +if(!empty($wppm_task_fillter)){
593 + foreach($wppm_task_fillter as $key_filter=>$val_filter){
594 + $val_array = (array) $val_filter;
595 + $tusers = $val_array['users'];
596 + $tusers_arr = explode(',',$tusers);
597 + $tproject_id = esc_sql($val_array['project']);
598 + if(!empty($tusers) && in_array($current_user->ID,$tusers_arr)){
599 + $project_user_role = $wpdb->get_var($wpdb->prepare("SELECT role_id FROM {$wpdb->prefix}wppm_project_users WHERE proj_id = %d AND user_id = %d",$tproject_id,$cu_id));
600 + $project_users = $wpdb->get_var($wpdb->prepare("SELECT users FROM {$wpdb->prefix}wppm_project WHERE id = %d",$tproject_id));
601 + $project_users_arr = explode(',',(string)$project_users);
602 + if(((!empty($project_user_role)) && ($project_user_role == 1) && in_array($current_user->ID,$project_users_arr))){
603 + $flag= true;
604 + break;
605 + }
606 + }
607 + }
608 +}
609 +if(($current_user->has_cap('manage_options') || $wppmfunction->has_permission('add_new_task',0) || ($flag==true) || ($project_creator!="")) && (isset($page) && $page != 'wppm-archived-tasks' )){
610 + $style = "display:inline;";
611 +}else{
612 + $style = "display:none;";
613 +}
614 +$style = apply_filters('wppm_tl_add_new_task_btn_style',$style);
615 +if($current_user->has_cap('manage_options') || $wppm_current_user_capability == ('wppm_admin') || ($flag==true) || ($wppmfunction->has_permission('change_task_status',0))!="" || ($project_creator!="")){
616 + $cs_style = "display:flex;";
617 +}else{
618 + $cs_style = "display:none;";
619 +}
620 +if ( isset($page) && $page === 'wppm-archived-tasks' ) {
621 + $ar_filter_style = "display:none;";
622 +} else {
623 + $ar_filter_style = "display:flex;";
624 +}
625 +$todo_status_name = $wpdb->get_var( "SELECT name FROM {$wpdb->prefix}wppm_task_statuses where id='".esc_sql(1)."'" );
626 +$inp_status_name = $wpdb->get_var( "SELECT name FROM {$wpdb->prefix}wppm_task_statuses where id='".esc_sql(2)."'" );
627 +$hold_status_name = $wpdb->get_var( "SELECT name FROM {$wpdb->prefix}wppm_task_statuses where id='".esc_sql(3)."'" );
628 +$completed_status_name = $wpdb->get_var( "SELECT name FROM {$wpdb->prefix}wppm_task_statuses where id='".esc_sql(4)."'" );
629 +$todo_status_style = (!empty($todo_status_name))? "display:inline" :"display:none;";
630 +$inp_status_style = (!empty($inp_status_name))? "display:inline" :"display:none;";
631 +$hold_status_style = (!empty($hold_status_name))? "display:inline" :"display:none;";
632 +$completed_status_style = (!empty($completed_status_name))? "display:inline" :"display:none;";
633 +if( isset($page) && $page === 'wppm-tasks'){
634 + $arch_filter_style = "display:inline;";
635 +}else{
636 + $arch_filter_style = "display:none;";
637 +}
72 638 ?>
73 -<div id="wppm_task_list_container">
74 - <div class="row">
75 - <div class="col-sm-6">
76 - <span class="wppm-heading-inline"> <?php echo esc_html_e('Tasks','taskbuilder');?> </span>
77 - <span class="wppm-add-new-btn btn-primary" onclick="wppm_add_new_task()"><img class="wppm_add_new_task_img" src="<?php echo esc_url( WPPM_PLUGIN_URL . 'asset/images/plus_icon.svg'); ?>" alt="add_icon"><?php echo esc_html_e('Add New','taskbuilder');?></span>
639 +<form id="wppm_task_list_frm">
640 + <div id="wppm_task_list_container" class="wppm_bootstrap">
641 + <div class="row">
642 + <div class="col-sm-12" id="wppm_heading_inline">
643 + <span class="wppm-heading-inline"><?php echo (isset($page) && $page === 'wppm-archived-tasks' ) ? esc_html_e('Archived Tasks','taskbuilder'): esc_html_e('Tasks','taskbuilder');?> </span>
644 + <span class="wppm-add-new-btn btn-primary" id="wppm_add_new_task_btn_tl" 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'])?>;<?php echo esc_attr($style)?>;" onclick="wppm_add_new_task()"><img class="wppm_add_new_task_img" src="<?php echo esc_url( WPPM_PLUGIN_URL . 'asset/images/plus_icon.svg'); ?>" alt="add_icon"><?php echo esc_html_e('Add New','taskbuilder');?></span>
645 + <!-- Dashboard Button -->
646 + <a class="wppm-add-new-btn btn-primary" 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'])?>;<?php echo esc_attr($style)?>;" href="<?php echo esc_url( admin_url('admin.php?page=wppm-dashboard') ); ?>"
647 + style="margin-right:10px;" title="<?php echo esc_attr_e('Go to Dashboard','taskbuilder'); ?>">
648 + <img src="<?php echo esc_url( WPPM_PLUGIN_URL . 'asset/images/dashboard.svg'); ?>" alt="dashboard_icon">
649 + <?php esc_html_e('Dashboard','taskbuilder'); ?>
650 + </a>
651 + </span>
652 + </div>
78 653 </div>
79 - <div id="wppm_task_search" class="col-sm-6">
80 - <input type="search" id="wppm_task_search_filter" name="wppm_task_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) : "" ?>">
81 - <img width="25" height="15" class="wppm_task_search_filter_img" src="<?php echo esc_url( WPPM_PLUGIN_URL . 'asset/images/search.svg'); ?>" alt="search">
654 + <div>
655 + <div style="display:flex;flex-wrap: wrap;min-width: 0; max-width: 100%;margin-top: 20px;">
656 + <div id="wppm_task_filter_container">
657 + <div class="wppm-bulk-actions"style="margin-left: -14px !important;">
658 + <button
659 + id="wppm-task-bulk-actions-btn"
660 + class="wppm-button small secondary"
661 + type="button"
662 + style="display:none;margin: 14px -20px 0px 22px; padding:14px;font: 13px Helvetica Neue, Arial, Helvetica, sans-serif !important;"
663 + data-popover="wppm-task-bulk-actions">
664 + <?php esc_attr_e( 'Bulk Actions ', 'taskbuilder' ); ?><img src="<?php echo esc_url( WPPM_PLUGIN_URL . 'asset/images/wppm_chevron_down_icon.svg'); ?>" alt="chevron_down">
665 + </button>
666 + <div id="wppm-task-bulk-actions" class="gpopover wppm-popover-menu wppm-proj-bulk-actions">
667 + <div class="wppm-popover-menu-item" style="<?php echo esc_attr($cs_style);?><?php echo esc_attr($ar_filter_style);?>" onclick="wppm_bulk_change_task_status('<?php echo esc_attr( wp_create_nonce( 'wppm_bulk_change_task_status' ) ); ?>');">
668 + <span><img style="margin-right:5px;" src="<?php echo esc_url( WPPM_PLUGIN_URL . 'asset/images/gps-navigation.svg'); ?>" alt="task_status"><?php echo esc_html_e('Change Status','taskbuilder'); ?></span>
669 + </div>
670 + <div class="wppm-popover-menu-item" style="<?php echo esc_attr($ar_filter_style);?>" onclick="wppm_bulk_change_task_priority('<?php echo esc_attr( wp_create_nonce( 'wppm_bulk_change_task_priority' ) ); ?>');">
671 + <span><img style="margin-right:5px;" src="<?php echo esc_url( WPPM_PLUGIN_URL . 'asset/images/priority_up_icon.svg'); ?>" alt="priority"><?php echo esc_html_e('Change Priority','taskbuilder'); ?></span>
672 + </div>
673 + <div class="wppm-popover-menu-item" onclick="wppm_bulk_delete_task('<?php echo esc_attr( wp_create_nonce( 'wppm_bulk_delete_task' ) ); ?>');">
674 + <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 Tasks','taskbuilder'); ?></span>
675 + </div>
676 + </div>
677 + <div class="wppm-filter-item">
678 + <label for="wppm_task_filter" style="margin-left:20px;"> <?php echo esc_html_e('Filter','taskbuilder');?></label>
679 + <select id="wppm_task_filter" name="wppm_task_filter" onchange="wppm_apply_task_filter('<?php echo esc_attr($page); ?>')" style="margin-left:20px;">
680 + <option value="all"<?php echo ($filter_by == "all")? 'selected':""?>><?php echo esc_html_e('All','taskbuilder');?></option>
681 + <option value="1" style="<?php echo esc_attr($todo_status_style); ?>" <?php echo ($filter_by == "1")? 'selected':""?>><?php echo esc_html($todo_status_name);?></option>
682 + <option value="2" style="<?php echo esc_attr($inp_status_style); ?>" <?php echo ($filter_by == "2")? 'selected':""?>><?php echo esc_html($inp_status_name);?></option>
683 + <option value="3" style="<?php echo esc_attr($hold_status_style); ?>" <?php echo ($filter_by == "3")? 'selected':""?>><?php echo esc_html($hold_status_name);?></option>
684 + <option value="4" style="<?php echo esc_attr($completed_status_style); ?>" <?php echo ($filter_by == "4")? 'selected':""?>><?php echo esc_html($completed_status_name);?></option>
685 + <option value="mine" <?php echo ($filter_by == "mine")? 'selected':""?>><?php echo esc_html_e('Mine','taskbuilder');?></option>
686 + <option value="unassigned" <?php echo ($filter_by == "unassigned")? 'selected':""?>><?php echo esc_html_e('Unassigned','taskbuilder');?></option>
687 + <option value="overdue" <?php echo ($filter_by == "overdue")? 'selected':""?>><?php echo esc_html_e('Overdue','taskbuilder');?></option>
688 + <option value="archived" style="<?php echo esc_attr($arch_filter_style); ?>" <?php echo ($filter_by == "archived")? 'selected':""?>><?php echo esc_html_e('Archived','taskbuilder');?></option>
689 + </select>
690 + </div>
691 + </div>
692 + </div>
693 + <div class="wppm-filter-item wppm_project_autocomplete_container" style="margin: 0 0 0 20px;">
694 + <label for="wppm_task_list_proj_filter">
695 + <?php echo esc_html_e('Project','taskbuilder');?>
696 + </label><br>
697 + <select searchable="search here" onchange="wppm_tasks_by_select_project('<?php echo esc_attr($page); ?>')" class="form-control" size="40" name="wppm_task_list_proj_filter" id="wppm_task_list_proj_filter" data-width="100%" style="width: 100%!important;">
698 + <option value="0" <?php echo ($proj_filter == 0)? 'selected':""?>><?php echo esc_html_e('All','taskbuilder');?></option>
699 + <?php
700 + if(!empty($projects)){
701 + foreach($projects as $proj) {
702 + ?><option value="<?php echo esc_attr($proj->id)?>" <?php echo ($proj_filter == $proj->id)? 'selected':""?>><?php echo esc_html($proj->project_name,'taskbuilder');?></option>
703 + <?php }
704 + } ?>
705 + </select>
706 + </div>
707 + <!-- FILTER BUTTON -->
708 + <div class="tb-filters" class="wppm-filter-item" style="display:flex;margin-left: 4px;">
709 + <div class="tb-filter-bar">
710 + <span id="tb-advanced-toggle" class="tb-btn" style="margin-top:0px!important;">
711 + <?php echo esc_html_e('⚙️ Filters', 'taskbuilder'); ?>
712 + </span>
713 +
714 + <!-- ACTIVE FILTER CHIPS -->
715 + <div id="tb-active-filters" class="tb-chips"></div>
716 +
717 + <!-- POPOVER -->
718 + <div id="tb-advanced-panel" class="tb-popover">
719 + <div class="tb-mobile-header">
720 + <span><?php echo esc_html_e('Filters', 'taskbuilder'); ?></span>
721 + <button type="button" id="tb-close-filters">✕</button>
722 + </div>
723 + <div class="tb-arrow"></div>
724 +
725 + <div class="tb-section">
726 + <h4> <?php echo esc_html_e('Created By', 'taskbuilder'); ?></h4>
727 + <select id="tb-created-by" class="form-control" multiple>
728 + <?php
729 + if(!empty($users)){
730 + foreach($users as $user): ?>
731 + <option value="<?php echo esc_attr($user->ID); ?>"><?php echo esc_html($user->display_name); ?></option>
732 + <?php endforeach; ?>
733 + <?php } ?>
734 + </select>
735 + <h4> <?php echo esc_html_e('Assigned To', 'taskbuilder'); ?></h4>
736 + <select id="tb-assigned" multiple>
737 + <?php
738 + if(!empty($all_assigned)){
739 + foreach($all_assigned as $uid){
740 + $user = get_userdata($uid);
741 + if($user){ ?>
742 + <option value="<?php echo esc_attr($uid); ?>">
743 + <?php echo esc_html($user->display_name); ?>
744 + </option>
745 + <?php }
746 + }
747 + }
748 + ?>
749 + </select>
750 + </div>
751 + <div class="tb-section">
752 + <h4> <?php echo esc_html_e('Priority', 'taskbuilder'); ?></h4>
753 + <select id="tb-priority" class="form-control" multiple>
754 + <?php if(!empty($priorities)) {
755 + foreach($priorities as $priority){ ?>
756 + <option value="<?php echo esc_attr($priority->id); ?>">
757 + <?php echo esc_html($priority->name); ?>
758 + </option>
759 + <?php } } ?>
760 + </select>
761 + </div>
762 + <div class="tb-section">
763 + <h4> <?php echo esc_html_e('Date', 'taskbuilder'); ?></h4>
764 + <input type="date" class="form-control" id="tb-start-date">
765 + <input type="date" class="form-control"id="tb-end-date">
766 + </div>
767 + <div id="tb-filter-actions">
768 + <button class="wppm-submit-btn" id="tb-apply-filter" type="button"> <?php echo esc_html_e('Apply', 'taskbuilder'); ?></button>
769 + <button class="wppm_reset_btn" id="tb-reset-filter" type="button"> <?php echo esc_html_e('Reset', 'taskbuilder'); ?></button>
770 + </div>
771 + </div>
772 + </div>
773 + <div id="tb-backdrop"></div>
774 + </div>
775 + <div class="wppm_display_submit" style="margin: 0 0 -5px 10px;">
776 + <div class="wppm-filter-actions">
777 + <span class="wppm-link" onclick="wppm_tl_reset_filter('<?php echo esc_attr($page); ?>')"> <?php echo esc_html_e('Reset','taskbuilder');?></span>
778 + </div>
779 + </div>
780 + <div id="wppm_task_search" style="display:flex;justify-content:flex-end;margin-left: auto;">
781 + <img width="25px" height="15" class="wppm_task_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">
782 + <input type="search" id="wppm_task_search_filter" style="margin-right:10px;" name="wppm_task_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) : "" ?>">
783 + </div>
784 + </div>
82 785 </div>
83 786 </div>
84 - <div class="row">
85 - <div class="col-sm-12">
86 - <span id="wppm_grid_view_btn" onclick="wppm_view_task_search_filter(<?php echo esc_attr($page_no)?>)"><img src="<?php echo esc_url( WPPM_PLUGIN_URL . 'asset/images/grid_view.svg'); ?>" alt="grid_view"><span><?php echo esc_html_e('Grid view','taskbuilder');?></span></span>
87 - </div>
787 + <div style="display:flex;justify-content:flex-end;margin-right: 10px;">
788 + <span id="wppm_grid_view_btn" onclick="wppm_view_task_search_filter('<?php echo esc_attr($page_no)?>','<?php echo esc_attr($page)?>','<?php echo esc_attr($project_id)?>')"><img src="<?php echo esc_url( WPPM_PLUGIN_URL . 'asset/images/grid_view.svg'); ?>" alt="grid_view"><span><?php echo esc_html_e('Grid view','taskbuilder');?></span></span>
88 789 </div>
89 - <div id="wppm_task_table_container" class="wppm_task_table_container table-responsive">
90 - <table id="wppm_task_table" class="wppm_table table">
91 - <thead>
92 - <tr>
93 - <th class="wppm_table_header">
94 - <?php echo esc_html_e('Task name','taskbuilder'); ?>
95 - </th>
96 - <th class="wppm_table_header">
97 - <?php echo esc_html_e('Project','taskbuilder'); ?>
98 - </th>
99 - <th class="wppm_table_header">
100 - <?php echo esc_html_e('Status','taskbuilder'); ?>
101 - </th>
102 - <th class="wppm_table_header">
103 - <?php echo esc_html_e('Priority','taskbuilder'); ?>
104 - </th>
105 - <th class="wppm_table_header">
106 - <?php echo esc_html_e('Start date','taskbuilder'); ?>
107 - </th>
108 - <th class="wppm_table_header">
109 - <?php echo esc_html_e('End date','taskbuilder'); ?>
110 - </th>
111 - <th class="wppm_table_header">
112 - <?php echo esc_html_e('Assign To','taskbuilder'); ?>
113 - </th>
114 - <th class="wppm_table_header">
115 - <?php echo esc_html_e('Progress','taskbuilder'); ?>
116 - </th>
117 - </tr>
118 - </thead>
119 - <tbody>
120 - <?php
121 - $task_index = 0;
122 - if(!empty($wppm_task_fillter)){
123 - foreach($wppm_task_fillter as $task) {
124 - $checklists = $wpdb->get_results( "SELECT * FROM {$wpdb->prefix}wppm_checklist where task_id = $task->id" );
125 - if(!empty($task)){
126 - $task_index++;
127 - $total=$wpdb->get_var("SELECT COUNT(Items.id) AS check_id
128 - FROM {$wpdb->prefix}wppm_checklist_items AS Items
129 - Left join {$wpdb->prefix}wppm_checklist checklist ON Items.checklist_id = checklist.id
130 - WHERE checklist.task_id = $task->id");
131 - $total_checked_items=$wpdb->get_var("SELECT COUNT(Items.id) AS check_id
132 - FROM {$wpdb->prefix}wppm_checklist_items AS Items
133 - Left join {$wpdb->prefix}wppm_checklist checklist ON Items.checklist_id = checklist.id
134 - WHERE checklist.task_id = $task->id AND Items.checked=1");
135 -
136 - if(isset($task->status)){
137 - $status = $wpdb->get_row( "SELECT * FROM {$wpdb->prefix}wppm_task_statuses where id = $task->status" );
138 - }
139 - if(!empty($task->priority)){
140 - $priority = $wpdb->get_row( "SELECT * FROM {$wpdb->prefix}wppm_task_priorities where id = $task->priority" );
141 - }
142 - if(isset($task->project)){
143 - $project = $wpdb->get_row( "SELECT * FROM {$wpdb->prefix}wppm_project where id = $task->project" );
144 - }
145 - ?>
146 - <tr onclick= "if(link)wppm_open_task(<?php echo esc_attr($task->id) ?>)" >
147 - <td>
148 - <?php echo esc_html_e($task->task_name,'taskbuilder') ?>
149 - </td>
150 - <td>
151 - <?php if(!empty($project->project_name)){
152 - echo esc_html_e($project->project_name,'taskbuilder');
790 + </div>
791 + <script>
792 + jQuery('#wppm-more-actions-btn, #wppm-task-bulk-actions-btn').gpopover({width: 200});
793 + </script>
794 + <div id="wppm_task_table_container" class="wppm_task_table_container table-responsive" style="padding: 0 15px 15px 15px;">
795 + <table id="wppm_task_table" class="wppm_table table">
796 + <thead>
797 + <tr>
798 + <th style="background-color:<?php echo esc_attr($appearance_settings['list-header-background-color'])?>" onchange="wppm_task_bulk_select_change()">
799 + <div class="checkbox-container">
800 + <input id="wppm_task_bulk_select_option" class="wppm-bulk-selector" type="checkbox" onchange="wppm_task_bulk_select_change();"/>
801 + <label for="wppm_task_bulk_select_option"></label>
802 + </div>
803 + </th>
804 + <th class="wppm_table_header" style="background-color:<?php echo esc_attr($appearance_settings['list-header-background-color'])?>">
805 + <div id="wppm_task_name_container">
806 + <span id="wppm_task_name_th" style="color:<?php echo esc_attr($appearance_settings['list-header-text-color'])?>"><?php echo esc_html_e('Task name','taskbuilder'); ?></span>
807 + <img width="16" height="16" style = "<?php echo ($sort_by == 'task_name' && $order == 'DESC') ? 'display:inline': 'display:none;'?>" onclick="wppm_sort_up_task_list('task_name','ASC','<?php echo esc_attr($page); ?>')" class="wppm_chevron_img" id="wppm_chevron_sort_up_task_name_img" src="<?php echo esc_url( WPPM_PLUGIN_URL . 'asset/images/sort_up_icon.svg'); ?>" alt="chevron_sort_up_icon">
808 + <img width="16" height="16" style = "<?php echo ($sort_by == 'task_name' && $order == 'ASC') ? 'display:inline': 'display:none;'?>" onclick="wppm_sort_up_task_list('task_name','DESC','<?php echo esc_attr($page); ?>')" class="wppm_chevron_img" id="wppm_chevron_sort_down_task_name_img" src="<?php echo esc_url( WPPM_PLUGIN_URL . 'asset/images/sort_down_icon.svg'); ?>" alt="chevron_sort_down_icon">
809 + </div>
810 + </th>
811 + <th class="wppm_table_header" style="background-color:<?php echo esc_attr($appearance_settings['list-header-background-color'])?>">
812 + <span id="wppm_project_name_th" style="color:<?php echo esc_attr($appearance_settings['list-header-text-color'])?>"><?php echo esc_html_e('Project','taskbuilder'); ?></span>
813 + <img width="16" height="16" style = "<?php echo ($sort_by == 'proj.project_name' && $order == 'DESC') ? 'display:inline': 'display:none;'?>" onclick="wppm_sort_up_task_list('project','ASC','<?php echo esc_attr($page); ?>')" class="wppm_chevron_img" id="wppm_chevron_sort_up_project_list_img" src="<?php echo esc_url( WPPM_PLUGIN_URL . 'asset/images/sort_up_icon.svg'); ?>" alt="chevron_sort_up_icon">
814 + <img width="16" height="16" style = "<?php echo ($sort_by == 'proj.project_name' && $order == 'ASC') ? 'display:inline': 'display:none;'?>" onclick="wppm_sort_up_task_list('project','DESC','<?php echo esc_attr($page); ?>')" class="wppm_chevron_img" id="wppm_chevron_sort_down_project_list_img" src="<?php echo esc_url( WPPM_PLUGIN_URL . 'asset/images/sort_down_icon.svg'); ?>" alt="chevron_sort_down_icon">
815 + </th>
816 + <th class="wppm_table_header" style="background-color:<?php echo esc_attr($appearance_settings['list-header-background-color'])?>">
817 + <span id="wppm_status_th" style="color:<?php echo esc_attr($appearance_settings['list-header-text-color'])?>"><?php echo esc_html_e('Status','taskbuilder'); ?></span>
818 + <img width="16" height="16" style = "<?php echo ($sort_by == 'task_statuses.name' && $order == 'DESC') ? 'display:inline': 'display:none;'?>" onclick="wppm_sort_up_task_list('status','ASC','<?php echo esc_attr($page); ?>')" class="wppm_chevron_img" id="wppm_chevron_sort_up_status_img" src="<?php echo esc_url( WPPM_PLUGIN_URL . 'asset/images/sort_up_icon.svg'); ?>" alt="chevron_sort_up_icon">
819 + <img width="16" height="16" style = "<?php echo ($sort_by == 'task_statuses.name' && $order == 'ASC') ? 'display:inline': 'display:none;'?>" onclick="wppm_sort_up_task_list('status','DESC','<?php echo esc_attr($page); ?>')" class="wppm_chevron_img" id="wppm_chevron_sort_down_status_img" src="<?php echo esc_url( WPPM_PLUGIN_URL . 'asset/images/sort_down_icon.svg'); ?>" alt="chevron_sort_down_icon">
820 + </th>
821 + <th class="wppm_table_header" style="background-color:<?php echo esc_attr($appearance_settings['list-header-background-color'])?>">
822 + <span id="wppm_priority_th" style="color:<?php echo esc_attr($appearance_settings['list-header-text-color'])?>"><?php echo esc_html_e('Priority','taskbuilder'); ?></span>
823 + <img width="16" height="16" style = "<?php echo ($sort_by == ('task_priorities.name') && $order == 'DESC') ? 'display:inline': 'display:none;'?>" onclick="wppm_sort_up_task_list('priority','ASC','<?php echo esc_attr($page); ?>')" class="wppm_chevron_img" id="wppm_chevron_sort_up_priority_img" src="<?php echo esc_url( WPPM_PLUGIN_URL . 'asset/images/sort_up_icon.svg'); ?>" alt="chevron_sort_up_icon">
824 + <img width="16" height="16" style = "<?php echo ($sort_by == ('task_priorities.name') && $order == 'ASC') ? 'display:inline': 'display:none;'?>" onclick="wppm_sort_up_task_list('priority','DESC','<?php echo esc_attr($page); ?>')" class="wppm_chevron_img" id="wppm_chevron_sort_down_priority_img" src="<?php echo esc_url( WPPM_PLUGIN_URL . 'asset/images/sort_down_icon.svg'); ?>" alt="chevron_sort_down_icon">
825 + </th>
826 + <?php if($wppm_default_task_date == 1 && $wppm_deafault_time_duration_task==0) { ?>
827 + <th class="wppm_table_header" style="background-color:<?php echo esc_attr($appearance_settings['list-header-background-color'])?>">
828 + <span id="wppm_start_date_th" style="color:<?php echo esc_attr($appearance_settings['list-header-text-color'])?>"><?php echo esc_html_e('Start date','taskbuilder'); ?></span>
829 + <img width="16" height="16" style = "<?php echo ($sort_by == 'Task.start_date' && $order == 'DESC') ? 'display:inline': 'display:none;'?>" onclick="wppm_sort_up_task_list('start_date','ASC','<?php echo esc_attr($page); ?>')" class="wppm_chevron_img" id="wppm_chevron_sort_up_start_date_img" src="<?php echo esc_url( WPPM_PLUGIN_URL . 'asset/images/sort_up_icon.svg'); ?>" alt="chevron_sort_up_icon">
830 + <img width="16" height="16" style = "<?php echo ($sort_by == 'Task.start_date' && $order == 'ASC') ? 'display:inline': 'display:none;'?>" onclick="wppm_sort_up_task_list('start_date','DESC','<?php echo esc_attr($page); ?>')" class="wppm_chevron_img" id="wppm_chevron_sort_down_start_date_img" src="<?php echo esc_url( WPPM_PLUGIN_URL . 'asset/images/sort_down_icon.svg'); ?>" alt="chevron_sort_down_icon">
831 + </th>
832 + <th class="wppm_table_header" style="background-color:<?php echo esc_attr($appearance_settings['list-header-background-color'])?>">
833 + <span id="wppm_end_date_th" style="color:<?php echo esc_attr($appearance_settings['list-header-text-color'])?>"><?php echo esc_html_e('End date','taskbuilder'); ?></span>
834 + <img width="16" height="16" style = "<?php echo ($sort_by == 'Task.end_date' && $order == 'DESC') ? 'display:inline': 'display:none;'?>" onclick="wppm_sort_up_task_list('end_date','ASC','<?php echo esc_attr($page); ?>')" class="wppm_chevron_img" id="wppm_chevron_sort_up_end_date_img" src="<?php echo esc_url( WPPM_PLUGIN_URL . 'asset/images/sort_up_icon.svg'); ?>" alt="chevron_sort_up_icon">
835 + <img width="16" height="16" style = "<?php echo ($sort_by == 'Task.end_date' && $order == 'ASC') ? 'display:inline': 'display:none;'?>" onclick="wppm_sort_up_task_list('end_date','DESC','<?php echo esc_attr($page); ?>')" class="wppm_chevron_img" id="wppm_chevron_sort_down_end_date_img" src="<?php echo esc_url( WPPM_PLUGIN_URL . 'asset/images/sort_down_icon.svg'); ?>" alt="chevron_sort_down_icon">
836 + </th>
837 + <?php }
838 + if( $wppm_deafault_time_duration_task==1){ ?>
839 + <th class="wppm_table_header" style="background-color:<?php echo esc_attr($appearance_settings['list-header-background-color'])?>">
840 + <span id="wppm_task_duration_th" style="color:<?php echo esc_attr($appearance_settings['list-header-text-color'])?>"><?php echo esc_html_e('Duration','taskbuilder'); ?></span>
841 + <img width="16" height="16" style = "<?php echo ($sort_by == 'TIMESTAMPDIFF(SECOND, Task.start_date, Task.end_date)' && $order == 'DESC') ? 'display:inline': 'display:none;'?>" onclick="wppm_sort_up_task_list('TIMESTAMPDIFF(SECOND, Task.start_date, Task.end_date)','ASC','<?php echo esc_attr($page); ?>')" class="wppm_chevron_img" id="wppm_chevron_sort_up_task_duration_img" src="<?php echo esc_url( WPPM_PLUGIN_URL . 'asset/images/sort_up_icon.svg'); ?>" alt="chevron_sort_up_icon">
842 + <img width="16" height="16" style = "<?php echo ($sort_by == 'TIMESTAMPDIFF(SECOND, Task.start_date, Task.end_date)' && $order == 'ASC') ? 'display:inline': 'display:none;'?>" onclick="wppm_sort_up_task_list('TIMESTAMPDIFF(SECOND, Task.start_date, Task.end_date)','DESC','<?php echo esc_attr($page); ?>')" class="wppm_chevron_img" id="wppm_chevron_sort_down_task_duration_img" src="<?php echo esc_url( WPPM_PLUGIN_URL . 'asset/images/sort_down_icon.svg'); ?>" alt="chevron_sort_down_icon">
843 + </th>
844 + <?php }?>
845 + <th class="wppm_table_header" style="background-color:<?php echo esc_attr($appearance_settings['list-header-background-color'])?>">
846 + <span style="color:<?php echo esc_attr($appearance_settings['list-header-text-color'])?>"><?php echo esc_html_e('Assign To','taskbuilder'); ?></span>
847 + </th>
848 + <th class="wppm_table_header" style="background-color:<?php echo esc_attr($appearance_settings['list-header-background-color'])?>">
849 + <span style="color:<?php echo esc_attr($appearance_settings['list-header-text-color'])?>"><?php echo esc_html_e('Progress','taskbuilder'); ?></span>
850 + </th>
851 + <?php do_action('wppm_table_header');?>
852 + </tr>
853 + </thead>
854 + <tbody>
855 + <?php
856 + $task_index = 0;
857 + $statuses = $wpdb->get_results(
858 + "SELECT * FROM {$wpdb->prefix}wppm_task_statuses",
859 + OBJECT_K
860 + );
861 +
862 + $priorities = $wpdb->get_results(
863 + "SELECT * FROM {$wpdb->prefix}wppm_task_priorities",
864 + OBJECT_K
865 + );
866 + $projects = $wpdb->get_results( "SELECT * FROM {$wpdb->prefix}wppm_project", OBJECT_K) ;
867 + $task_ids = wp_list_pluck($wppm_task_fillter, 'id');
868 + $checklist_counts = [];
869 + if (!empty($task_ids)) {
870 + $task_ids_sql = implode(',', array_map('absint', $task_ids));
871 + $checklist_results = $wpdb->get_results(" SELECT checklist.task_id,
872 + COUNT(Items.id) AS total_items,
873 + SUM(CASE WHEN Items.checked = 1 THEN 1 ELSE 0 END) AS checked_items
874 + FROM {$wpdb->prefix}wppm_checklist_items AS Items
875 + LEFT JOIN {$wpdb->prefix}wppm_checklist AS checklist
876 + ON Items.checklist_id = checklist.id
877 + WHERE checklist.task_id IN ($task_ids_sql)
878 + GROUP BY checklist.task_id"
879 + );
880 + foreach ($checklist_results as $row) {
881 + $checklist_counts[$row->task_id] = [
882 + 'total' => (int) $row->total_items,
883 + 'checked' => (int) $row->checked_items,
884 + ];
885 + }
886 + }
887 + if(!empty($wppm_task_fillter)){
888 + foreach($wppm_task_fillter as $task) {
889 + $task_id = absint($task->id);
890 + $wppm_task_duration = $wppmfunction->wppm_get_duration($task->start_date,$task->end_date);
891 + $checklists = $wpdb->get_results( $wpdb->prepare("SELECT * FROM {$wpdb->prefix}wppm_checklist where task_id = %d",$task_id) );
892 + if(!empty($task)){
893 + $taskdata = $wppmfunction->get_task($task->id);
894 + $project_data = $wppmfunction->get_project($task->project);
895 + $task_index++;
896 + $total = $checklist_counts[$task_id]['total'] ?? 0;
897 + $total_checked_items = $checklist_counts[$task_id]['checked'] ?? 0;
898 + if(isset($task->status)){
899 + $tstatus = absint($task->status);
900 + $status = $statuses[$task->status] ?? null;
901 + }
902 + if(!empty($task->priority)){
903 + $tpriority = absint($task->priority);
904 + $priority = $priorities[$task->priority] ?? null;
905 + }
906 + if(isset($task->project)){
907 + $tproj = absint($task->project);
908 + $project = $projects[$task->project] ?? null;
909 + }
910 + if($wppm_task_time == 1){
911 + $tsDate = new DateTime($task->start_date);
912 + $teDate = new DateTime($task->end_date);
913 + if($task->start_date=='0000-00-00 00:00:00'){
914 + if($wppm_date_setting=='Y-m-d H:i:s'){
915 + $task_start_date = '0000-00-00 00:00:00';
916 + }elseif($wppm_date_setting=='d-m-Y H:i:s'){
917 + $task_start_date = '00-00-0000 00:00:00';
918 + }elseif($wppm_date_setting=='m-d-Y H:i:s'){
919 + $task_start_date = '00-00-0000 00:00:00';
920 + }else{
921 + $task_start_date = '0000-00-00 00:00:00';
922 + }
923 + }if($task->end_date=='0000-00-00 00:00:00'){
924 + if($wppm_date_setting=='Y-m-d H:i:s'){
925 + $task_end_date = '0000-00-00 00:00:00';
926 + }elseif($wppm_date_setting=='d-m-Y H:i:s'){
927 + $task_end_date = '00-00-0000 00:00:00';
928 + }elseif($wppm_date_setting=='m-d-Y H:i:s'){
929 + $task_end_date = '00-00-0000 00:00:00';
930 + }else{
931 + $task_end_date = '0000-00-00 00:00:00';
932 + }
933 + }if($task->start_date!='0000-00-00 00:00:00'){
934 + if(!empty($wppm_date_setting)){
935 + $task_start_date = $tsDate->format($wppm_date_setting);
936 + } else {
937 + $task_start_date = isset($task->start_date)? $task->start_date:"";
938 + }
939 + }if($task->end_date!='0000-00-00 00:00:00'){
940 + if(!empty($wppm_date_setting)){
941 + $task_end_date = $teDate->format($wppm_date_setting);
942 + }else{
943 + $task_end_date = isset($task->end_date) ? $task->end_date: "" ;
944 + }
153 945 }
154 - ?>
155 - </td>
156 - <td>
157 - <?php if(!empty($task->status)){ ?>
158 - <span class="wppm_td_task_status" style="background-color:<?php echo (isset($status->bg_color))? esc_attr($status->bg_color):"";?>; color: <?php echo (isset($status->color))? esc_attr($status->color):""; ?>"><?php echo (isset($status->name))? esc_html_e($status->name,'taskbuilder'):"" ?></span>
159 - <?php } ?>
160 - </td>
161 - <td>
162 - <?php if(!empty($task->priority)){ ?>
163 - <span class ="wppm_td_task_priority" style="background-color:<?php echo (isset($priority->bg_color))? esc_attr($priority->bg_color):"" ;?>; color: <?php echo (isset($priority->color))? esc_attr($priority->color):""; ?>"><?php echo (isset($priority->name))? esc_html_e($priority->name,'taskbuilder'):"" ?></span>
946 + } elseif($wppm_task_time == 0){
947 + $tsDate = new DateTime($task->start_date);
948 + $teDate = new DateTime($task->end_date);
949 + $task_start_date = $tsDate->format('Y-m-d');
950 + $task_end_date = $teDate->format('Y-m-d');
951 + if($task->start_date=='0000-00-00 00:00:00'){
952 + if($wppm_date_setting=='Y-m-d H:i:s'){
953 + $task_start_date = '0000-00-00';
954 + }elseif($wppm_date_setting=='d-m-Y H:i:s'){
955 + $task_start_date = '00-00-0000';
956 + }elseif($wppm_date_setting=='m-d-Y H:i:s'){
957 + $task_start_date = '00-00-0000';
958 + }else{
959 + $task_start_date = '0000-00-00';
960 + }
961 + }
962 + if($task->end_date=='0000-00-00 00:00:00'){
963 + if($wppm_date_setting=='Y-m-d H:i:s'){
964 + $task_end_date = '0000-00-00';
965 + }elseif($wppm_date_setting=='d-m-Y H:i:s'){
966 + $task_end_date = '00-00-0000';
967 + }elseif($wppm_date_setting=='m-d-Y H:i:s'){
968 + $task_end_date = '00-00-0000';
969 + }else{
970 + $task_end_date = '0000-00-00';
971 + }
972 + }
973 + if($task->start_date!='0000-00-00 00:00:00'){
974 + if($wppm_date_setting=='Y-m-d H:i:s'){
975 + $task_start_date = $tsDate->format('Y-m-d');
976 + }elseif($wppm_date_setting=='d-m-Y H:i:s'){
977 + $task_start_date = $tsDate->format('d-m-Y');
978 + }elseif($wppm_date_setting=='m-d-Y H:i:s'){
979 + $task_start_date = $tsDate->format('m-d-Y');
980 + }else{
981 + $task_start_date = $tsDate->format('Y-m-d');
982 + }
983 + }
984 + if($task->end_date!='0000-00-00 00:00:00'){
985 + if($wppm_date_setting=='Y-m-d H:i:s'){
986 + $task_end_date = $teDate->format('Y-m-d');
987 + }elseif($wppm_date_setting=='d-m-Y H:i:s'){
988 + $task_end_date = $teDate->format('d-m-Y');
989 + }elseif($wppm_date_setting=='m-d-Y H:i:s'){
990 + $task_end_date = $teDate->format('m-d-Y');
991 + }else{
992 + $task_end_date = $teDate->format('Y-m-d');
993 + }
994 + }
995 + }
996 + $url = $wppmfunction->get_task_url( $task->id, $is_frontend );
997 + ?>
998 + <tr onclick= "if(link)wppm_tl_handle_click(event, <?php echo esc_attr($task->id) ?>, '<?php echo esc_url( $url ); ?>',<?php echo esc_attr($project_id) ?>)" >
999 + <td class="bulk-selector" onmouseover="link=false;" onmouseout="link=true;">
1000 + <div class="wppm-pl-item-selector">
1001 + <div class="checkbox-container">
1002 + <input id="wppm_bulk_select_<?php echo esc_attr($task->id) ?>" class="wppm-task-bulk-select" type="checkbox" onchange="wppm_bulk_task_item_select_change();" value="<?php echo esc_attr( $task->id ); ?>"/>
1003 + <label for="wppm_bulk_select_<?php echo esc_attr($task->id) ?>"></label>
1004 + </div>
1005 + </div>
1006 + </td>
1007 + <td onmouseover="link=true;">
1008 + <?php echo esc_html($task->task_name) ?>
1009 + <?php $wppm_row_subtask_progress = $wppmfunction->get_subtask_progress($task->id);
1010 + if($wppm_row_subtask_progress['total'] > 0){ ?>
1011 + <span class="wppm_subtask_badge" title="<?php esc_attr_e('Subtasks','taskbuilder'); ?>"><?php echo esc_html($wppm_row_subtask_progress['completed'].'/'.$wppm_row_subtask_progress['total']); ?></span>
1012 + <?php } ?>
1013 + </td>
1014 + <td onmouseover="link=true;">
1015 + <?php if(!empty($project->project_name)){
1016 + echo esc_html($project->project_name);
1017 + }
1018 + ?>
1019 + </td>
1020 + <td onmouseover="link=true;">
1021 + <?php if(!empty($task->status)){ ?>
1022 + <span class="wppm_td_task_status" style="background-color:<?php echo (isset($status->bg_color))? esc_attr($status->bg_color):"";?>; color: <?php echo (isset($status->color))? esc_attr($status->color):""; ?>"><?php echo (isset($status->name))? esc_html($status->name):"" ?></span>
164 1023 <?php } ?>
165 - </td>
166 - <td>
167 - <?php if(!empty($task->start_date)){ ?>
168 - <?php echo esc_html_e($task->start_date,'taskbuilder');
169 - } ?>
170 - </td>
171 - <td>
172 - <?php if(!empty($task->end_date)){ ?>
173 - <?php echo esc_html_e($task->end_date,'taskbuilder');
174 - } ?>
175 - </td>
176 - </td>
177 - <td style="text-align:center;">
178 - <?php
179 - $project_data = $wppmfunction->get_project($task->project);
180 - $i=0;
181 - if(!empty($project_data['users'])){
182 - $proj_users = explode(',',$project_data['users']);
183 - }
184 - if(!empty($task->users)){
185 - $users = explode(",",$task->users);
186 - foreach($users as $user){
187 - if( (!empty($proj_users)) && (in_array($user,$proj_users))){
188 - $i++;
189 - if( $i <= 4 ){
190 - $userdata = get_userdata( $user );
191 - if(!empty($userdata)){
192 - ?>
193 - <a href="#" title="<?php echo esc_attr($userdata->display_name); ?>">
194 - <?php echo get_avatar($userdata->ID, 25, "mysteryman")?>
195 - </a> <?php
1024 + </td>
1025 + <td onmouseover="link=true;">
1026 + <?php if(!empty($task->priority)){ ?>
1027 + <span class ="wppm_td_task_priority" style="background-color:<?php echo (isset($priority->bg_color))? esc_attr($priority->bg_color):"" ;?>; color: <?php echo (isset($priority->color))? esc_attr($priority->color):""; ?>"><?php echo (isset($priority->name))? esc_html($priority->name):"" ?></span>
1028 + <?php } ?>
1029 + </td>
1030 + <?php if($wppm_default_task_date == 1 && $wppm_deafault_time_duration_task==0) { ?>
1031 + <td onmouseover="link=true;">
1032 + <?php if(!empty($task_start_date)){ ?>
1033 + <?php echo esc_html($task_start_date);
1034 + } ?>
1035 + </td>
1036 + <td onmouseover="link=true;"><?php
1037 + if(!empty($task_end_date) && ($task->status!=4 && $task_end_date < $current_date && $task_end_date != '0000-00-00 00:00:00' && $task_end_date != '00-00-0000 00:00:00' && $task_end_date != '00-00-0000' && $task_end_date != '0000-00-00')){
1038 + $style = "color:#FF0000";
1039 + } else{
1040 + $style = "color:#2C3E50";
1041 + }?>
1042 + <span style="<?php echo esc_attr($style); ?>"><?php echo esc_html($task_end_date);?></span>
1043 + </td>
1044 + <?php } ?>
1045 + <?php if($wppm_deafault_time_duration_task==1){ ?>
1046 + <?php
1047 + if(!empty($task_end_date) && ($task->status!=4 && $task_end_date < $current_date && $task_end_date != '0000-00-00 00:00:00' && $task_end_date != '00-00-0000 00:00:00' && $task_end_date != '00-00-0000' && $task_end_date != '0000-00-00')){
1048 + $style = "color:#FF2222";
1049 + } else {
1050 + $style = "color:#2C3E50";
1051 + } ?>
1052 + <td onmouseover="link=true;" class="wppm_table_td"><span style="<?php echo esc_attr($style); ?>"><?php echo isset($wppm_task_duration) ? esc_html($wppm_task_duration):"" ?></span></td>
1053 + <?php } ?>
1054 + </td>
1055 + <td onmouseover="link=true;" style="text-align:center;">
1056 + <?php
1057 + $i=0;
1058 + if(!empty($project_data['users'])){
1059 + $proj_users = explode(',',$project_data['users']);
1060 + }
1061 + if(!empty($task->users)){
1062 + $users = explode(",",$task->users);
1063 + foreach($users as $user){
1064 + if( (!empty($proj_users)) && (in_array($user,$proj_users))){
1065 + $i++;
1066 + if( $i <= 4 ){
1067 + $userdata = get_userdata( $user );
1068 + if(!empty($userdata)){
1069 + ?>
1070 + <a href="#" title="<?php echo esc_attr($userdata->display_name); ?>">
1071 + <?php echo get_avatar($userdata->ID, 25, "mysteryman")?>
1072 + </a> <?php
1073 + }
196 1074 }
197 1075 }
198 1076 }
199 - }
200 - }
201 - if($i > 4){
202 - ?>
203 - <a href="#" class="wppm_avatar">
204 - <span id="wppm_avatar" style="background-color:black;" class="avatar">+<?php echo esc_html($i-4) ?></span>
205 - </a>
206 - <?php } ?>
1077 + }
1078 + if($i > 4){
1079 + ?>
1080 + <a href="#" class="wppm_avatar">
1081 + <span id="wppm_avatar" style="background-color:black;" class="avatar">+<?php echo esc_html($i-4) ?></span>
1082 + </a>
1083 + <?php } ?>
1084 + <?php
1085 + if($i==0){
1086 + echo esc_html_e('None','taskbuilder');
1087 + } ?>
1088 + </td>
1089 + <td onmouseover="link=true;">
207 1090 <?php
208 - if($i==0){
209 - echo esc_html_e('None','taskbuilder');
210 - } ?>
211 - </td>
212 - <td>
213 - <?php
214 - $completion = 0;
215 - if ($total != 0 && $total != NULL) {
216 - $completion = intval($total_checked_items/$total*100);
217 - }
218 - echo esc_html($completion).'%';
219 - ?>
220 - </tr>
221 - <?php }
222 - }
1091 + $completion = 0;
1092 + if ($total != 0 && $total != NULL) {
1093 + $completion = intval($total_checked_items/$total*100);
1094 + }
1095 + echo esc_html($completion).'%';
1096 + ?>
1097 + </td>
1098 + <?php do_action('wppm_table_column');?>
1099 + </tr>
1100 + <?php }
1101 + }
1102 + }
1103 + ?>
1104 + </tbody>
1105 + </table>
1106 + <script>
1107 + function wppm_tl_handle_click(event, id, url,project_id) {
1108 + if ( ( event.ctrlKey || event.metaKey ) && url ) {
1109 + window.open(url, '_blank');
1110 + } else {
1111 + wppm_open_task(id,project_id);
223 1112 }
224 - ?>
225 - </tbody>
226 - </table>
227 - <?php
228 - $current_page=$page_no+1;
229 - $total_pages=ceil($totalrows/$task_per_page);
230 - $prev_page_no=$current_page-1;
231 - $prev_class=($prev_page_no==0)?'disabled':'';
232 - $next_page_no=($total_pages==$current_page)? $current_page-1:$current_page;
233 - $next_class=($total_pages==$current_page)?'disabled':'';
234 - ?>
235 - <div class="row" style="background-color:#ffffff;">
236 - <div class="col-sm-12">
237 - <div class="wppm_task_result" style="<?php echo esc_attr($total_pages==0)? '':'display: none;';?>"><?php _e('Your search request returned no results.','taskbuilder');?></div>
238 - <hr style="<?php echo esc_attr($total_pages==0)? '':'display: none;';?>">
239 - </div>
240 - <div>
1113 + }
1114 + </script>
1115 + <?php
1116 + $current_page=$page_no+1;
1117 + $total_pages=ceil($totalrows/$task_per_page);
1118 + $prev_page_no=$current_page-1;
1119 + $prev_class=($prev_page_no==0)?'disabled':'';
1120 + $next_page_no=($total_pages==$current_page)? $current_page-1:$current_page;
1121 + $next_class=($total_pages==$current_page)?'disabled':'';
1122 + ?>
1123 + <div class="row" style="background-color:#ffffff;">
1124 + <div class="col-sm-12">
1125 + <div class="wppm_task_result" style="<?php echo esc_attr($total_pages==0)? '':'display: none;';?>"><?php esc_html_e('Your search request returned no results.','taskbuilder');?></div>
1126 + <hr style="<?php echo esc_attr($total_pages==0)? '':'display: none;';?>">
1127 + </div>
1128 + <div>
1129 + </div>
241 1130 </div>
242 -</div>
243 -<div class="row wppm_task_pagination_container">
244 - <div class="col-sm-4">
245 - <?php echo esc_html_e('Total:','taskbuilder'); ?>&nbsp;<?php echo esc_attr($task_index) ?>&nbsp;<?php echo esc_html_e('of','taskbuilder') ?>&nbsp;<?php echo esc_html($totalrows) ?>&nbsp;<?php echo esc_html_e('Tasks','taskbuilder')?>
1131 + <div class="row wppm_task_pagination_container">
1132 + <div class="col-sm-4">
1133 + <?php echo esc_html_e('Total:','taskbuilder'); ?>&nbsp;<?php echo esc_attr($task_index) ?>&nbsp;<?php echo esc_html_e('of','taskbuilder') ?>&nbsp;<?php echo esc_html($totalrows) ?>&nbsp;<?php echo esc_html_e('Tasks','taskbuilder')?>
1134 + </div>
1135 + <div class="wppm_task_pagination col-sm-4" style="<?php echo esc_attr($total_pages==0)? "display:none;":"display:flex;"?>">
1136 + <span class="wppm-pagination-txt">
1137 + <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>
1138 + </span>
1139 + <span <?php echo esc_attr($prev_class) ?>
1140 + style="<?php echo (isset($prev_class) && esc_attr($prev_class)== 'disabled') ? 'display:none;':'display:block;'?>cursor:pointer;">
1141 + <a class="wppm_pagination_prev" onclick="return wppm_load_prev_task_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>
1142 + </span>
1143 + <span <?php echo esc_attr($next_class) ?>
1144 + style="<?php echo (isset($next_class) && esc_attr($next_class) == 'disabled')?'display:none;':'display:block;'?>cursor:pointer;">
1145 + <a class="wppm_pagination_next" onclick="return wppm_load_next_task_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>
1146 + </span>
1147 + </div>
246 1148 </div>
247 - <div class="wppm_task_pagination col-sm-4" style="<?php echo esc_attr($total_pages==0)? "display:none;":"display:flex;"?>">
248 - <span class="wppm-pagination-txt">
249 - <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>
250 - </span>
251 - <span <?php echo esc_attr($prev_class) ?>
252 - style="<?php echo (isset($prev_class) && esc_attr($prev_class)== 'disabled') ? 'display:none;':'display:block;'?>cursor:pointer;">
253 - <a class="wppm_pagination_prev" onclick="return wppm_load_prev_task_page(<?php echo esc_attr($prev_page_no) ?>,<?php echo esc_attr($page_no) ?>);"><?php echo esc_html_e('PREV','taskbuilder');?></a>
254 - </span>
255 - <span <?php echo esc_attr($next_class) ?>
256 - style="<?php echo (isset($next_class) && esc_attr($next_class) == 'disabled')?'display:none;':'display:block;'?>cursor:pointer;">
257 - <a class="wppm_pagination_next" onclick="return wppm_load_next_task_page(<?php echo esc_attr($next_page_no) ?>,<?php echo esc_attr($page_no) ?>);"><?php echo esc_html_e('NEXT','taskbuilder');?></a>
258 - </span>
259 - </div>
260 -</div>
1149 +</form>
1150 +<style>
1151 + .select2-selection--single {
1152 + height: 30px!important;
1153 + }
1154 + .select2-dropdown:hover {
1155 + color: #23527c!important;;
1156 + }
1157 + .select2-results__options{
1158 + font:15px "Helvetica Neue",Arial,Helvetica,sans-serif !important;
1159 + margin: 0!important;
1160 + line-height: inherit!important;
1161 + }
1162 + .select2-selection__rendered{
1163 + font:15px "Helvetica Neue",Arial,Helvetica,sans-serif !important;
1164 + margin-top: 5px!important;
1165 + }
1166 + .select2-selection__rendered:hover{
1167 + color: #2271b1 !important;
1168 + }
1169 + .select2-container--default .select2-results__option--highlighted.select2-results__option--selectable{
1170 + background-color: #e85f08!important;
1171 + color: white !important;
1172 + }
1173 + .select2-container {
1174 + max-width: 150px !important;
1175 + min-width: 150px !important;
1176 + }
1177 +
1178 + .select2-selection--multiple {
1179 + max-width: 290px !important;
1180 + min-width: 290px !important;
1181 + }
1182 +
1183 + #wppm_task_filter{
1184 + min-height: 30px !important;
1185 + max-height: 35px !important;
1186 + }
1187 + #wppm_task_table tr:nth-child(even) td{
1188 + background-color:<?php echo esc_attr($appearance_settings['list-item-even-background-color'])?>;
1189 + color:<?php echo esc_attr($appearance_settings['list-item-even-text-color'])?>;
1190 + }
1191 + #wppm_task_table tr:nth-child(odd) td{
1192 + background-color:<?php echo esc_attr($appearance_settings['list-item-odd-background-color'])?>;
1193 + color:<?php echo esc_attr($appearance_settings['list-item-odd-text-color'])?>;
1194 + }
1195 + #wppm_task_table tr:hover td{
1196 + background-color:<?php echo esc_attr($appearance_settings['list-item-hover-background-color'])?>;
1197 + }
1198 + #wppm_task_table tr:hover td{
1199 + color: <?php echo esc_attr($appearance_settings['list-item-hover-text-color'])?>;
1200 + }
1201 + #wppm_add_new_task_btn_tl:hover{
1202 + background-color:<?php echo esc_attr($appearance_settings['list-header-button-hover-color'])?>!important;
1203 + }
1204 +</style>
261 1205 <script type="text/javascript">
262 - var link = true;
263 - jQuery( document ).ready( function( jQuery ) {
264 - jQuery("input[name='wppm_task_search_filter']").keypress(function(e) {
265 - //Enter key
266 - if (e.which == 13) {
267 - wppm_task_search_filter();
268 - }
1206 + var link = true;
1207 + window.listFilters = window.listFilters || {
1208 + created_by: [],
1209 + assigned: [],
1210 + priority: [],
1211 + start_date: "",
1212 + end_date: ""
1213 + };
1214 +
1215 + var listFilters = window.listFilters;
1216 + jQuery( document ).ready( function( jQuery ) {
1217 + // SET VALUES AFTER INIT
1218 + let createdBy = <?php echo wp_json_encode(array_map('strval', $advanced_filter['created_by'] ?? [])); ?>;
1219 +
1220 + let assigned = <?php echo wp_json_encode(array_map('strval', $advanced_filter['assigned'] ?? [])); ?>;
1221 +
1222 + let priority = <?php echo wp_json_encode(array_map('strval', $advanced_filter['priority'] ?? [])); ?>;
1223 + jQuery('#tb-created-by').val(createdBy).trigger('change');
1224 + jQuery('#tb-assigned').val(assigned).trigger('change');
1225 + jQuery('#tb-priority').val(priority).trigger('change');
1226 + jQuery('#tb-start-date').val('<?php echo esc_attr($advanced_filter['start_date'] ?? ''); ?>');
1227 + jQuery('#tb-end-date').val('<?php echo esc_attr($advanced_filter['end_date'] ?? ''); ?>');
1228 + jQuery(document).off("click", "#tb-apply-filter").on("click", "#tb-apply-filter", function (e) {
1229 + e.preventDefault();
1230 + listFilters.created_by = jQuery("#tb-created-by").val() || [];
1231 + listFilters.assigned = jQuery("#tb-assigned").val() || [];
1232 + listFilters.priority = jQuery("#tb-priority").val() || [];
1233 + listFilters.start_date = jQuery("#tb-start-date").val() || "";
1234 + listFilters.end_date = jQuery("#tb-end-date").val() || "";
1235 + listFilters.id = "<?php echo esc_attr($project_id); ?>";
1236 + renderActiveFilters(listFilters);
1237 + setListFilterCookie(listFilters);
1238 + triggerFilter(1, listFilters,'list');
1239 + });
1240 + jQuery(document).on("click", ".tb-remove", function () {
1241 + let key = jQuery(this).attr("data-key");
1242 + let value = jQuery(this).attr("data-value");
1243 + // DATE REMOVE
1244 + if (key === "date") {
1245 + listFilters.start_date = "";
1246 + listFilters.end_date = "";
1247 + jQuery("#tb-start-date").val("");
1248 + jQuery("#tb-end-date").val("");
1249 + } else {
1250 + listFilters[key] = (listFilters[key] || [])
1251 + .map(String)
1252 + .filter(v => v !== String(value));
1253 + jQuery(`#tb-${key}`).val(listFilters[key]).trigger("change");
1254 + }
1255 + // REMOVE CHIP UI
1256 + jQuery(this).closest(".tb-chip").remove();
1257 + syncUIWithFilters(listFilters);
1258 + // save cookie
1259 + setListFilterCookie(listFilters);
1260 + // reload data
1261 + triggerFilter(1,listFilters,'list');
1262 + });
1263 + jQuery(document)
1264 + .off("click", "#tb-reset-filter").on("click", "#tb-reset-filter", function () {
1265 + resetFilters('list');
1266 + });
1267 + let saved = getListFilterCookie();
1268 + if (saved && typeof saved === "object") {
1269 + window.listFilters = {
1270 + created_by: saved.created_by || [],
1271 + assigned: saved.assigned || [],
1272 + priority: saved.priority || [],
1273 + start_date: saved.start_date || "",
1274 + end_date: saved.end_date || ""
1275 + };
1276 + listFilters = window.listFilters;
1277 + }
1278 + setTimeout(function () {
1279 + syncUIWithFilters(listFilters);
1280 + renderActiveFilters(listFilters);
1281 + }, 100);
1282 + jQuery("input[name='wppm_task_search_filter']").keypress(function(e) {
1283 + //Enter key
1284 + if (e.which == 13) {
1285 + wppm_task_search_filter('<?php echo esc_attr($page); ?>');
1286 + }
1287 + });
1288 + jQuery("#wppm_task_name_th").hover(function(){
1289 + jQuery('#wppm_chevron_sort_up_task_name_img').show();
1290 + jQuery('#wppm_chevron_sort_down_task_name_img').hide();
269 1291 });
1292 + jQuery("#wppm_project_name_th").hover(function(){
1293 + jQuery('#wppm_chevron_sort_up_project_list_img').show();
1294 + jQuery('#wppm_chevron_sort_down_project_list_img').hide();
1295 + });
1296 + jQuery("#wppm_status_th").hover(function(){
1297 + jQuery('#wppm_chevron_sort_up_status_img').show();
1298 + jQuery('#wppm_chevron_sort_down_status_img').hide();
1299 + });
1300 + jQuery("#wppm_priority_th").hover(function(){
1301 + jQuery('#wppm_chevron_sort_up_priority_img').show();
1302 + jQuery('#wppm_chevron_sort_down_priority_img').hide();
1303 + });
1304 + jQuery("#wppm_start_date_th").hover(function(){
1305 + jQuery('#wppm_chevron_sort_up_start_date_img').show();
1306 + jQuery('#wppm_chevron_sort_down_start_date_img').hide();
1307 + });
1308 + jQuery("#wppm_end_date_th").hover(function(){
1309 + jQuery('#wppm_chevron_sort_up_end_date_img').show();
1310 + jQuery('#wppm_chevron_sort_down_end_date_img').hide();
1311 + });
1312 + jQuery("#wppm_task_duration_th").hover(function(){
1313 + jQuery('#wppm_chevron_sort_up_task_duration_img').show();
1314 + jQuery('#wppm_chevron_sort_down_task_duration_img').hide();
1315 + });
1316 +
270 1317 })
271 -</script>
1318 + jQuery('#wppm_task_list_proj_filter').select2({ dropdownAutoWidth: true, width: 'auto' });
1319 + jQuery('#wppm_task_list_proj_filter').val(<?php echo esc_attr($proj_filter) ?>);
1320 + jQuery('#tb-created-by').select2({ dropdownAutoWidth: true, width: '100%'});
1321 + jQuery('#tb-created-by').val(<?php echo wp_json_encode($advanced_filter['created_by'] ?? []); ?>).trigger('change');
1322 + jQuery('#tb-assigned').select2({ dropdownAutoWidth: true, width: '100%' });
1323 + jQuery('#tb-assigned').val(<?php echo wp_json_encode($advanced_filter['assigned'] ?? []); ?>).trigger('change');
1324 + jQuery('#tb-priority').select2({dropdownAutoWidth: true, width: '100%'});
1325 + jQuery('#tb-priority').val(<?php echo wp_json_encode($advanced_filter['priority'] ?? []); ?>).trigger('change');
1326 + /**
1327 + * Bulk item selector change
1328 + */
1329 + function wppm_bulk_task_item_select_change() {
1330 + jQuery("#wppm-task-bulk-actions-btn").show();
1331 + var items = jQuery(".wppm-task-bulk-select:checked");
1332 + var checked = items.length === 0 ? false : true;
1333 + if(checked){
1334 + jQuery(".wppm-bulk-selector").prop("checked", checked);
1335 + }else{
1336 + jQuery("#wppm-task-bulk-actions-btn").hide();
1337 + jQuery(".wppm-bulk-selector").prop("checked", false);
1338 + }
1339 + }
1340 + jQuery(document).off("click", "#tb-advanced-toggle").on("click", "#tb-advanced-toggle", function (e) {
1341 + e.stopPropagation();
1342 + jQuery("#tb-advanced-panel").toggleClass("tb-open");
1343 + });
272 1344
1345 + /* Close on backdrop click */
1346 + jQuery(document).on("click", "#tb-backdrop", function () {
1347 + jQuery("#tb-advanced-panel").removeClass("tb-open");
1348 + jQuery(this).removeClass("active");
1349 + });
1350 +
1351 + /* Close on outside (desktop only) */
1352 + jQuery(document).on("click", function (e) {
1353 + if (window.innerWidth > 768) {
1354 + if (!jQuery(e.target).closest("#tb-advanced-panel, #tb-advanced-toggle").length) {
1355 + jQuery("#tb-advanced-panel").removeClass("tb-open");
1356 + }
1357 + }
1358 + });jQuery(document).on("click", "#tb-close-filters", function () {
1359 + jQuery("#tb-advanced-panel").removeClass("tb-open");
1360 + jQuery("#tb-backdrop").removeClass("active");
1361 + });
1362 +</script>