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/open_task/wppm_open_task.php +1192 -183 1.0.56.0.6 View file →
@@ -3,29 +3,67 @@
3 3 exit; // Exit if accessed directly
4 4 }
5 5
6 6 global $current_user,$wpdb,$wppmfunction;
7 -$id = isset($_POST) && isset($_POST['id']) ? intval(sanitize_text_field($_POST['id'])) : "0";
7 +$id = isset($_POST) && isset($_POST['id']) ? intval(sanitize_text_field(wp_unslash($_POST['id']))) : "0";
8 +$page = isset($_POST) && isset($_POST['page']) ? sanitize_text_field(wp_unslash($_POST['page'])) : '';
8 9 $task_list_view = get_option('wppm_default_task_list_view');
9 -if (!(($current_user->ID && $current_user->has_cap('manage_options')) || ($wppmfunction->has_permission('view_task',$id)))) {exit;}
10 -$proj_id = isset($_POST) && isset($_POST['proj_id']) ? intval(sanitize_text_field($_POST['proj_id'])) : 0;
10 +$project_id = isset($_POST) && isset($_POST['project_id']) ? intval(sanitize_text_field($_POST['project_id'])) : "0";
11 +$wppm_default_task_date = get_option('wppm_default_task_date');
12 +$wppm_task_time = get_option('wppm_task_time');
13 +$appearance_settings = get_option("wppm-ap-individual-task");
14 +$wppm_tinymce_visibility_open_task = get_option('wppm_tinymce_visibility_open_task');
15 +$settings = get_option("wppm-ap-modal");
16 +$wppm_rich_text_editor = get_option('wppm_rich_text_editor');
17 +$wppm_toolbar_actions = get_option('wppm_toolbar_actions');
18 +$wppm_date_setting = get_option('wppm_date_setting');
19 +$wppm_task_hide_comment_section = get_option('wppm_task_hide_comment_section');
20 +$wppm_deafault_time_duration_task = get_option('wppm_display_time_duration_task');
21 +$url_auth = false;
11 22 $auth_id = $wppmfunction->wppm_get_auth_code($id);
12 23 $auth_id = sanitize_text_field($auth_id);
24 +// url authentication.
25 +$auth_code = isset( $_POST['auth-code'] ) ? sanitize_text_field( wp_unslash($_POST['auth-code'] ) ) : ''; // phpcs:ignore
26 +if ( ! $auth_code ) {
27 + $auth_code = isset( $_POST['auth_code'] ) ? sanitize_text_field( wp_unslash($_POST['auth_code'] ) ) : ''; // phpcs:ignore
28 +}
29 +
30 +if ( $auth_code && $auth_id == $auth_code ) {
31 + $url_auth = true;
32 +}
33 +if (!(($current_user->ID && $current_user->has_cap('manage_options')) || ($wppmfunction->has_permission('view_task',$id)) || ($url_auth==true))) { ?>
34 + <div style="text-align:center;padding:20px 0;">
35 + <h6><?php esc_attr_e( 'Unauthorized access!', 'taskbuilder' ); ?></h6>
36 + <a href="<?php echo esc_url( admin_url('admin.php?page=wppm-tasks') ); ?>" class="btn btn-success btn-sm"><?php esc_html_e( 'Go to Task List', 'taskbuilder' ); ?></a>
37 + </div>
38 + <?php
39 + wp_die();
40 +}
41 +$proj_id = isset($_POST) && isset($_POST['proj_id']) ? intval(sanitize_text_field(wp_unslash($_POST['proj_id']))) : 0;
42 +$current_date = wp_date('Y-m-d');
43 +$wppm_current_user_capability = get_user_meta( $current_user->ID, 'wppm_capability', true );
44 +$cu_id = absint($current_user->ID);
13 45 if(!empty($id)){
14 - $task = $wpdb->get_row( "SELECT * FROM {$wpdb->prefix}wppm_task where id=".$id);
46 + $task = $wpdb->get_row($wpdb->prepare("SELECT * FROM {$wpdb->prefix}wppm_task where id=%d",$id));
15 47 $project_data = $wppmfunction->get_project($task->project);
16 - $task_comment = $wpdb->get_results( "SELECT * FROM {$wpdb->prefix}wppm_task_comment where task_id=".$id." ORDER BY create_time DESC");
48 + $task_comment = $wpdb->get_results( $wpdb->prepare("SELECT * FROM {$wpdb->prefix}wppm_task_comment where task_id=%d ORDER BY create_time DESC",$id));
49 + $orderby_proj_sql = (sanitize_sql_orderby( "create_time DESC" ));
50 + $task_comment = $wpdb->get_results( $wpdb->prepare("SELECT * FROM {$wpdb->prefix}wppm_task_comment where task_id=%d ORDER BY ". $orderby_proj_sql,$id));
51 + $task_proj = isset($task->project) ? absint($task->project) :"";
52 + $task_id = isset($task->id) ? absint($task->id):"";
17 53 }
18 -$user_role = $wpdb->get_var( "SELECT role_id FROM {$wpdb->prefix}wppm_project_users where proj_id = $task->project AND user_id = $current_user->ID");
19 -if(!empty($task->project)){
20 - $project_name = $wpdb->get_var( "SELECT project_name FROM {$wpdb->prefix}wppm_project where id=".$task->project);
54 +$user_role = $wpdb->get_var( $wpdb->prepare("SELECT role_id FROM {$wpdb->prefix}wppm_project_users where proj_id = %d AND user_id = %d",$task_proj,$cu_id));
55 +if(!empty($task_proj)){
56 + $project_name = $wpdb->get_var( $wpdb->prepare("SELECT project_name FROM {$wpdb->prefix}wppm_project where id= %d",$task_proj));
21 57 }
22 -$wppm_checklist=$wpdb->get_results( "SELECT * FROM {$wpdb->prefix}wppm_checklist where task_id=".$task->id );
58 +$wppm_checklist=$wpdb->get_results( $wpdb->prepare("SELECT * FROM {$wpdb->prefix}wppm_checklist where task_id=%d",$task_id));
23 59 if(!empty($task->status)){
24 - $task_status = $wpdb->get_row( "SELECT * FROM {$wpdb->prefix}wppm_task_statuses where id=".$task->status);
60 + $task_status_var = absint($task->status);
61 + $task_status = $wpdb->get_row( $wpdb->prepare("SELECT * FROM {$wpdb->prefix}wppm_task_statuses where id=%d",$task_status_var));
25 62 }
26 63 if(!empty($task->priority)){
27 - $task_priority = $wpdb->get_row( "SELECT * FROM {$wpdb->prefix}wppm_task_priorities where id=".$task->priority);
64 + $task_priority_var = absint($task->priority);
65 + $task_priority = $wpdb->get_row( $wpdb->prepare("SELECT * FROM {$wpdb->prefix}wppm_task_priorities where id=%d",$task_priority_var));
28 66 }
29 67 if(!empty($task->users)){
30 68 $users = explode(",",$task->users);
31 69 }
@@ -30,39 +68,182 @@
30 68 $users = explode(",",$task->users);
31 69 }
32 70
33 71 if(!empty($task->description)){
34 - $task_description = stripslashes((htmlspecialchars_decode($task->description, ENT_QUOTES)));
72 + $task_description = !empty($task->description) ? wp_kses_post(wpautop($task->description)) : '';
35 73 }
36 74
75 +if($wppm_task_time == 1){
76 + $tsDate = new DateTime($task->start_date);
77 + $teDate = new DateTime($task->end_date);
78 + if($task->start_date=='0000-00-00 00:00:00'){
79 + if($wppm_date_setting=='Y-m-d H:i:s'){
80 + $task_start_date = '0000-00-00 00:00:00';
81 + }elseif($wppm_date_setting=='d-m-Y H:i:s'){
82 + $task_start_date = '00-00-0000 00:00:00';
83 + }elseif($wppm_date_setting=='m-d-Y H:i:s'){
84 + $task_start_date = '00-00-0000 00:00:00';
85 + }else{
86 + $task_start_date = '0000-00-00 00:00:00';
87 + }
88 + }if($task->end_date=='0000-00-00 00:00:00'){
89 + if($wppm_date_setting=='Y-m-d H:i:s'){
90 + $task_end_date = '0000-00-00 00:00:00';
91 + }elseif($wppm_date_setting=='d-m-Y H:i:s'){
92 + $task_end_date = '00-00-0000 00:00:00';
93 + }elseif($wppm_date_setting=='m-d-Y H:i:s'){
94 + $task_end_date = '00-00-0000 00:00:00';
95 + }else{
96 + $task_end_date = '0000-00-00 00:00:00';
97 + }
98 + }if($task->start_date!='0000-00-00 00:00:00'){
99 + if(!empty($wppm_date_setting)){
100 + $task_start_date = $tsDate->format($wppm_date_setting);
101 + }else{
102 + $task_start_date = isset($task->start_date)? $task->start_date:"";
103 + }
104 + }
105 + if($task->end_date!='0000-00-00 00:00:00'){
106 + if(!empty($wppm_date_setting)){
107 + $task_end_date = $teDate->format($wppm_date_setting);
108 + }else{
109 + $task_end_date = isset($task->end_date) ? $task->end_date: "" ;
110 + }
111 + }
112 +} elseif($wppm_task_time == 0){
113 + $tsDate = isset($task->start_date) ? new DateTime($task->start_date): "";
114 + $teDate = isset($task->end_date) ? new DateTime($task->end_date):"";
115 + $task_start_date = !empty($tsDate) ? $tsDate->format( $wppm_date_setting):"";
116 + $task_end_date = !empty($teDate) ? $teDate->format( $wppm_date_setting):"";
117 + if($task->start_date=='0000-00-00 00:00:00'){
118 + if($wppm_date_setting=='Y-m-d H:i:s'){
119 + $task_start_date = '0000-00-00';
120 + }elseif($wppm_date_setting=='d-m-Y H:i:s'){
121 + $task_start_date = '00-00-0000';
122 + }elseif($wppm_date_setting=='m-d-Y H:i:s'){
123 + $task_start_date = '00-00-0000';
124 + }else{
125 + $task_start_date = '0000-00-00';
126 + }
127 + }
128 + if($task->end_date=='0000-00-00 00:00:00'){
129 + if($wppm_date_setting=='Y-m-d H:i:s'){
130 + $task_end_date = '0000-00-00';
131 + }elseif($wppm_date_setting=='d-m-Y H:i:s'){
132 + $task_end_date = '00-00-0000';
133 + }elseif($wppm_date_setting=='m-d-Y H:i:s'){
134 + $task_end_date = '00-00-0000';
135 + }
136 + else{
137 + $task_end_date = '0000-00-00';
138 + }
139 + }if($task->start_date!='0000-00-00 00:00:00'){
140 + if($wppm_date_setting=='Y-m-d H:i:s'){
141 + $task_start_date = $tsDate->format('Y-m-d');
142 + }elseif($wppm_date_setting=='d-m-Y H:i:s'){
143 + $task_start_date = $tsDate->format('d-m-Y');
144 + }elseif($wppm_date_setting=='m-d-Y H:i:s'){
145 + $task_start_date = $tsDate->format('m-d-Y');
146 + }else{
147 + $task_start_date = $tsDate->format('Y-m-d');
148 + }
149 + }if($task->end_date!='0000-00-00 00:00:00'){
150 + if($wppm_date_setting=='Y-m-d H:i:s'){
151 + $task_end_date = $teDate->format('Y-m-d');
152 + }elseif($wppm_date_setting=='d-m-Y H:i:s'){
153 + $task_end_date = $teDate->format('d-m-Y');
154 + }elseif($wppm_date_setting=='m-d-Y H:i:s'){
155 + $task_end_date = $teDate->format('m-d-Y');
156 + }else{
157 + $task_end_date = $teDate->format('Y-m-d');
158 + }
159 + }
160 +}
161 +$flag = false;
162 +$wppm_task_fillter = $wpdb->get_results( $wpdb->prepare("SELECT * FROM {$wpdb->prefix}wppm_task where id=%d",$id));
163 +if(!empty($wppm_task_fillter)){
164 + foreach($wppm_task_fillter as $key_filter=>$val_filter){
165 + $val_array = (array) $val_filter;
166 + $tusers = $val_array['users'];
167 + $tusers_arr = explode(',',$tusers);
168 + $tproject_id = $val_array['project'];
169 + $tproject_id = absint($tproject_id);
170 + if(!empty($tusers) && in_array($current_user->ID,$tusers_arr)){
171 + $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));
172 + $project_users = $wpdb->get_var( $wpdb->prepare("SELECT users FROM {$wpdb->prefix}wppm_project WHERE id = %d",$tproject_id));
173 + $project_users_arr = explode(',',(string)$project_users);
174 + if((!empty($project_user_role)) && ($project_user_role == 1) && in_array($current_user->ID,$project_users_arr)){
175 + $flag= true;
176 + break;
177 + }
178 + }
179 + }
180 +}
181 +$project_creator = $wpdb->get_var( $wpdb->prepare("SELECT created_by FROM {$wpdb->prefix}wppm_project WHERE created_by = %d",$cu_id));
37 182 ?>
38 183 <form id="wppm_open_task" method="post">
184 + <div id="wppm_alert_success" class="alert alert-success wppm_alert" style="display:none;" role="alert">
185 + <img src="<?php echo esc_url( WPPM_PLUGIN_URL . 'asset/images/success.svg'); ?>" alt="success"> <span class="wppm_alert_text"></span>
186 + </div>
187 + <div id="wppm_alert_error" class="alert alert-danger wppm_alert" style="display:none;" role="alert">
188 + <img src="<?php echo esc_url( WPPM_PLUGIN_URL . 'asset/images/warning-triangle.svg'); ?>" alt="warning-triangle"> <span class="wppm_alert_text"></span>
189 + </div>
39 190 <div class="wppm_headers row">
40 191 <div class="col-sm-8">
41 192 <span class="wppm-heading-inline">
42 193 <?php echo esc_html_e('Task','taskbuilder');?>
43 - </span>
44 - <?php if($proj_id==0) { ?>
45 - <span onclick="wppm_add_new_task(<?php echo esc_attr($proj_id) ?>)" class="wppm_add_new_task_btn" id="wppm_add_new_task_btn" title="Create Task"><img src="<?php echo esc_url( WPPM_PLUGIN_URL . 'asset/images/plus.svg'); ?>" alt="add"></span>
194 + </span><?php
195 + if(($current_user->has_cap('manage_options') || $wppmfunction->has_permission('add_new_task',$task_id) || ($flag==true) || $project_creator!="") && $task->is_archived!=1){
196 + $style = "display:inline;";
197 + }else{
198 + $style = "display:none;";
199 + }
200 + $style = apply_filters('wppm_add_new_task_btn_style_open_task_form',$style);
201 + if(($wppm_task_fillter && (!empty($project_user_role)) && ($project_user_role == 1) && in_array($current_user->ID,$project_users_arr)) || $wppm_current_user_capability == 'wppm_admin'|| $wppm_current_user_capability == 'wppm_manager' || $current_user->has_cap('manage_options') || $project_data['created_by']==$current_user->ID){
202 + $archive_style= "display:inline;";
203 + }else{
204 + $archive_style= "display:none;";
205 + }
206 + if($proj_id==0) {
207 + ?> <span onclick="wppm_add_new_task(<?php echo esc_attr($proj_id) ?>,<?php echo esc_attr($project_id) ?>)" class="wppm_add_new_task_btn" id="wppm_add_new_task_btn" style="<?php echo esc_attr($style)?>" title="<?php esc_attr_e( 'Create Task', 'taskbuilder' ); ?>"><img src="<?php echo esc_url( WPPM_PLUGIN_URL . 'asset/images/plus.svg'); ?>" alt="add"></span>
46 208 <?php }
47 209 else{ ?>
48 - <span class="wppm_add_new_task_btn" id="wppm_add_new_task_btn" title="Create Task" onclick="wppm_create_project_task(<?php echo esc_attr($proj_id) ?>)"><img src="<?php echo esc_url( WPPM_PLUGIN_URL . 'asset/images/plus.svg'); ?>" alt="add"></span>
210 + <span class="wppm_add_new_task_btn" id="wppm_add_new_task_btn" title="<?php esc_attr_e( '"Create Task', 'taskbuilder' ); ?>" onclick="wppm_create_project_task(<?php echo esc_attr($proj_id) ?>)" style="<?php echo esc_attr($style) ?>"><img src="<?php echo esc_url( WPPM_PLUGIN_URL . 'asset/images/plus.svg'); ?>" alt="add"></span>
49 211 <?php } ?>
50 - <?php if($proj_id==0) {
51 - $task_list_function = ($task_list_view==1)?"wppm_get_task_list()":"wppm_view_task_search_filter()";
212 + <?php if($proj_id==0) {
213 + if (($project_id!=0)) {
214 + $task_list_function = "wppm_get_project_tasks_kanban_view( {$project_id})";
215 + }
216 + if (empty($project_id) && $task_list_view == 1) {
217 + $task_list_function = "wppm_get_task_list('', {$project_id})";
218 + }
219 + if(empty($task_list_view) && empty($project_id)) {
220 + $task_list_function = "wppm_view_task_search_filter('', '', {$project_id})";
221 + }
52 222 ?>
53 - <span class="wppm-task-list-btn" id="wppm_task_list_btn" title="Task List" onclick="<?php echo $task_list_function ?>"><img src="<?php echo esc_url( WPPM_PLUGIN_URL . 'asset/images/list.svg'); ?>" alt="list"></span>
223 + <span class="wppm-task-list-btn" id="wppm_task_list_btn" title="<?php esc_attr_e( 'Task List', 'taskbuilder' ); ?>"onclick="<?php echo esc_attr($task_list_function) ?>"><img src="<?php echo esc_url( WPPM_PLUGIN_URL . 'asset/images/list.svg'); ?>" alt="list"></span>
54 224 <?php }
55 225 else{
56 226 ?>
57 - <span class="wppm-task-list-btn" id="wppm_task_list_btn" title="Task List" onclick="wppm_get_project_tasks(<?php echo esc_attr($proj_id) ?>)"><img src="<?php echo esc_url( WPPM_PLUGIN_URL . 'asset/images/list.svg'); ?>" alt="list"></span>
227 + <span class="wppm-task-list-btn" id="wppm_task_list_btn" title="<?php esc_attr_e( 'Task List', 'taskbuilder' ); ?>" onclick="wppm_get_project_tasks(<?php echo esc_attr($proj_id) ?>)"><img src="<?php echo esc_url( WPPM_PLUGIN_URL . 'asset/images/list.svg'); ?>" alt="list"></span>
58 228 <?php } ?>
59 - <?php $style = (($current_user->ID && $current_user->has_cap('manage_options')) || ($wppmfunction->has_permission('delete_task',$id)))? "display:inline":"display:none"; ?>
60 - <?php $clone_style = (($current_user->ID && $current_user->has_cap('manage_options')) || ($wppmfunction->has_permission('clone_task',$id)))? "display:inline":"display:none"; ?>
61 - <span class="wppm-delete_task_btn" id="wppm_delete_task_btn" title="Delete Task" onclick="wppm_get_delete_task(<?php echo esc_attr($id) ?>)" style="<?php echo esc_attr($style) ?>"><img src="<?php echo esc_url( WPPM_PLUGIN_URL . 'asset/images/bin.svg'); ?>" alt="delete"></span>
62 - <div class="wppm-clone_task_btn" id="wppm_clone_task_btn" title="Clone Task" onclick="wppm_clone_task(<?php echo esc_attr($id) ?>)" style="<?php echo esc_attr($clone_style) ?>"><img src="<?php echo esc_url( WPPM_PLUGIN_URL . 'asset/images/duplicate.svg'); ?>" alt="clone"></div>
229 + <?php $style = ((($current_user->ID && $current_user->has_cap('manage_options')) || ($wppmfunction->has_permission('delete_task',$id)) || $wppm_current_user_capability == 'wppm_admin'|| $project_data['created_by']==$current_user->ID ) && $user_role != 3) ? "display:inline":"display:none"; ?>
230 + <?php $clone_style = ((($current_user->ID && $current_user->has_cap('manage_options') || $wppm_current_user_capability == 'wppm_admin') || ($wppmfunction->has_permission('clone_task',$id)) || $project_data['created_by']==$current_user->ID ) && $task->is_archived!=1 && $user_role != 3) ? "display:inline":"display:none"; ?>
231 + <?php $ar_css = ($task->is_archived==1) ? "display:none;" : "display:inline"; ?>
232 + <span class="wppm-dashboard-btn" id="wppm_dashboard_btn" title="<?php esc_attr_e( 'Dashboard', 'taskbuilder' ); ?>" onclick="wppm_get_project_tasks(<?php echo esc_attr($proj_id) ?>)">
233 + <a href="<?php echo esc_url(admin_url('admin.php?page=wppm-dashboard')); ?>"><img src="<?php echo esc_url( WPPM_PLUGIN_URL . 'asset/images/dashboard-icon.svg'); ?>" alt="dashboard"></a>
234 + </span>
235 + <span class="wppm-delete_task_btn" id="wppm_delete_task_btn" title="Delete Task" onclick="wppm_get_delete_task(<?php echo esc_attr($id) ?>,<?php echo esc_attr($proj_id) ?>,<?php echo esc_attr($project_id) ?>)" style="<?php echo esc_attr($style) ?>"><img src="<?php echo esc_url( WPPM_PLUGIN_URL . 'asset/images/bin.svg'); ?>" alt="delete"></span>
236 + <span class="wppm-clone_task_btn" id="wppm_clone_task_btn" title="Clone Task" onclick="wppm_clone_task(<?php echo esc_attr($id) ?>,<?php echo esc_attr($proj_id)?>,<?php echo esc_attr($project_id) ?>)" style="<?php echo esc_attr($clone_style) ?>"><img src="<?php echo esc_url( WPPM_PLUGIN_URL . 'asset/images/duplicate.svg'); ?>" alt="clone"></span>
237 + <span class="wppm-print_task_btn" id="wppm_print_task_btn" title="Print Task" onclick="wppm_print_task(<?php echo esc_attr($id) ?>)"><img src="<?php echo esc_url( WPPM_PLUGIN_URL . 'asset/images/printer_menu.svg'); ?>" alt="print" style="<?php echo esc_attr($ar_css);?>"></span>
238 + <span class="wppm-archieve_task_btn" id="wppm_archieve_task_btn" title="<?php echo ($task->is_archived==1 ) ? 'Restore Task' : 'Archive Task'; ?>" onclick="wppm_archive_task(<?php echo esc_attr($id) ?>,<?php echo esc_attr($task->is_archived) ?>,<?php echo esc_attr($project_id) ?>)" style="<?php echo esc_attr($archive_style) ?>"><img src="<?php echo esc_url( WPPM_PLUGIN_URL . 'asset/images/archive.svg'); ?>" alt="archive"></span>
239 + <input type="hidden" name="wppm_archive_task_ajax_nonce" id="wppm_archive_task_ajax_nonce" value="<?php echo esc_attr( wp_create_nonce( 'wppm_archive_task_ajax_nonce' ) ); ?>">
240 + <div class="menu" id="wppmprint_menu" onclick="event.stopPropagation();">
241 + <a href="#" id="wppm_openPDF" onclick="wppm_open_pdf(<?php echo esc_attr($id) ?>)">🖨️ <?php echo esc_html_e('Open In Browser','taskbuilder');?></a>
242 + <a href="#" id="wppm_downloadPDF" onclick="wppm_download_pdf(<?php echo esc_attr($id) ?>)">💾 <?php echo esc_html_e('Download PDF','taskbuilder');?></a>
243 + </div>
63 244 <?php do_action('wppm_individual_task_button',$id);?>
64 - </div>
245 + </div>
65 246 </div>
66 247 <div id="wppm_load_individual_task_container" class="row">
67 248 <div class="col-sm-8 wppm_body col-md-9">
68 249 <div class="wppm_task_details_container">
@@ -67,13 +248,28 @@
67 248 <div class="col-sm-8 wppm_body col-md-9">
68 249 <div class="wppm_task_details_container">
69 250 <div class="row">
70 251 <div class="col-sm-12">
71 - <span class="wppm_task_label"> <?php echo esc_html_e($task->task_name,'taskbuilder');
72 - if ($wppmfunction->has_permission('change_task_details',$id) || $current_user->has_cap('manage_options')) { ?>
73 - <span id="wppm_individual_edit_task_subject" onclick="wppm_edit_task_details(<?php echo esc_attr($id) ?>,<?php echo esc_attr($proj_id) ?>)" class="btn btn-sm wppm_action_btn" style="background-color:#FFFFFF !important;color:#000000 !important;"><img src="<?php echo esc_url( WPPM_PLUGIN_URL . 'asset/images/edit_01.svg'); ?>" alt="edit"></span>
252 + <span class="wppm_task_label"> <?php echo isset($task->task_name) ? esc_html($task->task_name ):"" ?>
253 + <?php if (($wppmfunction->has_permission('change_task_details',$id) || $current_user->has_cap('manage_options') || $wppm_current_user_capability == 'wppm_admin') && $task->is_archived!=1) { ?>
254 + <span id="wppm_individual_edit_task_subject" onclick="wppm_edit_task_details(<?php echo esc_attr($id) ?>,<?php echo esc_attr($proj_id) ?>,<?php echo esc_attr($project_id) ?>)" class="btn btn-sm wppm_action_btn" style="background-color:#FFFFFF !important;color:#000000 !important;"><img src="<?php echo esc_url( WPPM_PLUGIN_URL . 'asset/images/edit_01.svg'); ?>" alt="edit"></span>
74 255 <?php } ?>
75 256 </span>
257 + <?php if(!empty($task->parent_task_id)){
258 + $wppm_parent_task = $wpdb->get_row( $wpdb->prepare("SELECT id, task_name FROM {$wpdb->prefix}wppm_task where id=%d",absint($task->parent_task_id)));
259 + if(!empty($wppm_parent_task)){
260 + $wppm_can_convert_subtask = (($current_user->has_cap('manage_options') || $wppmfunction->has_permission('delete_task',$id)) && $task->is_archived!=1);
261 + ?>
262 + <div class="wppm_subtask_parent_link">
263 + <?php echo esc_html_e('Subtask of','taskbuilder');?>
264 + <a href="#" onclick="wppm_open_subtask(<?php echo esc_attr($wppm_parent_task->id) ?>,<?php echo esc_attr($proj_id) ?>);return false;"><?php echo esc_html($wppm_parent_task->task_name); ?></a>
265 + <?php if($wppm_can_convert_subtask){ ?>
266 + &nbsp;|&nbsp;<a href="#" onclick="wppm_convert_subtask_to_task(<?php echo esc_attr($id) ?>,<?php echo esc_attr($id) ?>,<?php echo esc_attr($proj_id) ?>);return false;"><?php echo esc_html_e('Convert to Task','taskbuilder');?></a>
267 + <input type="hidden" name="wppm_convert_subtask_to_task_ajax_nonce" id="wppm_convert_subtask_to_task_ajax_nonce" value="<?php echo esc_attr( wp_create_nonce( 'wppm_convert_subtask_to_task' ) ); ?>">
268 + <?php } ?>
269 + </div>
270 + <?php }
271 + } ?>
76 272 </div>
77 273 </div>
78 274 <div class="row">
79 275 <div class="col-sm-3">
@@ -79,9 +275,9 @@
79 275 <div class="col-sm-3">
80 276 <span class="wppm_task_details_label"><?php echo esc_html_e('Project:','taskbuilder');?></span>
81 277 </div>
82 278 <div class="col-sm-9">
83 - <span class="wppm_task_details"><?php echo (isset($project_name))? esc_html_e($project_name,'taskbuilder'):"" ?></span>
279 + <span class="wppm_task_details"><?php echo (isset($project_name))? esc_html($project_name ):"" ?></span>
84 280 </div>
85 281 </div>
86 282 <div class="row">
87 283 <div class="col-sm-3">
@@ -86,34 +282,74 @@
86 282 <div class="row">
87 283 <div class="col-sm-3">
88 284 <span class="wppm_task_details_label"><?php echo esc_html_e('Created On:','taskbuilder');?></span>
89 285 </div>
90 - <div class="col-sm-9">
91 - <span class="wppm_task_details"><?php echo (isset($task->date_created))? esc_html($task->date_created):"" ?></span>
286 + <div class="col-sm-9"><?php
287 + $tcDate = isset($task->date_created) ? new DateTime($task->date_created): "";
288 + if($wppm_task_time !=0){
289 + if($wppm_date_setting=='Y-m-d H:i:s'){
290 + $task_create_date = !empty($tcDate) ? $tcDate->format('Y-m-d H:i:s'):"";
291 + } elseif($wppm_date_setting=='d-m-Y H:i:s'){
292 + $task_create_date = !empty($tcDate) ? $tcDate->format('d-m-Y H:i:s'):"";
293 + } elseif($wppm_date_setting=='m-d-Y H:i:s'){
294 + $task_create_date = !empty($tcDate) ? $tcDate->format('m-d-Y H:i:s'):"";
295 + } else {
296 + $task_create_date = !empty($tcDate) ? $tcDate->format('Y-m-d H:i:s'):"";
297 + }
298 + } elseif($wppm_task_time == 0){
299 + if($wppm_date_setting=='Y-m-d H:i:s'){
300 + $task_create_date = !empty($tcDate) ? $tcDate->format('Y-m-d'):"";
301 + } elseif($wppm_date_setting=='d-m-Y H:i:s'){
302 + $task_create_date = !empty($tcDate) ? $tcDate->format('d-m-Y'):"";
303 + } elseif($wppm_date_setting=='m-d-Y H:i:s'){
304 + $task_create_date = !empty($tcDate) ? $tcDate->format('m-d-Y'):"";
305 + } else {
306 + $task_create_date = !empty($tcDate) ? $tcDate->format('Y-m-d'):"";
307 + }
308 + } ?>
309 + <span class="wppm_task_details"><?php echo (isset($task_create_date))? esc_html($task_create_date):"" ?></span>
92 310 </div>
93 311 </div>
312 + <?php if($wppm_default_task_date == 1 && $wppm_deafault_time_duration_task==0){ ?>
313 + <div class="row">
314 + <div class="col-sm-3">
315 + <span class="wppm_task_details_label"><?php echo esc_html_e('Start Date:','taskbuilder');?></span>
316 + </div>
317 + <div class="col-sm-9">
318 + <span class="wppm_task_details" id="wppm_edit_tstart_date"><?php echo (isset($task_start_date))? esc_html($task_start_date):"" ?></span>
319 + </div>
320 + <input type="hidden" name="wppm_edit_tstart_date_ajax_nonce" id="wppm_edit_tstart_date_ajax_nonce" value="<?php echo esc_attr( wp_create_nonce( 'wppm_set_change_task_start_date' ) ); ?>">
321 + </div>
322 + <div class="row">
323 + <div class="col-sm-3">
324 + <span class="wppm_task_details_label"><?php echo esc_html_e('End Date:','taskbuilder');?></span>
325 + </div>
326 + <div class="col-sm-9">
327 + <?php $style = (!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')) ? "color:#FF0000":"color:#2C3E50"; ?>
328 + <span class="wppm_task_details" id="wppm_edit_tend_date" style="<?php echo esc_attr($style); ?>"><?php echo (isset($task_end_date))? esc_html($task_end_date):"" ?></span>
329 + </div>
330 + <input type="hidden" name="wppm_edit_tend_date_ajax_nonce" id="wppm_edit_tend_date_ajax_nonce" value="<?php echo esc_attr( wp_create_nonce( 'wppm_set_change_task_end_date' ) ); ?>">
331 + </div>
332 + <?php }
333 + if($wppm_deafault_time_duration_task==1){
334 + $wppm_task_duration = $wppmfunction->wppm_get_duration($task->start_date,$task->end_date);
335 + $tstatus = isset($task->status) ? $task->status :"";
336 + $style = (!empty($task->end_date) && $tstatus!=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')) ? "color:#FF1111":"color:#2C3E51"; ?>
337 + <div class="row">
338 + <div class="col-sm-3">
339 + <span class="wppm_task_details_label"><?php echo esc_html_e('Task Duration:','taskbuilder');?></span>
340 + </div>
341 + <div class="col-sm-9">
342 + <span class="wppm_task_details" id="wppm_edit_task_duration" style="<?php echo esc_attr($style); ?>"><?php echo (isset($wppm_task_duration))? esc_html($wppm_task_duration ): "" ?></span>
343 + </div>
344 + </div> <?php
345 + }?>
94 346 <div class="row">
95 347 <div class="col-sm-3">
96 - <span class="wppm_task_details_label"><?php echo esc_html_e('Start Date:','taskbuilder');?></span>
97 - </div>
98 - <div class="col-sm-9">
99 - <span class="wppm_task_details"><?php echo (isset($task->start_date))? esc_html($task->start_date):"" ?></span>
100 - </div>
101 - </div>
102 - <div class="row">
103 - <div class="col-sm-3">
104 - <span class="wppm_task_details_label"><?php echo esc_html_e('End Date:','taskbuilder');?></span>
105 - </div>
106 - <div class="col-sm-9">
107 - <span class="wppm_task_details"><?php echo (isset($task->end_date))? esc_html($task->end_date):"" ?></span>
108 - </div>
109 - </div>
110 - <div class="row">
111 - <div class="col-sm-3">
112 348 <span class="wppm_task_details_label"><?php echo esc_html_e('Task Priority:','taskbuilder');?></span>
113 349 </div>
114 350 <div class="col-sm-9">
115 - <span class="wppm_task_details_priority"><span class="wppm_admin_label" style="background-color:<?php echo (isset($task_priority->bg_color))? esc_html($task_priority->bg_color):""?>;color:<?php echo (isset($task_priority->color))? esc_html($task_priority->color):""?>;"><?php echo (isset($task_priority->name)) ? esc_html_e($task_priority->name,'taskbuilder'):"" ?> </span></span>
351 + <span class="wppm_task_details_priority"><span class="wppm_admin_label" style="background-color:<?php echo (isset($task_priority->bg_color))? esc_html($task_priority->bg_color):""?>;color:<?php echo (isset($task_priority->color))? esc_html($task_priority->color):""?>;"><?php echo (isset($task_priority->name)) ? esc_html($task_priority->name):"" ?> </span></span>
116 352 </div>
117 353 </div>
118 354 <div class="row">
119 355 <div class="col-sm-3">
@@ -118,16 +354,174 @@
118 354 <div class="row">
119 355 <div class="col-sm-3">
120 356 <span class="wppm_task_details_label"><?php echo esc_html_e('Description:','taskbuilder');?></span>
121 357 </div>
122 - <?php
123 - $allowedtags = array( 'br' => array(), 'abbr' => array('title' => array(),), 'p' => array(), 'strong' => array(), 'a' => array('href' => array(), 'title' => array(),'target'=> array(), 'rel'=>array()),'em' =>array(),'span' =>array(), 'blockquote'=>array('cite' => array(),),'div' => array('class' => array(),'title' => array(),'style' => array(),),'ul'=>array(),'li'=>array(),'ol'=>array(),'img' => array( 'alt'=> array(),'class' => array(),'height' => array(),'src'=> array(),'width'=> array(),));?>
124 358 <div class="col-sm-9">
125 - <span class="wppm_task_description"><?php echo (isset($task_description))? wp_kses(wpautop($task_description),$allowedtags):"" ?></span>
359 + <span class="wppm_task_description"><?php echo (!empty($task_description))? wp_kses_post(wpautop($task_description)):"" ?></span>
126 360 </div>
127 361 </div>
128 362 <?php do_action('wppm_after_task_details_in_open_task',$task->id, $task->project);?>
129 363 </div>
364 + <?php if(empty($task->parent_task_id)){
365 + $wppm_subtasks = $wppmfunction->get_subtasks($task_id);
366 + $wppm_subtask_progress = $wppmfunction->get_subtask_progress($task_id);
367 + $wppm_default_task_status = get_option('wppm_default_task_status');
368 + $wppm_can_add_subtask = (($current_user->has_cap('manage_options') || $wppmfunction->has_permission('add_new_task',$task_id)) && $task->is_archived!=1 && $user_role != 3);
369 + ?>
370 + <div class="wppm_task_subtask_container" id="wppm_task_subtask_container">
371 + <div class="row">
372 + <div class="col-sm-8">
373 + <span class="wppm_checklist_label"><img src="<?php echo esc_url( WPPM_PLUGIN_URL . 'asset/images/task_list.svg'); ?>" alt="subtasks"><?php echo esc_html_e('Subtasks','taskbuilder');?></span>
374 + </div>
375 + </div>
376 + <?php if($wppm_subtask_progress['total'] > 0){
377 + $wppm_subtask_percent = round(($wppm_subtask_progress['completed'] / $wppm_subtask_progress['total']) * 100); ?>
378 + <div class="wppm_progress_bar_container row">
379 + <div class="col-sm-4">
380 + <span class="wppm_progressbar_label" id="wppm_subtask_progress_label"><?php echo esc_html($wppm_subtask_progress['completed'].'/'.$wppm_subtask_progress['total']); ?></span>
381 + </div>
382 + <div class="wppm_progress_bar col-sm-8">
383 + <div id="wppm_subtask_progressbar" class="wppm_checkprogress" role="progressbar" style="width: <?php echo esc_attr($wppm_subtask_percent); ?>%;background:#5ba4cf;" aria-valuemin="0" aria-valuemax="100"></div>
384 + </div>
385 + </div>
386 + <?php } ?>
387 + <input type="hidden" name="wppm_set_change_task_status_ajax_nonce" id="wppm_subtask_status_ajax_nonce" value="<?php echo esc_attr( wp_create_nonce( 'wppm_set_change_task_status' ) ); ?>">
388 + <input type="hidden" name="wppm_add_new_subtask_ajax_nonce" id="wppm_add_new_subtask_ajax_nonce" value="<?php echo esc_attr( wp_create_nonce( 'wppm_add_new_subtask' ) ); ?>">
389 + <input type="hidden" name="wppm_remove_subtask_ajax_nonce" id="wppm_remove_subtask_ajax_nonce" value="<?php echo esc_attr( wp_create_nonce( 'wppm_remove_subtask' ) ); ?>">
390 + <input type="hidden" name="wppm_convert_subtask_to_task_ajax_nonce" id="wppm_convert_subtask_to_task_ajax_nonce" value="<?php echo esc_attr( wp_create_nonce( 'wppm_convert_subtask_to_task' ) ); ?>">
391 + <ul id="wppm_subtask_items_container" class="wppm_checklist_items_container" style="list-style-type: none; padding-left:0px; margin-top:10px; margin-bottom:10px;">
392 + <?php if(!empty($wppm_subtasks)){
393 + foreach($wppm_subtasks as $subtask){
394 + $wppm_subtask_checked = ($subtask['status']==4) ? 'checked="checked"' : '';
395 + $wppm_subtask_users = !empty($subtask['users']) ? explode(",",$subtask['users']) : array();
396 + $wppm_subtask_can_change_status = ($current_user->has_cap('manage_options') || $wppmfunction->has_permission('change_status',$subtask['id'])) && $task->is_archived!=1;
397 + $wppm_subtask_can_delete = ($current_user->has_cap('manage_options') || $wppmfunction->has_permission('delete_task',$subtask['id'])) && $task->is_archived!=1;
398 + ?>
399 + <li id="wppm_subtask_<?php echo esc_attr($subtask['id']) ?>" class="row wppm_checklist_item" style="margin-bottom:10px;font: 15px 'Helvetica Neue',Helvetica,Arial,sans-serif;">
400 + <div class="col-sm-8">
401 + <input id="wppm_subtask_checkbox_<?php echo esc_attr($subtask['id']) ?>" type="checkbox" onchange="wppm_toggle_subtask_status(<?php echo esc_attr($subtask['id']) ?>,<?php echo esc_attr($task_id) ?>,<?php echo esc_attr($proj_id) ?>,<?php echo esc_attr($wppm_default_task_status) ?>,this.checked)" <?php echo esc_attr($wppm_subtask_checked) ?> <?php echo $wppm_subtask_can_change_status ? '' : 'disabled'; ?> style="margin:5px;">
402 + <label style="padding-top: 5px;font-weight: normal;font: 13px 'Helvetica Neue',Helvetica,Arial,sans-serif;cursor:pointer;" onclick="wppm_open_subtask(<?php echo esc_attr($subtask['id']) ?>,<?php echo esc_attr($proj_id) ?>)"><?php echo esc_html($subtask['task_name']); ?></label>
403 + </div>
404 + <div class="col-sm-4" style="text-align:right;">
405 + <?php $wppm_subtask_avatar_count = 0;
406 + $wppm_subtask_total_users = count( array_filter( $wppm_subtask_users ) );
407 + foreach($wppm_subtask_users as $wppm_subtask_user_id){
408 + if(!$wppm_subtask_user_id) continue;
409 + $wppm_subtask_avatar_count++;
410 + if($wppm_subtask_avatar_count > 3) break;
411 + $wppm_subtask_user_data = get_userdata($wppm_subtask_user_id);
412 + $wppm_subtask_user_name = !empty($wppm_subtask_user_data) ? $wppm_subtask_user_data->display_name : '';
413 + echo get_avatar($wppm_subtask_user_id, 20, "mysteryman", $wppm_subtask_user_name, array('extra_attr' => 'title="'.esc_attr($wppm_subtask_user_name).'"'));
414 + }
415 + $wppm_subtask_more_users = $wppm_subtask_total_users - 3;
416 + if ( $wppm_subtask_more_users > 0 ) {
417 + ?>
418 + <span class="wppm_subtask_more_users" title="<?php echo esc_attr( sprintf( _n( '%d more user assigned', '%d more users assigned', $wppm_subtask_more_users, 'taskbuilder' ), $wppm_subtask_more_users ) ); ?>">+<?php echo esc_html( $wppm_subtask_more_users ); ?></span>
419 + <?php
420 + } ?>
421 + <?php if($wppm_subtask_can_delete){ ?>
422 + <a href="#" title="<?php echo esc_attr__('Convert to Task','taskbuilder'); ?>" onclick="wppm_convert_subtask_to_task(<?php echo esc_attr($subtask['id']) ?>,<?php echo esc_attr($task_id) ?>,<?php echo esc_attr($proj_id) ?>);return false;" style="font-size:11px;margin-right:8px;"><?php echo esc_html_e('Convert to Task','taskbuilder');?></a>
423 + <span onclick="wppm_delete_subtask(<?php echo esc_attr($subtask['id']) ?>,<?php echo esc_attr($task_id) ?>,<?php echo esc_attr($proj_id) ?>)" style="cursor:pointer;"><img src="<?php echo esc_url( WPPM_PLUGIN_URL . 'asset/images/trash.svg'); ?>" alt="delete"></span>
424 + <?php } ?>
425 + </div>
426 + </li>
427 + <?php
428 + }
429 + } ?>
430 + </ul>
431 + <?php if($wppm_can_add_subtask){
432 + $wppm_all_task_statuses = $wpdb->get_results("SELECT * FROM {$wpdb->prefix}wppm_task_statuses ORDER BY load_order ASC");
433 + ?>
434 + <div class="row">
435 + <div class="col-sm-12" style="padding-top:15px;">
436 + <a class="wppm_add_checklist" id="wppm_add_subtask_btn" onclick="wppm_show_add_subtask()"><?php echo esc_html_e('+ Add subtask','taskbuilder');?></a>
437 + </div>
438 + </div>
439 + <div class="row">
440 + <div class="col-sm-12" style="display:none;" id="wppm_add_subtask_label_container">
441 + <div class="row">
442 + <div class="wppm_task_frm_fields col-sm-6">
443 + <span class="wppm_form_field_label"><b><?php echo esc_html_e('Subtask Name','taskbuilder');?></b> <span style="color:#ff0000;">*</span></span><br>
444 + <input type="text" id="wppm_subtask_label" class="form-control" placeholder="<?php echo esc_attr__('Subtask name','taskbuilder') ?>" name="wppm_subtask_label">
445 + </div>
446 + <div class="wppm_task_frm_fields col-sm-6">
447 + <span class="wppm_form_field_label"><b><?php echo esc_html_e('Status','taskbuilder');?></b></span><br>
448 + <select id="wppm_subtask_status" name="wppm_subtask_status" class="form-control">
449 + <?php if(!empty($wppm_all_task_statuses)){
450 + foreach($wppm_all_task_statuses as $wppm_st){ ?>
451 + <option value="<?php echo esc_attr($wppm_st->id) ?>" <?php selected($wppm_st->id, $wppm_default_task_status); ?>><?php echo esc_html($wppm_st->name) ?></option>
452 + <?php }
453 + } ?>
454 + </select>
455 + </div>
456 + </div>
457 + <div class="row">
458 + <div class="wppm_task_frm_fields col-sm-6">
459 + <span class="wppm_form_field_label"><b><?php echo esc_html_e('Due date','taskbuilder');?></b></span><br>
460 + <input type="text" id="wppm_subtask_due_date" class="form-control" name="wppm_subtask_due_date" value="" autocomplete="off">
461 + </div>
462 + <div class="wppm_task_frm_fields col-sm-6">
463 + <span class="wppm_form_field_label"><b><?php echo esc_html_e('Assignee','taskbuilder');?></b></span><br>
464 + <input class="form-control wppm_subtask_assign_users ui-autocomplete-input" name="wppm_subtask_assign_users" type="text" autocomplete="off" placeholder="<?php echo esc_attr__('Search User...','taskbuilder');?>">
465 + </div>
466 + </div>
467 + <div class="row">
468 + <div class="col-sm-12">
469 + <ul class="wppm_subtask_filter_display_users_container" style="list-style:none;padding-left:0;"></ul>
470 + </div>
471 + </div>
472 + <div class="row">
473 + <div class="wppm_task_frm_fields col-sm-12">
474 + <span class="wppm_form_field_label"><b><?php echo esc_html_e('Description','taskbuilder');?></b></span><br>
475 + <textarea id="wppm_subtask_description" name="wppm_subtask_description" class="form-control" rows="3"></textarea>
476 + </div>
477 + </div>
478 + <div class="row" style="padding-top:10px;">
479 + <div class="col-sm-12">
480 + <input type="button" value="<?php echo esc_attr__('Add','taskbuilder') ?>" class="btn btn-success btn-sm" onclick="wppm_add_new_subtask(<?php echo esc_attr($task_id)?>,<?php echo esc_attr($proj_id) ?>)">
481 + <button type="button" class="wppm_reset_btn" onclick="wppm_hide_add_subtask()"><?php echo esc_html_e('Cancel','taskbuilder');?></button>
482 + </div>
483 + </div>
484 + </div>
485 + </div>
486 + <script type="text/javascript">
487 + jQuery(document).ready(function(){
488 + jQuery('#wppm_subtask_due_date').flatpickr({
489 + enableTime: true,
490 + dateFormat: "Y-m-d H:i"
491 + });
492 + jQuery('.wppm_subtask_assign_users').autocomplete({
493 + minLength: 1,
494 + appendTo: jQuery('.wppm_subtask_assign_users').parent(),
495 + source: function(request, response){
496 + jQuery.getJSON(wppm_admin.ajax_url, {
497 + action: 'wppm_filter_autocomplete',
498 + term: request.term,
499 + field: 'task_users_by_project_name',
500 + proj_id: <?php echo (int) $task->project; ?>
501 + }, function(data){ response(data); });
502 + },
503 + select: function(event, ui){
504 + if(!ui.item.user_id){ return false; }
505 + var html_str = '<li class="wppm_filter_display_element" style="list-style:none">'
506 + +'<div class="flex-container">'
507 + +'<div class="wppm_filter_display_text">'
508 + + ui.item.label
509 + + '<input type="hidden" name="wppm_subtask_user_names[]" value="'+ui.item.user_id+'">'
510 + +'</div>'
511 + +'<div class="wppm_filter_display_remove" onclick="wppm_remove_subtask_user(this);"><img src="<?php echo esc_url( WPPM_PLUGIN_URL . 'asset/images/cross.svg'); ?>" alt="delete"></div>'
512 + +'</div>'
513 + +'</li>';
514 + jQuery('.wppm_subtask_filter_display_users_container').append(html_str);
515 + jQuery(this).val('');
516 + return false;
517 + }
518 + }).focus(function(){ jQuery(this).autocomplete("search", ""); });
519 + });
520 + </script>
521 + <?php } ?>
522 + </div>
523 + <?php } ?>
130 524 <div class="wppm_task_checklist_container" id="wppm_task_checklist_container">
131 525 <div id="wppm_checklist_container">
132 526 <?php
133 527 if(!empty($wppm_checklist)){
@@ -134,15 +528,19 @@
134 528 foreach( $wppm_checklist as $key=>$list){
135 529 ?>
136 530 <div class="row">
137 531 <div class="col-sm-8">
138 - <span class="wppm_checklist_label"><img src="<?php echo esc_url( WPPM_PLUGIN_URL . 'asset/images/checklist.svg'); ?>" alt="checklist"><?php echo esc_html_e($list->checklist_name,'taskbuilder');?></span>
532 + <span class="wppm_checklist_label"><img src="<?php echo esc_url( WPPM_PLUGIN_URL . 'asset/images/checklist.svg'); ?>" alt="checklist"><?php echo isset($list->checklist_name) ? esc_html($list->checklist_name):"" ?></span>
139 533 </div>
140 - <?php $check_style = (($list->created_by == $current_user->ID || $current_user->has_cap('manage_options') || $user_role == 1))? "display:inline":"display:none"; ?>
141 - <?php $disabled = (($list->created_by == $current_user->ID || $current_user->has_cap('manage_options') || $user_role == 1))? "":"disabled"; ?>
142 - <div class="col-sm-4" style="text-align:right;<?php echo esc_attr($check_style) ?>">
143 - <a class="wppm_delete_checklist" onclick="wppm_delete_checklist(<?php echo esc_attr($list->id);?>,<?php echo esc_attr($task->id);?>,<?php echo esc_attr($proj_id);?>)"><?php echo esc_html_e('Delete Checklist','taskbuilder');?></a>
144 - </div>
534 + <?php
535 + $check_style = (($list->created_by == $current_user->ID || $current_user->has_cap('manage_options') || $user_role == 1 || $wppmfunction->has_permission('edit_checklist',$task->id)) && $task->is_archived!=1)? "display:inline":"display:none"; ?>
536 + <?php $disabled = (($list->created_by == $current_user->ID || $current_user->has_cap('manage_options') || $user_role == 1 || $wppmfunction->has_permission('delete_checklist',$task->id)|| ($wppmfunction->has_permission('add_checklist',0))) && $task->is_archived!=1)? "":"disabled"; ?>
537 + <?php if($wppmfunction->has_permission('add_checklist',$task->id) || $current_user->has_cap('manage_options')){ ?>
538 + <div class="col-sm-4" style="text-align:right;<?php echo esc_attr($check_style) ?>">
539 + <a class="wppm_delete_checklist" onclick="wppm_delete_checklist(<?php echo esc_attr($list->id);?>,<?php echo esc_attr($task->id);?>,<?php echo esc_attr($proj_id);?>)"><?php echo esc_html_e('Delete Checklist','taskbuilder');?></a>
540 + <input type="hidden" name="wppm_delete_checklist_ajax_nonce" id="wppm_delete_checklist_ajax_nonce" value="<?php echo esc_attr( wp_create_nonce( 'wppm_delete_checklist' ) ); ?>">
541 + </div>
542 + <?php }?>
145 543 </div>
146 544 <div class="wppm_progress_bar_container row">
147 545 <div class="col-sm-4">
148 546 <span class="wppm_progressbar_label" id="wppm_progressbar_label_<?php echo esc_attr($list->id)?>">0%</span>
@@ -151,67 +549,93 @@
151 549 <div id="CheckProgress_<?php echo esc_attr($list->id);?>" class="wppm_checkprogress" role="progressbar" style="width: 0%" aria-valuemin="0" aria-valuemax="100"></div>
152 550 </div>
153 551 </div>
154 552 <?php
155 - $wppm_checklist_items = $wpdb->get_results( "SELECT * FROM {$wpdb->prefix}wppm_checklist_items where checklist_id=".$list->id);
553 + $list_id = absint($list->id);
554 + $sql = $wpdb->prepare(
555 + "SELECT *
556 + FROM {$wpdb->prefix}wppm_checklist_items
557 + WHERE checklist_id = %d
558 + ORDER BY load_order ASC",
559 + $list_id
560 + );
561 + // Execute
562 + $wppm_checklist_items = $wpdb->get_results($sql);
156 563 ?>
564 + <ul id="wppm_checklist_items_container_<?php echo esc_attr($list->id) ?>" class="wppm_checklist_items_container" style="list-style-type: none; padding-left:0px; margin-top:10px; margin-bottom:10px;">
157 565 <?php
158 566 if(!empty( $wppm_checklist_items)){
159 567 foreach($wppm_checklist_items as $key=>$val){
160 568 $checked = $val->checked == 1 ? 'checked="checked"' : '';
161 569 ?>
162 - <div id="wppm_checklist_<?php echo esc_attr($val->id) ?>" class="row" style="margin-bottom:10px;font: 15px 'Helvetica Neue',Helvetica,Arial,sans-serif;">
570 + <li id="wppm_checklist_<?php echo esc_attr($val->id) ?>" data-id="<?php echo esc_attr($val->id); ?>" class="row wppm_checklist_item" style="margin-bottom:10px;font: 15px 'Helvetica Neue',Helvetica,Arial,sans-serif;">
163 571 <div class="col-sm-8" id="wppm_checklist_item_container_<?php echo esc_attr($val->id) ?>">
164 - <input id="wppm_checklist_item_<?php echo esc_attr($val->id) ?>" class="wppm_checklist_item_<?php echo esc_attr($val->checklist_id) ?>" onchange="wppm_checklist_progress(<?php echo esc_attr($val->checklist_id) ?>,<?php echo esc_attr($val->id) ?>,<?php echo esc_attr($task->id) ?>)" type="checkbox" name="wppm_checklist" <?php echo esc_attr($checked) ?> value="<?php echo esc_attr($val->id) ?>" <?php echo esc_attr($disabled) ?> style="margin:5px;"><label style="padding-top: 5px;font-weight: normal;font: 13px 'Helvetica Neue',Helvetica,Arial,sans-serif;"><?php echo esc_html_e($val->item_name,'taskbuilder') ?></label>
572 + <span class="wppm_chk_items_drag">☰</span>
573 + <input id="wppm_checklist_item_<?php echo esc_attr($val->id) ?>" class="wppm_checklist_item_<?php echo esc_attr($val->checklist_id) ?>" onchange="wppm_checklist_progress(<?php echo esc_attr($val->checklist_id) ?>,<?php echo esc_attr($val->id) ?>,<?php echo esc_attr($task->id) ?>)" type="checkbox" name="wppm_checklist" <?php echo esc_attr($checked) ?> value="<?php echo esc_attr($val->id) ?>" <?php echo esc_attr($disabled) ?> style="margin:5px;"><label style="padding-top: 5px;font-weight: normal;font: 13px 'Helvetica Neue',Helvetica,Arial,sans-serif;"><?php echo isset($val->item_name) ? esc_html($val->item_name) : "" ?></label>
574 + <input type="hidden" name="wppm_checklist_progress_ajax_nonce" id="wppm_checklist_progress_ajax_nonce" value="<?php echo esc_attr( wp_create_nonce( 'wppm_set_checklist_progress' ) ); ?>">
165 575 </div>
166 - <?php if ($list->created_by == $current_user->ID || $current_user->has_cap('manage_options') || $user_role == 1) { ?>
576 + <?php if (($list->created_by == $current_user->ID || $current_user->has_cap('manage_options') || $user_role == 1 || $wppmfunction->has_permission('delete_checklist',$task->id)) && $task->is_archived!=1) { ?>
167 577 <div class="col-sm-4" id="wppm_checklist_action_<?php echo esc_attr($val->id) ?>" style="text-align:right; display:none;cursor:pointer;">
578 + <span onclick=wppm_edit_checklist_item(<?php echo esc_attr($val->id) ?>,<?php echo esc_attr($val->checklist_id) ?>,<?php echo esc_attr( $proj_id);?>,<?php echo esc_attr($id) ?>)><img src="<?php echo esc_url( WPPM_PLUGIN_URL . 'asset/images/edit1.svg'); ?>" alt="edit"></span>
579 + <input type="hidden" name="wppm_edit_checklist_item_ajax_nonce" id="wppm_edit_checklist_item_ajax_nonce" value="<?php echo esc_attr( wp_create_nonce( 'wppm_edit_checklist_item' ) ); ?>">
168 580 <span onclick=wppm_delete_checklist_item(<?php echo esc_attr($val->id) ?>,<?php echo esc_attr($val->checklist_id) ?>,<?php echo esc_attr($proj_id);?>,<?php echo esc_attr($id) ?>)><img src="<?php echo esc_url( WPPM_PLUGIN_URL . 'asset/images/trash.svg'); ?>" alt="delete"></span>
581 + <input type="hidden" name="wppm_delete_checklist_item_ajax_nonce" id="wppm_delete_checklist_item_ajax_nonce" value="<?php echo esc_attr( wp_create_nonce( 'wppm_remove_checklist_item' ) ); ?>">
169 582 </div>
170 583 <?php } ?>
171 - </div>
584 + </li>
172 585 <?php
173 586 }
174 587 } ?>
175 - <div class="row">
176 - <div class="col-sm-12 wppm_add_checklist_item_container_<?php echo esc_attr($list->id) ?>" style="padding-top:15px;">
177 - <a class="wppm_add_checklist" id="wppm_add_checklist_item_btn_<?php echo esc_attr($list->id) ?>" onclick="wppm_add_checklist_item(<?php echo esc_attr($list->id)?>)"><?php echo esc_html_e('+ Add item','taskbuilder');?></a>
588 + <?php if(($wppmfunction->has_permission('add_checklist',$task->id) || $current_user->has_cap('manage_options')) && $task->is_archived!=1){ ?>
589 + <div class="row">
590 + <div class="col-sm-12 wppm_add_checklist_item_container_<?php echo esc_attr($list->id) ?>" style="padding-top:15px;">
591 + <a class="wppm_add_checklist" id="wppm_add_checklist_item_btn_<?php echo esc_attr($list->id) ?>" onclick="wppm_add_checklist_item(<?php echo esc_attr($list->id)?>)"><?php echo esc_html_e('+ Add item','taskbuilder');?></a>
592 + </div>
178 593 </div>
179 - </div>
180 - <div class="row">
181 - <div class="col-sm-12" style="display:none;" id="wppm_add_checklist_label_container_<?php echo esc_attr($list->id) ?>">
182 - <div class="row" id="wppm_add_new_checklist_item_<?php echo esc_attr($list->id) ?>">
183 - <div class="col-sm-12">
184 - <input type="text" id="wppm_checklist_item_label_<?php echo esc_attr($list->id) ?>" class="wppm_checklist_item_label_<?php echo esc_attr($list->id) ?>" placeholder="<?php echo esc_attr__('Add an item','taskbuilder') ?>" name="wppm_checklist_item_label" style="font: 13px 'Helvetica Neue',Helvetica,Arial,sans-serif;">
185 - <input type="button" value="Add" class="btn btn-success btn-sm wppm_add_new_item_btn_<?php echo esc_attr($list->id); ?>" onclick="wppm_add_new_checklist_item(<?php echo esc_attr($list->id)?>,<?php echo esc_attr($task->id)?>,<?php echo esc_attr($proj_id) ?>)">
186 - <span onclick="wppm_remove_add_checklist_container(<?php echo esc_attr($list->id) ?>)"><img src="<?php echo esc_url( WPPM_PLUGIN_URL . 'asset/images/cancel.svg'); ?>" alt="delete"></span>
594 + <?php }?>
595 + <?php if(($wppmfunction->has_permission('add_checklist',$task->id) || $current_user->has_cap('manage_options')) && $task->is_archived!=1){ ?>
596 + <div class="row">
597 + <div class="col-sm-12" style="display:none;" id="wppm_add_checklist_label_container_<?php echo esc_attr($list->id) ?>">
598 + <div class="row" id="wppm_add_new_checklist_item_<?php echo esc_attr($list->id) ?>">
599 + <div class="col-sm-12">
600 + <input type="text" id="wppm_checklist_item_label_<?php echo esc_attr($list->id) ?>" class="wppm_checklist_item_label_<?php echo esc_attr($list->id) ?>" placeholder="<?php echo esc_attr__('Add an item','taskbuilder') ?>" name="wppm_checklist_item_label" style="font: 13px 'Helvetica Neue',Helvetica,Arial,sans-serif;">
601 + <input type="button" value="Add" class="btn btn-success btn-sm wppm_add_new_item_btn_<?php echo esc_attr($list->id); ?>" onclick="wppm_add_new_checklist_item(<?php echo esc_attr($list->id)?>,<?php echo esc_attr($task->id)?>,<?php echo esc_attr($proj_id) ?>)">
602 + <input type="hidden" name="wppm_checklist_item_ajax_nonce" id="wppm_checklist_item_ajax_nonce" value="<?php echo esc_attr( wp_create_nonce( 'wppm_add_new_checklist_item' ) ); ?>">
603 + <span onclick="wppm_remove_add_checklist_container(<?php echo esc_attr($list->id) ?>)"><img src="<?php echo esc_url( WPPM_PLUGIN_URL . 'asset/images/cancel.svg'); ?>" alt="delete"></span>
604 + </div>
605 + </div>
606 + </br>
607 + </div>
187 608 </div>
188 - </div>
189 - </br>
190 - </div>
191 - </div>
609 + <?php }?>
192 610 <hr class="wppm_checklist_divider">
611 + </ul>
193 612 <?php
194 613 }
195 614 } ?>
196 - </div>
197 - <div id="wppm_add_checklist_container">
198 - <div class="row">
199 - <div class="col-sm-12">
200 - <span id="wppm_add_checklist" onclick="wppm_add_checklist()"> <?php echo esc_html_e('+Add a checklist','taskbuilder')?> </span>
201 - </div>
202 - </div>
203 - <div class="row" id="wppm_add_new_checklist" style="display:none;">
204 - <div class="col-sm-12">
205 - <input type="text" class="wppm_checklist_label" placeholder="<?php echo esc_attr__('Please insert checklist title','taskbuilder');?>" id="wppm_checklist_label" name="wppm_checklist_label">
206 - <input type="button" value="Add" id="wppm_checklist_btn" class="btn btn-success btn-sm" onclick="wppm_add_new_checklist(<?php echo esc_attr($id)?>,<?php echo esc_attr($proj_id) ?>)">
207 - <span onclick="wppm_remove_add_checklist()"><img src="<?php echo esc_url( WPPM_PLUGIN_URL . 'asset/images/cross1.svg'); ?>"></span>
208 - </div>
209 - </div>
210 - </br>
211 - </div>
615 + </div><?php
616 + if($user_role != 3){
617 + if(($wppmfunction->has_permission('add_checklist',$task->id) || $current_user->has_cap('manage_options')) && $task->is_archived!=1){ ?>
618 + <div id="wppm_add_checklist_container">
619 + <div class="row">
620 + <div class="col-sm-12">
621 + <span id="wppm_add_checklist" onclick="wppm_add_checklist()"> <?php echo esc_html_e('+Add a checklist','taskbuilder')?> </span>
622 + </div>
623 + </div>
624 + <div class="row" id="wppm_add_new_checklist" style="display:none;">
625 + <div class="col-sm-12">
626 + <input type="text" class="wppm_checklist_label" placeholder="<?php echo esc_attr__('Please insert checklist title','taskbuilder');?>" id="wppm_checklist_label" name="wppm_checklist_label">
627 + <input type="button" value="Add" id="wppm_checklist_btn" class="btn btn-success btn-sm" onclick="wppm_add_new_checklist(<?php echo esc_attr($id)?>,<?php echo esc_attr($proj_id) ?>)">
628 + <input type="hidden" name="wppm_checklist_ajax_nonce" id="wppm_checklist_ajax_nonce" value="<?php echo esc_attr( wp_create_nonce( 'wppm_add_new_checklist' ) ); ?>">
629 + <span onclick="wppm_remove_add_checklist()"><img src="<?php echo esc_url( WPPM_PLUGIN_URL . 'asset/images/cross1.svg'); ?>"></span>
630 + </div>
631 + </div>
632 + </br>
633 + </div><?php
634 + }
635 + }?>
212 636 </div>
213 - <div id="wppm_activity_container">
637 + <div id="wppm_activity_container" style="<?php echo ($wppm_task_hide_comment_section==0 || $user_role==3) ? 'display:none;' : 'display:block;' ?>">
214 638 <div class="row">
215 639 <div class="col-sm-12" style="margin-top:5px;">
216 640 <span class="wppm_task_discussion"><?php echo esc_html_e('Comment','taskbuilder')?></span><br>
217 641 </div>
@@ -216,13 +640,13 @@
216 640 <span class="wppm_task_discussion"><?php echo esc_html_e('Comment','taskbuilder')?></span><br>
217 641 </div>
218 642 </div>
219 643 <div class="row">
220 - <div class="col-sm-12">
644 + <div class="col-sm-12" style="<?php echo ($task->is_archived==1) ? 'display:none;' : 'display:block;' ?>">
221 645 <textarea id="wppm_task_comment" placeholder="<?php echo esc_attr__('Write a comment...','taskbuilder');?>" onclick="wppm_add_task_comment()" name="wppm_task_comment"></textarea>
222 646 </div>
223 647 </div>
224 - <div class="row" id="wppm_comment_btn">
648 + <div class="row" id="wppm_comment_btn" style="<?php echo ($task->is_archived==1) ? 'display:none;' : 'display:block;' ?>">
225 649 <div class="col-sm-6">
226 650 <span id="wppm_attach_file" onclick="wppm_upload_file()"><?php echo esc_html_e('Attach Files','taskbuilder')?></span>
227 651 </div>
228 652 <div class="col-sm-6">
@@ -228,27 +652,36 @@
228 652 <div class="col-sm-6">
229 653 <button type="button" id="wppm_individual_cancel_comment_btn" onclick="wppm_cancel_comment();" class="wppm-btn-cancel">
230 654 <?php echo esc_html_e('Cancel','taskbuilder')?>
231 655 </button>
232 - <button type="button" id="wppm_individual_submit_task_comment_btn" onclick="wppm_submit_task_comment(<?php echo esc_attr($id); ?>,<?php echo esc_attr($proj_id); ?>);" class="wppm-btn">
656 + <button type="button" id="wppm_individual_submit_task_comment_btn" style="background-color:<?php echo esc_attr($appearance_settings['comment-send-btn-bg-color'])?>;color:<?php echo esc_attr($appearance_settings['comment-send-btn-color'])?>!important;" onclick="wppm_submit_task_comment(<?php echo esc_attr($id); ?>,<?php echo esc_attr($proj_id); ?>);" class="wppm-btn">
233 657 <?php echo esc_html_e('SEND','taskbuilder')?>
234 658 </button>
659 + <input type="hidden" name="_ajax_nonce" value="<?php echo esc_attr( wp_create_nonce( 'wppm_submit_task_comment' ) ); ?>">
235 660 </div>
236 661 </div>
237 - <div class="row">
662 + <div class="row" style="<?php echo ($task->is_archived==1) ? 'display:none;' : 'display:block;' ?>">
238 663 <div class="wppm_attachment_container col-sm-12" style="display:none;">
239 664 </div>
240 665 </div>
241 666 </div>
242 - <div class="wppm_thread_container">
667 + <div class="wppm_thread_container" style="<?php echo ($wppm_task_hide_comment_section==0 || $user_role==3) ? 'display:none;' : 'display:block;' ?>">
243 668 <?php
244 669 if(!empty($task_comment)){
245 670 foreach($task_comment as $comment){
671 + $task_comment_meta = $wpdb->get_row( $wpdb->prepare(
672 + "SELECT *
673 + FROM {$wpdb->prefix}wppm_task_comment_meta
674 + WHERE task_id = %d
675 + AND comment_id = %d",
676 + absint($id),
677 + absint($comment->id)
678 + )
679 + );
246 680 $user = get_userdata( $comment->created_by );
247 - $comment_body = stripslashes((htmlspecialchars_decode($comment->body, ENT_QUOTES)));
248 - $comment_body = preg_replace('#<script(.*?)>(.*?)</script>#is', '', $comment_body);
249 - $date = date("Y-m-d H:i:s" ,strtotime($comment->create_time));
250 - $thread_date = date("d F Y, h:i:s A" ,strtotime($date));
681 + $comment_body = (!empty($comment->body) ? ($comment->body) : '');
682 + $date = wp_date("Y-m-d H:i:s" ,strtotime($comment->create_time));
683 + $thread_date = wp_date("d F Y, h:i:s A" ,strtotime($date));
251 684 $attachment_ids = isset($comment->attachment_ids)? $comment->attachment_ids : '';
252 685 if($attachment_ids!=""){
253 686 $attachments = explode(",",$attachment_ids);
254 687 } else {
@@ -260,25 +693,133 @@
260 693 <?php echo (get_avatar($comment->created_by, 40));?>
261 694 </div>
262 695 <div class="wppm_thread_body">
263 696 <div class="wppm_thread_user_name">
264 - <strong><?php echo esc_html($user->display_name) ?></strong> <small class="wppm_comment_date"><i><?php echo esc_html($thread_date) ?></i></small>
697 + <strong style="color:<?php echo esc_attr($appearance_settings['comment-primary-color']);?>"><?php echo isset($user->display_name) ? esc_html($user->display_name) : '' ?></strong>
698 + <span><?php if(!empty($comment->body) && (isset($task_comment_meta->comment_type) && $task_comment_meta->comment_type=='change_task_status')){
699 + $comment_log_body = unserialize($comment->body);
700 + $prev_status = $comment_log_body['prev_status'];
701 + $new_status = $comment_log_body['new_status'];
702 + if(isset($prev_status)){
703 + $task_prev_status = $wpdb->get_row( $wpdb->prepare(
704 + "SELECT * FROM {$wpdb->prefix}wppm_task_statuses where id = %d",
705 + absint($prev_status)
706 + ));
707 + }
708 + if(isset($new_status)){
709 + $task_new_status = $wpdb->get_row( $wpdb->prepare(
710 + "SELECT * FROM {$wpdb->prefix}wppm_task_statuses where id = %d",
711 + absint($new_status)
712 + ));
713 + }
714 + printf(
715 + esc_html__( 'Changed status from %1$s to %2$s', 'taskbuilder' ),
716 + esc_html( $task_prev_status->name ),
717 + esc_html( $task_new_status->name )
718 + );
719 + } if(!empty($comment->body) && (isset($task_comment_meta->comment_type) && $task_comment_meta->comment_type=='change_task_creator')){
720 + $comment_log_body = unserialize($comment->body);
721 + $prev_user = $comment_log_body['prev_user'];
722 + $new_user = $comment_log_body['new_user'];
723 + $prev_user_data = get_userdata($prev_user);
724 + $new_user_data = get_userdata($new_user);
725 + printf(
726 + esc_html__( 'Changed creator from %1$s to %2$s', 'taskbuilder' ),
727 + esc_html( $prev_user_data->display_name ),
728 + esc_html( $new_user_data->display_name )
729 + );
730 + }
731 + if( !empty($comment->body) && (isset($task_comment_meta->comment_type) && $task_comment_meta->comment_type=='change_assign_user')){
732 + esc_html_e("changed the Assignee","taskbuilder");
733 + }
734 + if(!empty($comment->body) && (isset($task_comment_meta->comment_type) && $task_comment_meta->comment_type=='change_task_priority')){
735 + $comment_log_body = unserialize($comment->body);
736 + $prev_prio = $comment_log_body['prev_prio'];
737 + $new_prio = $comment_log_body['new_prio'];
738 + if(isset($prev_prio)){
739 + $prev_prio = absint($prev_prio);
740 + $task_prev_prio = $wpdb->get_row( $wpdb->prepare(
741 + "SELECT * FROM {$wpdb->prefix}wppm_task_priorities where id = %d",
742 + $prev_prio
743 + ));
744 + }
745 + if(isset($new_prio)){
746 + $new_prio = absint($new_prio);
747 + $task_new_prio = $wpdb->get_row( $wpdb->prepare(
748 + "SELECT * FROM {$wpdb->prefix}wppm_task_priorities where id = %d",
749 + $new_prio
750 + ));
751 + }
752 + $task_prev_prio_name = !empty($task_prev_prio) ? $task_prev_prio->name: "None";
753 + $task_new_prio_name = !empty($task_new_prio) ? $task_new_prio->name: "None";
754 + printf(
755 + esc_html__( 'Changed priority from %1$s to %2$s', 'taskbuilder' ),
756 + esc_html( $task_prev_prio_name ),
757 + esc_html( $task_new_prio_name )
758 + );
759 + }
760 + ?>
761 + <small class="wppm_comment_date" style="color:<?php echo esc_attr($appearance_settings['comment-date-color']);?>"><i><?php echo isset($thread_date) ? esc_html($thread_date) : '' ?></i></small>
265 762 <div class="wppm_thread_action">
266 - <?php if(( ($current_user->has_cap('manage_options')) || ($wppmfunction->has_comment_permission('edit_task_comment',$id,$comment->id)))){ ?>
763 + <?php if((((($current_user->has_cap('manage_options')) || ($wppmfunction->has_comment_permission('edit_task_comment',$id,$comment->id))) && ((empty($task_comment_meta->comment_type)) || (isset($task_comment_meta->comment_type) && $task_comment_meta->comment_type=='comment')))) && ($task->is_archived!=1)){ ?>
267 764 <span title="Edit this thread" onclick="wppm_edit_thread(<?php echo esc_attr($comment->id)?>,<?php echo esc_attr($id) ?>,<?php echo esc_attr($proj_id) ?>)"><img src="<?php echo esc_url( WPPM_PLUGIN_URL . 'asset/images/edit1.svg'); ?>" alt="edit"></span>
268 765 <span title="Delete this thread" onclick="wppm_delete_thread(<?php echo esc_attr($comment->id) ?>,<?php echo esc_attr($id) ?>,<?php echo esc_attr($proj_id) ?>)"><img src="<?php echo esc_url( WPPM_PLUGIN_URL . 'asset/images/trash.svg'); ?>" alt="delete"></span>
269 766 <?php } ?>
270 767 </div>
271 768 </div>
272 - <div class="wppm_thread_messege">
769 + <div class="wppm_thread_messege" style="color:<?php echo esc_attr($appearance_settings['comment-secondary-color']);?>">
273 770 <?php
274 - $allowedtags = array( 'br' => array(), 'abbr' => array('title' => array(),), 'p' => array(), 'strong' => array(), 'a' => array('href' => array(), 'title' => array(), 'target'=> array(), 'rel'=>array()),'em' =>array(),'span' =>array(), 'blockquote'=>array('cite' => array(),),'div' => array('class' => array(),'title' => array(),'style' => array(),),'ul'=>array(),'li'=>array(),'ol'=>array(),'img' => array( 'alt'=> array(),'class' => array(),'height' => array(),'src'=> array(),'width'=> array(),));
275 - if(!empty($comment_body)){
276 - echo wp_kses(wpautop($comment_body),$allowedtags) ;
771 + $allowedtags = array( 'br' => array(), 'abbr' => array('title' => array(),), 'p' => array(), 'strong' => array(), 'a' => array('href' => array(), 'title' => array(), 'target'=> array(), 'rel'=>array()),'em' =>array(),'span' =>array('class' => true,
772 + 'data-user-id' => true,'data-username' => true,), 'blockquote'=>array('cite' => array(),),'div' => array('class' => array(),'title' => array(),'style' => array(),),'ul'=>array(),'li'=>array(),'ol'=>array(),'img' => array( 'alt'=> array(),'class' => array(),'height' => array(),'src'=> array(),'width'=> array(),));
773 + if(!empty($comment_body) && ((empty($task_comment_meta->comment_type)) || (isset($task_comment_meta->comment_type) && $task_comment_meta->comment_type=='comment') || (isset($task_comment_meta->comment_type) && $task_comment_meta->comment_type=='delete_task_comment'))){
774 + $comment_body = $wppmfunction->wppm_clean_mentions_html($comment_body);
775 + $comment_body = $wppmfunction->wppm_highlight_user_mentions($comment_body, $current_user->ID);
776 + //echo wp_kses(wpautop($comment_body),$allowedtags);
777 + //wp_kses($comment, $allowed_tags);
778 + echo wp_kses_post(($comment_body));
779 + } elseif(!empty($comment->body) && (isset($task_comment_meta->comment_type) && $task_comment_meta->comment_type=='change_task_status')){ ?>
780 + <span class="wppm_admin_label" style="margin-right: 10px; background-color:<?php echo isset($task_prev_status->bg_color) ? esc_attr($task_prev_status->bg_color):""; ?>;color:<?php echo isset($task_prev_status->color) ? esc_attr($task_prev_status->color): "" ?>;"><?php echo isset($task_prev_status->name) ? esc_attr($task_prev_status->name) : "" ?></span> <img src="<?php echo esc_url( WPPM_PLUGIN_URL . 'asset/images/arrow-right.svg'); ?>" alt="arrow_right"> <span class="wppm_admin_label" style="margin-left:10px; background-color:<?php echo isset($task_new_status->bg_color) ? esc_attr($task_new_status->bg_color):""; ?>;color:<?php echo isset($task_new_status->color) ? esc_attr($task_new_status->color): "" ?>;"><?php echo isset($task_new_status->name) ? esc_attr($task_new_status->name) : "" ?></span><?php
781 + }elseif(!empty($comment->body) && (isset($task_comment_meta->comment_type) && $task_comment_meta->comment_type=='change_task_creator')){ ?>
782 + <span style="margin-right: 10px;"><?php echo isset($prev_user_data->display_name) ? esc_attr($prev_user_data->display_name) : "" ?></span> <img src="<?php echo esc_url( WPPM_PLUGIN_URL . 'asset/images/arrow-right.svg'); ?>" alt="arrow_right"> <span style="margin-left:10px;"><?php echo isset($new_user_data->display_name) ? esc_attr($new_user_data->display_name) : "" ?></span><?php
783 + } elseif(!empty($comment->body) && (isset($task_comment_meta->comment_type) && $task_comment_meta->comment_type=='change_assign_user')) {
784 + $comment_log_body = unserialize($comment->body);
785 + $prev_assign_user = $comment_log_body['prev_assign_user'];
786 + $new_assign_user = $comment_log_body['new_assign_user'];
787 + $prev_assign_user_array = array();
788 + $new_assign_user_array = array();
789 + if(!empty($prev_assign_user)){
790 + $prev_assign_user_array = explode(",",$prev_assign_user);
791 + }
792 + if(!empty($new_assign_user)){
793 + $new_assign_user_array = explode(",",$new_assign_user);
794 + }
795 + $assign_user_name = array();
796 + $assign_user_name_str = "";
797 + if(!empty($prev_assign_user_array)){
798 + foreach($prev_assign_user_array as $val){
799 + $assign_user = get_userdata($val);
800 + $assign_user_name[] = $assign_user->display_name;
801 + }
802 + $assign_user_name_str = implode(",",$assign_user_name);
803 + }
804 + $new_assign_user_name = array();
805 + $new_assign_user_name_str = "";
806 + if(!empty($new_assign_user_array)){
807 + foreach($new_assign_user_array as $val){
808 + $new_assign_user = get_userdata($val);
809 + $new_assign_user_name[] = $new_assign_user->display_name;
810 + }
811 + $new_assign_user_name_str = implode(",",$new_assign_user_name);
812 + }
813 + ?>
814 + <span style="margin-right: 10px;"><?php echo !empty($assign_user_name) ? esc_attr( $assign_user_name_str) : "None" ?></span> <img src="<?php echo esc_url( WPPM_PLUGIN_URL . 'asset/images/arrow-right.svg'); ?>" alt="arrow_right"> <span style="margin-left:10px;"><?php echo !empty($new_assign_user_name_str) ? esc_attr($new_assign_user_name_str) : "None" ?></span><?php
815 + } elseif(!empty($comment->body) && (isset($task_comment_meta->comment_type) && $task_comment_meta->comment_type=='change_task_priority')){ ?>
816 + <span class="wppm_admin_label" style="margin-right: 10px; background-color:<?php echo isset($task_prev_prio->bg_color) ? esc_attr($task_prev_prio->bg_color):""; ?>;color:<?php echo isset($task_prev_prio->color) ? esc_attr($task_prev_prio->color): "" ?>;"><?php echo !empty($task_prev_prio->name) ? esc_attr($task_prev_prio->name) : "None" ?></span> <img src="<?php echo esc_url( WPPM_PLUGIN_URL . 'asset/images/arrow-right.svg'); ?>" alt="arrow_right"> <span class="wppm_admin_label" style="margin-left:10px; background-color:<?php echo isset($task_new_prio->bg_color) ? esc_attr($task_new_prio->bg_color):""; ?>;color:<?php echo isset($task_new_prio->color) ? esc_attr($task_new_prio->color): "" ?>;"><?php echo !empty($task_new_prio->name) ? esc_attr($task_new_prio->name) : "None" ?></span><?php
277 817 } ?>
818 +
278 819 </div>
279 820 <?php
280 - if(!empty($attachments)):?> <br>
821 + if(!empty($attachments)&& (isset($task_comment_meta->comment_type) && !($task_comment_meta->comment_type=='delete_task_comment'))):?> <br>
281 822 <strong class="wppm_attachment_title"><?php echo esc_html_e('Attachments','taskbuilder');?>:</strong><br>
282 823 <table class="wppm_attachment_tbl">
283 824 <tbody>
284 825 <?php
@@ -283,10 +824,14 @@
283 824 <tbody>
284 825 <?php
285 826 if(!empty($attachments)){
286 827 foreach( $attachments as $attachment ):
287 - $attach = $wpdb->get_row( "SELECT * FROM {$wpdb->prefix}wppm_attachments where id=".$attachment);
288 828 $download_url = site_url('/').'?wppm_attachment='.$attachment.'&tid='.$id.'&tac='.$auth_id;
829 + $attachment = absint($attachment);
830 + if (empty($attachment)) {
831 + continue; // or return, depending on the context
832 + }
833 + $attach = $wpdb->get_row( $wpdb->prepare("SELECT * FROM {$wpdb->prefix}wppm_attachments where id=%d",$attachment));
289 834 $findStr = ".txt";
290 835 if(!empty( $attach)){
291 836 $attachment_name = preg_replace('/' . $findStr . '/', "", $attach->name, 1);
292 837 $attachment_name = sanitize_file_name($attachment_name);
@@ -296,13 +841,14 @@
296 841 <tr class="wppm_attachment_tr">
297 842 <td>
298 843 <a class="wppm_attachment_link" href="<?php echo esc_url($download_url) ?>" target="_blank">
299 844 <span class="wppm_attachment_file_name" style="padding: 7px;"><?php echo isset($attach->file_name) ? esc_html($attach->file_name):"";?></span></a>
300 - <?php if((($comment->created_by == $current_user->ID) || ($current_user->has_cap('manage_options')) || ($wppmfunction->has_comment_permission('edit_task_comment',$id,$comment->id)))){ ?>
301 - <span class="wppm_thread_action_btn" onclick="wppm_thread_attachment_remove(this,<?php echo esc_attr($attach->id); ?>,<?php echo esc_attr($comment->id); ?>,<?php echo esc_attr($id); ?>,<?php echo esc_attr($proj_id);?>)"><img src="<?php echo esc_url( WPPM_PLUGIN_URL . 'asset/images/cancel.svg'); ?>" alt="cancel"></span>
845 + <?php if((($comment->created_by == $current_user->ID) || ($current_user->has_cap('manage_options')) || ($wppmfunction->has_comment_permission('edit_task_comment',$id,$comment->id))) && ($task->is_archived!=1)){ ?>
846 + <span class="wppm_thread_action_btn" onclick="wppm_thread_attachment_remove(this,<?php echo !empty($attach->id) ? esc_attr($attach->id) : 0; ?>,<?php echo !empty($comment->id) ? esc_attr($comment->id) : 0; ?>,<?php echo !empty($id) ? esc_attr($id) : 0; ?>,<?php echo !empty($proj_id) ? esc_attr($proj_id) : 0;?>)"><img src="<?php echo esc_url( WPPM_PLUGIN_URL . 'asset/images/cancel.svg'); ?>" alt="cancel"></span>
302 847 <?php } ?>
303 848 </td>
304 849 </tr>
850 + <input type="hidden" name="wppm_ajax_nonce" id="wppm_ajax_nonce" value="<?php echo esc_attr( wp_create_nonce( 'wppm_remove_thread_attachment' ) ); ?>">
305 851 <?php }
306 852 endforeach;
307 853 } ?>
308 854 </tbody>
@@ -316,70 +862,160 @@
316 862 </div>
317 863 </div>
318 864 <div class="wppm_individual_task_widget col-sm-4 wppm_sidebar col-md-3">
319 865 <div class="row wppm_widget" id="wppm_status_widget">
320 - <h4 class="widget_header"><?php echo esc_html_e('Status','taskbuilder')?>
321 - <?php if ($wppmfunction->has_permission('change_status',$id) || $current_user->has_cap('manage_options')) { ?>
322 - <span class="wppm_edit_task_details_widget" onclick="wppm_edit_task_status(<?php echo esc_attr($id) ?>,<?php echo esc_attr($proj_id) ?>)"><img src="<?php echo esc_url( WPPM_PLUGIN_URL . 'asset/images/edit_01.svg'); ?>" alt="edit"></span></h4>
323 - <?php } ?>
866 + <div class="wppm-widget-header" style="background-color:<?php echo esc_attr($appearance_settings['widget-header-bg-color'])?>">
867 + <h4 class="widget_header" style="color:<?php echo esc_attr($appearance_settings['widget-header-text-color'])?>"><?php echo esc_html_e('Status','taskbuilder')?></h4>
868 + <?php
869 + if($user_role != 3){
870 + if((($current_user->has_cap('manage_options') || $wppm_current_user_capability == ('wppm_admin') || ($flag==true) || ($wppmfunction->has_permission('change_task_status',$id))!="") && ($task->is_archived!=1))){
871 + ?>
872 + <span class="wppm_edit_task_details_widget" onclick="wppm_edit_task_status(<?php echo esc_attr($id) ?>,<?php echo esc_attr($proj_id) ?>,<?php echo esc_attr($project_id) ?>)"><img src="<?php echo esc_url( WPPM_PLUGIN_URL . 'asset/images/edit_01.svg'); ?>" alt="edit"></span>
873 + <?php
874 + }
875 + }
876 + ?>
877 + </div>
324 878 <hr class="widget_divider">
325 - <div class="wppm_sidebar_labels"><span class="wppm_label_info"><?php echo esc_html_e('Status','taskbuilder')?>:</span> <span class="wppm_admin_label" style="background-color:<?php echo (isset($task_status->bg_color))? esc_attr($task_status->bg_color):""?>;color:<?php echo (isset($task_status->color))? esc_attr($task_status->color):""?>;"><?php echo (isset($task_status->name))? esc_attr($task_status->name):"" ?> </span></div>
879 + <div class="wppm-widget-body" style="background-color:<?php echo esc_attr($appearance_settings['widget-body-bg-color'])?>">
880 + <div class="wppm_sidebar_labels"><span class="wppm_label_info" style="color:<?php echo esc_attr($appearance_settings['widget-body-label-color'])?>"><?php echo esc_html_e('Status','taskbuilder')?>:</span> <span class="wppm_admin_label" style="background-color:<?php echo (isset($task_status->bg_color))? esc_attr($task_status->bg_color):""?>;color:<?php echo (isset($task_status->color))? esc_attr($task_status->color):""?>;"><?php echo (isset($task_status->name))? esc_attr($task_status->name):"" ?> </span></div>
881 + </div>
326 882 </div>
327 883 <div class="row wppm_widget" id="wppm_raisedby_widget">
328 - <h4 class="widget_header">
329 - <?php echo esc_html_e('Task Creator','taskbuilder')?>
330 - <?php if ($wppmfunction->has_permission('change_raised_by',$id ) || $current_user->has_cap('manage_options')) { ?>
331 - <span class="wppm_edit_task_details_widget" onclick="wppm_edit_task_creator(<?php echo esc_attr($id) ?>,<?php echo esc_attr($proj_id) ?>)"><img src="<?php echo esc_url( WPPM_PLUGIN_URL . 'asset/images/edit_01.svg'); ?>" alt="edit"></span></h4>
332 - <?php } ?>
884 + <div class="wppm-widget-header" style="background-color:<?php echo esc_attr($appearance_settings['widget-header-bg-color'])?>">
885 + <h4 class="widget_header" style="color:<?php echo esc_attr($appearance_settings['widget-header-text-color'])?>">
886 + <?php echo esc_html_e('Task Creator','taskbuilder')?></h4>
887 + <?php if($user_role != 3){
888 + if ((($wppmfunction->has_permission('change_raised_by',$id ) || $current_user->has_cap('manage_options')) && ($task->is_archived!=1))) { ?>
889 + <span class="wppm_edit_task_details_widget" onclick="wppm_edit_task_creator(<?php echo esc_attr($id) ?>,<?php echo esc_attr($proj_id) ?>,<?php echo esc_attr($project_id) ?>)"><img src="<?php echo esc_url( WPPM_PLUGIN_URL . 'asset/images/edit_01.svg'); ?>" alt="edit"></span>
890 + <?php }
891 + }?>
892 + </div>
333 893 <hr class="widget_divider"> <?php
334 - $user_info = get_userdata($task->created_by);
894 + if(isset($task->created_by)){
895 + $user_info = get_userdata($task->created_by);
896 + }else{
897 + $user_info ="";
898 + }
335 899 ?>
336 - <div style="padding:2px 0;">
337 - <span class="wppm_task_user_avatar"><?php echo (get_avatar($task->created_by, 25, "mysteryman")); ?></span>
338 - <span class="wppm_task_user_names"><?php echo esc_html($user_info->display_name); ?></span>
900 + <div class="wppm-widget-body" style="background-color:<?php echo esc_attr($appearance_settings['widget-body-bg-color'])?>">
901 + <div style="padding:2px 0;">
902 + <span class="wppm_task_user_avatar"><?php echo (get_avatar($task->created_by, 25, "mysteryman")); ?></span>
903 + <span class="wppm_task_user_names" style="color:<?php echo esc_attr($appearance_settings['widget-body-text-color'])?>;"><?php echo isset($user_info->display_name)?esc_html($user_info->display_name):""; ?></span>
904 + </div>
339 905 </div>
340 906 </div>
341 907 <div class="row wppm_widget" id="wppm_task_users_widget_container">
342 - <h4 class="widget_header">
343 - <?php if ($wppmfunction->has_permission('assign_task_users',$id ) || $current_user->has_cap('manage_options')) { ?>
344 - <span class="wppm_edit_task_details_widget" onclick="wppm_edit_task_users(<?php echo esc_attr($id) ?>,<?php echo esc_attr($proj_id) ?>)"><img src="<?php echo esc_url( WPPM_PLUGIN_URL . 'asset/images/edit_01.svg'); ?>" alt="edit"></span>
345 - <?php } ?>
346 - <span><?php echo esc_html_e('Users','taskbuilder')?></span></h4>
908 + <div class="wppm-widget-header" style="background-color:<?php echo esc_attr($appearance_settings['widget-header-bg-color'])?>">
909 + <h4 class="widget_header" style="color:<?php echo esc_attr($appearance_settings['widget-header-text-color'])?>;"><?php echo esc_html_e('Users','taskbuilder')?></h4>
910 + <?php
911 + if($user_role != 3){
912 + if ((($wppmfunction->has_permission('assign_task_users',$id ) || $current_user->has_cap('manage_options')) && ($task->is_archived!=1))) { ?>
913 + <span class="wppm_edit_task_details_widget" onclick="wppm_edit_task_users(<?php echo esc_attr($id) ?>,<?php echo esc_attr($proj_id) ?>,<?php echo esc_attr($project_id) ?>)"><img src="<?php echo esc_url( WPPM_PLUGIN_URL . 'asset/images/edit_01.svg'); ?>" alt="edit"></span>
914 + <?php }
915 + }?>
916 + </div>
347 917 <hr class="widget_divider">
348 - <div id="wppm_task_users">
349 - <?php
350 - $i=0;
351 - if(!empty($users)){
352 - foreach($users as $user) {
353 - $user_data = get_userdata($user);
354 - if(!empty($project_data['users'])){
355 - $proj_users = explode(',',$project_data['users']);
356 - if(in_array($user,$proj_users)){
357 - $i++;
358 - ?>
359 - <div style="padding:2px 0;">
360 - <span class="wppm_task_user_avatar"><?php echo (get_avatar($user, 25, "mysteryman")); ?></span>
361 - <span class="wppm_task_user_names"><?php echo ((!empty($user_data))? esc_html($user_data->display_name) :"") ?></span>
362 - </div>
363 - <?php
918 + <div class="wppm-widget-body" style="background-color:<?php echo esc_attr($appearance_settings['widget-body-bg-color'])?>">
919 + <div id="wppm_task_users">
920 + <?php
921 + $i=0;
922 + if(!empty($users)){
923 + foreach($users as $user) {
924 + $user_data = get_userdata($user);
925 + if(!empty($project_data['users'])){
926 + $proj_users = explode(',',$project_data['users']);
927 + if(in_array($user,$proj_users)){
928 + $i++;
929 + ?>
930 + <div style="padding:2px 0;">
931 + <span class="wppm_task_user_avatar"><?php echo (get_avatar($user, 25, "mysteryman")); ?></span>
932 + <span class="wppm_task_user_names" style="color:<?php echo esc_attr($appearance_settings['widget-body-text-color'])?>;"><?php echo ((!empty($user_data))? esc_html($user_data->display_name) :"") ?></span>
933 + </div>
934 + <?php
935 + }
364 936 }
365 937 }
366 938 }
367 - }
368 - if($i==0){ ?>
369 - <span class="wppm_display_user_none"><?php echo esc_html_e('None','taskbuilder'); ?></span> <?php
370 - }
371 - ?>
939 + if($i==0){ ?>
940 + <span class="wppm_display_user_none" style="color:<?php echo esc_attr($appearance_settings['widget-body-text-color'])?>"><?php echo esc_html_e('None','taskbuilder'); ?></span> <?php
941 + }
942 + ?>
943 + </div>
372 944 </div>
373 945 </div>
374 - <?php do_action('wppm_after_task_widgets',$id,$proj_id);?>
946 + <?php do_action('wppm_after_task_widgets',$id,$task_id );?>
375 947 </div>
376 - <input type="hidden" id="wppm_nonce" value="<?php echo wp_create_nonce()?>">
948 + <input type="hidden" id="wppm_nonce" value="<?php echo esc_attr(wp_create_nonce('wppm_upload_file'))?>">
377 949 <input type="file" id="wppm_attachment_upload" class="hidden" onchange="">
378 950 </div>
379 951 </form>
952 +<style>
953 + .wppm_comment_date i:hover{
954 + color: <?php echo esc_attr($appearance_settings['comment-date-hover-color'])?>;
955 + }
956 + #Layer_1{
957 + fill:red!important;
958 + }
959 +</style>
380 960 <script>
381 961 jQuery( document ).ready( function( jQuery ) {
962 + const button = document.getElementById('wppm_print_task_btn');
963 + const box = document.getElementById('wppmprint_menu');
964 +
965 + // Show box on button click
966 + button.addEventListener('click', (e) => {
967 + e.stopPropagation(); // prevent document click from firing immediately
968 + box.style.display = 'flex';
969 + });
970 +
971 + // Prevent hiding when clicking inside box
972 + box.addEventListener('click', (e) => {
973 + e.stopPropagation();
974 + });
975 +
976 + // Hide when clicking outside
977 + document.addEventListener('click', () => {
978 + box.style.display = 'none';
979 + });
980 + jQuery('#wppm_task_comment').on('focus', function(){
981 + // showMentionList('');
982 + });
983 +<?php
984 + if ((($current_user->ID && $current_user->has_cap('manage_options')) || $wppmfunction->has_permission('change_task_details',$task->id))){ ?>
985 + jQuery("#wppm_edit_tstart_date").flatpickr({
986 + enableTime: true,
987 + dateFormat: "Y-m-d H:i",
988 + onChange: function(selectedDates, dateStr, instance) {
989 + var data = {
990 + action: 'wppm_set_change_task_start_date',
991 + task_id:<?php echo esc_attr($task->id);?>,
992 + date:dateStr,
993 + _ajax_nonce:jQuery('#wppm_edit_tstart_date_ajax_nonce').val()
994 + };
995 + jQuery.post(wppm_admin.ajax_url, data, function(response) {
996 + instance.close();
997 + wppm_open_task(<?php echo esc_attr($task->id);?>);
998 + });
999 + },
1000 + });
1001 + jQuery("#wppm_edit_tend_date").flatpickr({
1002 + enableTime: true,
1003 + dateFormat: "Y-m-d H:i",
1004 + onChange: function(selectedDates, dateStr, instance) {
1005 + var data = {
1006 + action: 'wppm_set_change_task_end_date',
1007 + task_id:<?php echo esc_attr($task->id);?>,
1008 + date:dateStr,
1009 + _ajax_nonce:jQuery('#wppm_edit_tend_date_ajax_nonce').val()
1010 + };
1011 + jQuery.post(wppm_admin.ajax_url, data, function(response) {
1012 + instance.close();
1013 + wppm_open_task(<?php echo esc_attr($task->id);?>);
1014 + });
1015 + },
1016 + });
1017 + <?php } ?>
382 1018 <?php foreach ($wppm_checklist as $chklist) { ?>
383 1019 var $checkboxes = jQuery('.wppm_checklist_item_'+<?php echo esc_attr($chklist->id);?>);
384 1020 var $progress = jQuery('#CheckProgress_'+<?php echo esc_attr($chklist->id);?>);
385 1021 var total = $checkboxes.length;
@@ -389,9 +1025,9 @@
389 1025 jQuery('#CheckProgress_'+<?php echo esc_attr($chklist->id);?>).css('width', progressWidth + '%');
390 1026 if(progressWidth>0){
391 1027 jQuery('#wppm_progressbar_label_'+<?php echo esc_attr($chklist->id);?>).text(progressWidth+'%');
392 1028 }
393 - <?php $wppm_checklist_items = $wpdb->get_results( "SELECT * FROM {$wpdb->prefix}wppm_checklist_items where checklist_id=".$chklist->id);
1029 + <?php $wppm_checklist_items = $wpdb->get_results( $wpdb->prepare("SELECT * FROM {$wpdb->prefix}wppm_checklist_items where checklist_id=%d",$chklist->id));
394 1030 foreach ($wppm_checklist_items as $chkitems) {
395 1031 ?> jQuery( '#wppm_checklist_'+<?php echo esc_attr($chkitems->id);?>).on("mouseover", function () {
396 1032 jQuery( '#wppm_checklist_action_'+<?php echo esc_attr($chkitems->id);?>).css("display","inline");
397 1033 jQuery( '#wppm_checklist_'+<?php echo esc_attr($chkitems->id);?>).css("background-color","#e7e8ea");
@@ -402,37 +1038,188 @@
402 1038 })
403 1039 <?php
404 1040 }
405 1041 }
1042 + $bold = (isset($wppm_toolbar_actions['bold']) && $wppm_toolbar_actions['bold']==1)? 'bold' :"";
1043 + $italic = (isset($wppm_toolbar_actions['italic']) && $wppm_toolbar_actions['italic']==1)? 'italic' :"";
1044 + $underline = (isset($wppm_toolbar_actions['underline']) && $wppm_toolbar_actions['underline']==1)?'underline' :"";
1045 + $blockquote = (isset($wppm_toolbar_actions['blockquote']) && $wppm_toolbar_actions['blockquote']==1)? 'blockquote' :"";
1046 + $align = (isset($wppm_toolbar_actions['align']) && $wppm_toolbar_actions['align']==1)? ' alignleft aligncenter alignright ' :"";
1047 + $bullist = (isset($wppm_toolbar_actions['bullist']) && $wppm_toolbar_actions['bullist']==1)? 'bullist' :"";
1048 + $numlist = (isset($wppm_toolbar_actions['numlist']) && $wppm_toolbar_actions['numlist']==1)? 'numlist' :"";
1049 + $rtl = (isset($wppm_toolbar_actions['rtl']) && $wppm_toolbar_actions['rtl']==1)? 'rtl' :"";
1050 + $link = (isset($wppm_toolbar_actions['link']) && $wppm_toolbar_actions['link']==1)? 'link' :"";
1051 + $image = (isset($wppm_toolbar_actions['wppm_insert_editor_img']) && $wppm_toolbar_actions['wppm_insert_editor_img']==1)? 'image' :"";
1052 + $forecolor = (isset($wppm_toolbar_actions['forecolor']) && $wppm_toolbar_actions['forecolor']==1)? 'forecolor' :"";
1053 + $backcolor = (isset($wppm_toolbar_actions['backcolor']) && $wppm_toolbar_actions['backcolor']==1)? 'backcolor' :"";
1054 + $strikethrough = (isset($wppm_toolbar_actions['strikethrough']) && $wppm_toolbar_actions['strikethrough']==1)? 'strikethrough' :"";
1055 + $toolbar = trim("$bold $italic $underline $blockquote | $align | $bullist $numlist | $rtl | $link $image | $forecolor $backcolor $strikethrough");
1056 + if(($wppm_tinymce_visibility_open_task==1)){ ?>
1057 + if((wppm_admin.rich_text_editor) && (wppm_admin.rich_text_editor.trim().length > 0) && (wppm_admin.rich_text_editor == 1)){
1058 + getMentionDropdown(editor);
1059 + tinymce.remove();
1060 + tinymce.init({
1061 + selector:'#wppm_task_comment',
1062 + body_id: 'wppm_task_comment',
1063 + menubar: false,
1064 + statusbar: false,
1065 + height : '200',
1066 + width : '100%',
1067 + plugins: ['lists link image directionality paste textcolor'],
1068 + valid_elements: '*[*]',
1069 + extended_valid_elements: 'span[class|data-username|data-user-id|,p,br,strong,em,a[href|target]contenteditable]',
1070 + toolbar:'<?php echo esc_js($toolbar); ?>',
1071 + content_style: `
1072 + .wppm-mention{
1073 + display:inline-block;
1074 + background:linear-gradient(135deg,#eef2ff,#e0e7ff);
1075 + color:#5b21b6;
1076 + padding:2px 8px;
1077 + border-radius:16px;
1078 + font-weight:600;
1079 + border:1px solid #c7d2fe;
1080 + }
1081 +
1082 + .wppm-mention-me{
1083 + background:linear-gradient(135deg,#fef3c7,#fde68a);
1084 + color:#92400e;
1085 + border:1px solid #fbbf24;
1086 + font-weight:700;
1087 + }
1088 + `
1089 + setup: function (editor) {
1090 + wppmmenwppmMentionSetup(editor)
1091 +
1092 + } // ✅ only ONE setup
1093 + });
1094 + jQuery('#wppm_comment_btn').show();
1095 + }
1096 + <?php } ?>
1097 + });
1098 +
1099 +jQuery(function(jQuery){
1100 + // Checklist Sorting
1101 + jQuery(".wppm_checklist_items_container").sortable({
1102 + handle: ".wppm_chk_items_drag",
1103 + update: function() {
1104 + let order = [];
1105 + jQuery(this).find("li").each(function(){
1106 + order.push(jQuery(this).data("id")); // checklist item id
1107 + });
1108 +
1109 + // AJAX Save
1110 + jQuery.post(wppm_admin.ajax_url, {
1111 + action: "wppm_update_checklist_order",
1112 + order: order,
1113 + task_id: <?php echo esc_attr($id); ?>,
1114 + _ajax_nonce: '<?php echo esc_attr( wp_create_nonce( 'wppm_update_checklist_order' ) ); ?>'
1115 + }, function(response_str){
1116 + var response = JSON.parse(response_str);
1117 + jQuery('.wppm_submit_wait').hide();
1118 + if (response.sucess_status=='1') {
1119 + jQuery('#wppm_alert_success .wppm_alert_text').text(response.messege);
1120 + }
1121 + jQuery('#wppm_alert_success').slideDown('fast',function(){});
1122 + setTimeout(function(){ jQuery('#wppm_alert_success').slideUp('fast',function(){}); }, 3000);
1123 + });
1124 + }
1125 + });
1126 +
1127 +});
1128 +
1129 +function wppm_cancel_comment(){ <?php
1130 + if(!empty($wppm_rich_text_editor) && ($wppm_rich_text_editor == 1)){
406 1131 ?>
407 -});
1132 + tinyMCE. activeEditor. setContent('');
1133 + tinymce.remove('#wppm_task_comment');
1134 + jQuery('#wppm_comment_btn').hide();
1135 + <?php } else{
1136 + ?>
1137 + jQuery('#wppm_task_comment').css("width", "80%");
1138 + jQuery('#wppm_task_comment').css("height", "30px");
1139 + jQuery('#wppm_task_comment').css("color", "#000");
1140 + jQuery('#wppm_task_comment').css("padding", "5px");
1141 + jQuery('#wppm_task_comment').css(" margin-bottom", "15px");
1142 + jQuery('#wppm_task_comment').css("overflow", "hidden");
1143 + jQuery('#wppm_task_comment').css("border", "1 px solid #eee");
1144 + jQuery('#wppm_task_comment').css("color", "#eee");
1145 + jQuery('#wppm_task_comment').css("margin-top", "10px");
1146 + jQuery('#wppm_comment_btn').hide();
1147 + <?php }?>
1148 +}
408 1149
409 1150 function wppm_add_task_comment(){
410 - tinymce.remove();
411 - tinymce.init({
412 - selector:'#wppm_task_comment',
413 - body_id: 'wppm_task_comment',
414 - directionality : '<?php //echo 'rtl'; ?>',
415 - menubar: false,
416 - statusbar: false,
417 - height : '200',
418 - width : '100%',
419 - plugins: [
420 - 'lists link image directionality paste'
421 - ],
422 - image_advtab: true,
423 - toolbar: 'bold italic underline blockquote | alignleft aligncenter alignright | bullist numlist | rtl | link image',
424 - branding: false,
425 - autoresize_bottom_margin: 20,
426 - browser_spellcheck : true,
427 - relative_urls : false,
428 - remove_script_host : false,
429 - convert_urls : true,
430 - paste_as_text: true,
431 - setup: function (editor) {
1151 + if((wppm_admin.rich_text_editor == 1)){
1152 + tinymce.remove();
1153 + tinymce.init({
1154 + selector:'#wppm_task_comment',
1155 + body_id: 'wppm_task_comment',
1156 + directionality : '<?php //echo 'rtl'; ?>',
1157 + menubar: false,
1158 + statusbar: false,
1159 + height : '200',
1160 + width : '100%',
1161 + plugins: [
1162 + 'lists link image directionality paste textcolor'
1163 + ],
1164 + image_advtab: true,
1165 + toolbar:'<?php echo esc_js( $toolbar ); ?>',
1166 + branding: false,
1167 + autoresize_bottom_margin: 20,
1168 + browser_spellcheck : true,
1169 + relative_urls : false,
1170 + remove_script_host : false,
1171 + convert_urls : true,
1172 + paste_as_text: true,
1173 + setup: function (editor) {
1174 + wppmMentionSetup(editor);
1175 + }
1176 + });
1177 + } else{
1178 + jQuery('#wppm_task_comment').css("width", "100%");
1179 + jQuery('#wppm_task_comment').css("height", "160px");
1180 + jQuery('#wppm_task_comment').css("color", "#000");
1181 + }
1182 + jQuery('#wppm_comment_btn').show();
1183 +}
1184 +
1185 +function wppm_submit_task_comment(id, proj_id){
1186 + jQuery('#wppm_mention_list').remove();
1187 + var dataform = new FormData(jQuery('#wppm_open_task')[0]);
1188 + dataform.append('action','wppm_submit_task_comment');
1189 + let comment_body;
1190 + if(wppm_admin.rich_text_editor == 1){
1191 + const editor = tinyMCE.get('wppm_task_comment');
1192 + // Remove dropdown from TinyMCE iframe
1193 + const dropdown = editor.getDoc().getElementById('wppm_mention_list');
1194 + if (dropdown) {
1195 + dropdown.remove();
432 1196 }
1197 + comment_body = editor.getContent().trim();
1198 + //comment_body = tinyMCE.get('wppm_task_comment').getContent().trim();
1199 + // remove mention dropdown if accidentally inserted
1200 + //comment_body = comment_body.replace(/<div[^>]*id="wppm_mention_list"[^>]*>.*?<\/div>/gi, '');
1201 + comment_body = comment_body.replace( /<div class="mention-item"[\s\S]*?<\/div>/g, '');
1202 + } else {
1203 + comment_body = jQuery("#wppm_task_comment").val();
1204 + }
1205 + dataform.append('comment_body', comment_body);
1206 + dataform.append('task_id', id);
1207 + jQuery('#wppm_task_container').html(wppm_admin.loading_html);
1208 + jQuery.ajax({
1209 + url: wppm_admin.ajax_url,
1210 + type: 'POST',
1211 + data: dataform,
1212 + processData: false,
1213 + contentType: false
1214 + })
1215 + .done(function () {
1216 + if (proj_id != 0 && proj_id != "") {
1217 + wppm_open_project_tasks(id, proj_id);
1218 + } else {
1219 + wppm_open_task(id);
1220 + }
433 1221 });
434 - jQuery('#wppm_comment_btn').show();
435 1222 }
436 1223
437 1224 function wppm_add_checklist_item(checklist_id){
438 1225 jQuery('#wppm_add_checklist_label_container_'+checklist_id).show();
@@ -468,9 +1255,10 @@
468 1255 var file_extension = file_name_split[file_name_split.length-1];
469 1256 file_extension = file_extension.toLowerCase();
470 1257 if( (jQuery.inArray(file_extension,allowedExtension) > -1)){
471 1258 flag = true;
472 - alert("<?php _e('Attached file type not allowed!','taskbuilder')?>");
1259 + alert("<?php echo esc_js(__( 'Attached file type not allowed!', 'taskbuilder' ) ); ?>");
1260 +
473 1261 };
474 1262 <?php
475 1263 $max_upload = (int)(ini_get('upload_max_filesize')); ?>
476 1264 var current_filesize=file.size/1000000;
@@ -475,9 +1263,9 @@
475 1263 $max_upload = (int)(ini_get('upload_max_filesize')); ?>
476 1264 var current_filesize=file.size/1000000;
477 1265 if(current_filesize > <?php echo esc_attr($max_upload); ?>){
478 1266 flag = true;
479 - alert("<?php _e('File size exceed allowed limit!','taskbuilder')?>");
1267 + alert("<?php echo esc_js(__('File size exceed allowed limit!','taskbuilder')); ?>");
480 1268 }
481 1269 if (!flag){
482 1270 var html_str = '<div class="wppm_attachment">'+
483 1271 '<div class="progress" style="float: none !important; width: unset !important;">'+
@@ -525,5 +1313,226 @@
525 1313 }
526 1314 });
527 1315 jQuery('#wppm_attachment_upload').trigger('click');
528 1316 }
529 -</script>
1317 +
1318 +function wppmMentionSetup(editor) {
1319 + let mentionIndex = -1;
1320 + editor.on('keyup', function (e) {
1321 + editor.lastMentionRange = editor.selection.getRng();
1322 + let rng = editor.selection.getRng();
1323 + let node = rng.startContainer;
1324 +
1325 + if (!node || node.nodeType !== 3) return;
1326 +
1327 + let text = node.textContent;
1328 + let cursorPos = rng.startOffset;
1329 + let textBeforeCursor = text.substring(0, cursorPos);
1330 +
1331 + let match = textBeforeCursor.match(/@(\w*)$/);
1332 + let dropdown = getMentionDropdown(editor);
1333 +
1334 + if (match) {
1335 + let query = match[1];
1336 + let rect = rng.getBoundingClientRect();
1337 + if (!rect || rect.top === 0) {
1338 + rect = editor.selection.getNode().getBoundingClientRect();
1339 + }
1340 + let top = rect.bottom + editor.getWin().scrollY;
1341 + let left = rect.left + editor.getWin().scrollX;
1342 + jQuery.post(wppm_admin.ajax_url, {
1343 + action: 'wppm_filter_autocomplete',
1344 + term: query,
1345 + field : 'task_user_name',
1346 + task_id:<?php echo esc_attr($task_id) ?>,
1347 + proj_id:<?php echo esc_attr($proj_id) ?>
1348 + }, function (res) {
1349 +
1350 + if (typeof res === "string") res = JSON.parse(res);
1351 + if (res.success) res = res.data;
1352 +
1353 + if (!Array.isArray(res)) return;
1354 +
1355 + dropdown.empty();
1356 + if( res.length === 0 ){
1357 + dropdown.hide();
1358 + return;
1359 + }else{
1360 + res.forEach(user => {
1361 + let item = jQuery('<div>')
1362 + .addClass('mention-item')
1363 + .attr('data-username', user.label)
1364 + .attr('data-user-id', user.user_id)
1365 + .text(user.label)
1366 + .css({
1367 + padding: '8px 12px',
1368 + cursor: 'pointer',
1369 + fontSize: '14px',
1370 + color: '#333',
1371 + background: '#fff',
1372 + borderBottom: '1px solid #eee'
1373 + });
1374 +
1375 + item.on('mouseenter', function () {
1376 + jQuery(this).css({
1377 + background: '#0073aa',
1378 + color: '#fff'
1379 + });
1380 + });
1381 + item.on('mouseleave', function () {
1382 + if (!jQuery(this).hasClass('active')) {
1383 + jQuery(this).css({
1384 + background: '#fff',
1385 + color: '#333'
1386 + });
1387 + }
1388 + });
1389 + dropdown.append(item);
1390 + });
1391 + let items = dropdown.find('.mention-item');
1392 + items.removeClass('active').css({
1393 + background: '#fff',
1394 + color: '#333'
1395 + });
1396 + items.eq(0)
1397 + .addClass('active')
1398 + .css({
1399 + background: '#0073aa',
1400 + color: '#fff'
1401 + });
1402 + mentionIndex = 0;
1403 + updateActiveItem(items.eq(0), mentionIndex);
1404 + dropdown.css({
1405 + position: 'absolute',
1406 + display: 'none',
1407 + background: '#fff',
1408 + border: '1px solid #ddd',
1409 + borderRadius: '6px',
1410 + padding: '5px 0',
1411 + minWidth: '180px',
1412 + maxHeight: '220px',
1413 + overflowY: 'auto',
1414 + boxShadow: '0 4px 10px rgba(0,0,0,.15)',
1415 + zIndex: 999999999999999
1416 + }).show();
1417 + }
1418 + });
1419 + } else {
1420 + dropdown.hide();
1421 + }
1422 + });
1423 + editor.on('keydown', function (e) {
1424 + let dropdown = getMentionDropdown(editor);
1425 + let items = dropdown.find('.mention-item');
1426 +
1427 + if (!dropdown.is(':visible') || !items.length) return;
1428 +
1429 + // DOWN
1430 + if (e.key === 'ArrowDown') {
1431 + e.preventDefault();
1432 + mentionIndex++;
1433 +
1434 + if (mentionIndex >= items.length) {
1435 + mentionIndex = 0;
1436 + }
1437 + updateActiveItem(items, mentionIndex);
1438 + items.removeClass('active').css({
1439 + background: '#fff',
1440 + color: '#333'
1441 + });
1442 +
1443 + items.eq(mentionIndex)
1444 + .addClass('active')
1445 + .css({
1446 + background: '#0073aa',
1447 + color: '#fff'
1448 + });
1449 + }
1450 +
1451 + // UP
1452 + if (e.key === 'ArrowUp') {
1453 + e.preventDefault();
1454 + mentionIndex--;
1455 + if (mentionIndex < 0) {
1456 + mentionIndex = items.length - 1;
1457 + }
1458 + updateActiveItem(items, mentionIndex);
1459 + items.removeClass('active').css({
1460 + background: '#fff',
1461 + color: '#333'
1462 + });
1463 +
1464 + items.eq(mentionIndex)
1465 + .addClass('active')
1466 + .css({
1467 + background: '#0073aa',
1468 + color: '#fff'
1469 + });
1470 + }
1471 + // ENTER
1472 + if (e.key === 'Enter') {
1473 + if (mentionIndex >= 0) {
1474 + e.preventDefault();
1475 + items.eq(mentionIndex).trigger('click');
1476 + }
1477 + }
1478 + // ESC
1479 + if (e.key === 'Escape') {
1480 + dropdown.hide();
1481 + mentionIndex = -1;
1482 + }
1483 + });
1484 + editor.on('click', function (e) {
1485 + let target = jQuery(e.target);
1486 + if (target.hasClass('mention-item')) {
1487 + let username = target.data('username');
1488 + let userId = target.data('user-id');
1489 +
1490 + editor.focus();
1491 +
1492 + let rng = editor.lastMentionRange || editor.selection.getRng();
1493 + editor.selection.setRng(rng);
1494 +
1495 + let node = rng.startContainer;
1496 + if (!node || node.nodeType !== 3) return;
1497 +
1498 + let text = node.textContent;
1499 + let cursorPos = rng.startOffset;
1500 +
1501 + let lastAtIndex = text.substring(0, cursorPos).lastIndexOf('@');
1502 +
1503 + if (lastAtIndex !== -1) {
1504 +
1505 + let range = editor.selection.getRng();
1506 + range.setStart(node, lastAtIndex);
1507 + range.setEnd(node, cursorPos);
1508 +
1509 + editor.selection.setRng(range);
1510 +
1511 + editor.selection.setContent(
1512 + '<span class="wppm-mention" contenteditable="false" data-username="' + username + '" data-user-id="' + userId + '">@' + username + '</span>&nbsp;'
1513 + );
1514 + }
1515 + getMentionDropdown(editor).hide();
1516 + }
1517 + });
1518 +
1519 + editor.on('blur', function () {
1520 + getMentionDropdown(editor).hide();
1521 + });
1522 +
1523 + editor.on('init', function () {
1524 + let body = editor.getBody();
1525 + if (!body) return;
1526 +
1527 + body.addEventListener('mousedown', function (e) {
1528 + if (e.target.classList.contains('mention-item')) {
1529 + e.preventDefault();
1530 + }
1531 + });
1532 + if (!editor.mentionDropdown) {
1533 + editor.mentionDropdown = jQuery('<div class="mention-dropdown"></div>');
1534 + jQuery('body').append(editor.mentionDropdown); // ✅ ONLY HERE
1535 + }
1536 + });
1537 +}
1538 +</script>