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 +1195 -181 1.0.16.0.6 View file →
@@ -3,28 +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";
8 -if (!(($current_user->ID && $current_user->has_cap('manage_options')) || ($wppmfunction->has_permission('view_task',$id)))) {exit;}
9 -$proj_id = isset($_POST) && isset($_POST['proj_id']) ? intval(sanitize_text_field($_POST['proj_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'])) : '';
9 +$task_list_view = get_option('wppm_default_task_list_view');
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;
10 22 $auth_id = $wppmfunction->wppm_get_auth_code($id);
11 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);
12 45 if(!empty($id)){
13 - $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));
14 47 $project_data = $wppmfunction->get_project($task->project);
15 - $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):"";
16 53 }
17 -$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");
18 -if(!empty($task->project)){
19 - $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));
20 57 }
21 -$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));
22 59 if(!empty($task->status)){
23 - $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));
24 62 }
25 63 if(!empty($task->priority)){
26 - $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));
27 66 }
28 67 if(!empty($task->users)){
29 68 $users = explode(",",$task->users);
30 69 }
@@ -29,35 +68,182 @@
29 68 $users = explode(",",$task->users);
30 69 }
31 70
32 71 if(!empty($task->description)){
33 - $task_description = stripslashes((htmlspecialchars_decode($task->description, ENT_QUOTES)));
72 + $task_description = !empty($task->description) ? wp_kses_post(wpautop($task->description)) : '';
34 73 }
35 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));
36 182 ?>
37 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>
38 190 <div class="wppm_headers row">
39 191 <div class="col-sm-8">
40 192 <span class="wppm-heading-inline">
41 193 <?php echo esc_html_e('Task','taskbuilder');?>
42 - </span>
43 - <?php if($proj_id==0) { ?>
44 - <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>
45 208 <?php }
46 209 else{ ?>
47 - <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>
48 211 <?php } ?>
49 - <?php if($proj_id==0) { ?>
50 - <span class="wppm-task-list-btn" id="wppm_task_list_btn" title="Task List" onclick="wppm_get_task_list()"><img src="<?php echo esc_url( WPPM_PLUGIN_URL . 'asset/images/list.svg'); ?>" alt="list"></span>
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 + }
222 + ?>
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>
51 224 <?php }
52 225 else{
53 226 ?>
54 - <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>
55 228 <?php } ?>
56 - <?php $style = (($current_user->ID && $current_user->has_cap('manage_options')) || ($wppmfunction->has_permission('delete_task',$id)))? "display:inline":"display:none"; ?>
57 - <span class="wppm-delete_task_btn" id="wppm_delete_task_btn" title="Task List" 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>
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>
58 244 <?php do_action('wppm_individual_task_button',$id);?>
59 - </div>
245 + </div>
60 246 </div>
61 247 <div id="wppm_load_individual_task_container" class="row">
62 248 <div class="col-sm-8 wppm_body col-md-9">
63 249 <div class="wppm_task_details_container">
@@ -62,13 +248,28 @@
62 248 <div class="col-sm-8 wppm_body col-md-9">
63 249 <div class="wppm_task_details_container">
64 250 <div class="row">
65 251 <div class="col-sm-12">
66 - <span class="wppm_task_label"> <?php echo esc_html_e($task->task_name,'taskbuilder');
67 - if ($wppmfunction->has_permission('change_task_details',$id) || $current_user->has_cap('manage_options')) { ?>
68 - <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>
69 255 <?php } ?>
70 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 + } ?>
71 272 </div>
72 273 </div>
73 274 <div class="row">
74 275 <div class="col-sm-3">
@@ -74,9 +275,9 @@
74 275 <div class="col-sm-3">
75 276 <span class="wppm_task_details_label"><?php echo esc_html_e('Project:','taskbuilder');?></span>
76 277 </div>
77 278 <div class="col-sm-9">
78 - <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>
79 280 </div>
80 281 </div>
81 282 <div class="row">
82 283 <div class="col-sm-3">
@@ -81,34 +282,74 @@
81 282 <div class="row">
82 283 <div class="col-sm-3">
83 284 <span class="wppm_task_details_label"><?php echo esc_html_e('Created On:','taskbuilder');?></span>
84 285 </div>
85 - <div class="col-sm-9">
86 - <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>
87 310 </div>
88 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 + }?>
89 346 <div class="row">
90 347 <div class="col-sm-3">
91 - <span class="wppm_task_details_label"><?php echo esc_html_e('Start Date:','taskbuilder');?></span>
92 - </div>
93 - <div class="col-sm-9">
94 - <span class="wppm_task_details"><?php echo (isset($task->start_date))? esc_html($task->start_date):"" ?></span>
95 - </div>
96 - </div>
97 - <div class="row">
98 - <div class="col-sm-3">
99 - <span class="wppm_task_details_label"><?php echo esc_html_e('End Date:','taskbuilder');?></span>
100 - </div>
101 - <div class="col-sm-9">
102 - <span class="wppm_task_details"><?php echo (isset($task->end_date))? esc_html($task->end_date):"" ?></span>
103 - </div>
104 - </div>
105 - <div class="row">
106 - <div class="col-sm-3">
107 348 <span class="wppm_task_details_label"><?php echo esc_html_e('Task Priority:','taskbuilder');?></span>
108 349 </div>
109 350 <div class="col-sm-9">
110 - <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>
111 352 </div>
112 353 </div>
113 354 <div class="row">
114 355 <div class="col-sm-3">
@@ -113,16 +354,174 @@
113 354 <div class="row">
114 355 <div class="col-sm-3">
115 356 <span class="wppm_task_details_label"><?php echo esc_html_e('Description:','taskbuilder');?></span>
116 357 </div>
117 - <?php
118 - $allowedtags = array( 'br' => array(), 'abbr' => array('title' => array(),), 'p' => array(), 'strong' => array(), 'a' => array('href' => array(), 'title' => 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(),));?>
119 358 <div class="col-sm-9">
120 - <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>
121 360 </div>
122 361 </div>
123 362 <?php do_action('wppm_after_task_details_in_open_task',$task->id, $task->project);?>
124 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 } ?>
125 524 <div class="wppm_task_checklist_container" id="wppm_task_checklist_container">
126 525 <div id="wppm_checklist_container">
127 526 <?php
128 527 if(!empty($wppm_checklist)){
@@ -129,15 +528,19 @@
129 528 foreach( $wppm_checklist as $key=>$list){
130 529 ?>
131 530 <div class="row">
132 531 <div class="col-sm-8">
133 - <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>
134 533 </div>
135 - <?php $check_style = (($list->created_by == $current_user->ID || $current_user->has_cap('manage_options') || $user_role == 1))? "display:inline":"display:none"; ?>
136 - <?php $disabled = (($list->created_by == $current_user->ID || $current_user->has_cap('manage_options') || $user_role == 1))? "":"disabled"; ?>
137 - <div class="col-sm-4" style="text-align:right;<?php echo esc_attr($check_style) ?>">
138 - <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>
139 - </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 }?>
140 543 </div>
141 544 <div class="wppm_progress_bar_container row">
142 545 <div class="col-sm-4">
143 546 <span class="wppm_progressbar_label" id="wppm_progressbar_label_<?php echo esc_attr($list->id)?>">0%</span>
@@ -146,78 +549,104 @@
146 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>
147 550 </div>
148 551 </div>
149 552 <?php
150 - $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);
151 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;">
152 565 <?php
153 566 if(!empty( $wppm_checklist_items)){
154 567 foreach($wppm_checklist_items as $key=>$val){
155 568 $checked = $val->checked == 1 ? 'checked="checked"' : '';
156 569 ?>
157 - <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;">
158 571 <div class="col-sm-8" id="wppm_checklist_item_container_<?php echo esc_attr($val->id) ?>">
159 - <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' ) ); ?>">
160 575 </div>
161 - <?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) { ?>
162 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' ) ); ?>">
163 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' ) ); ?>">
164 582 </div>
165 583 <?php } ?>
166 - </div>
584 + </li>
167 585 <?php
168 586 }
169 587 } ?>
170 - <div class="row">
171 - <div class="col-sm-12 wppm_add_checklist_item_container_<?php echo esc_attr($list->id) ?>" style="padding-top:15px;">
172 - <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>
173 593 </div>
174 - </div>
175 - <div class="row">
176 - <div class="col-sm-12" style="display:none;" id="wppm_add_checklist_label_container_<?php echo esc_attr($list->id) ?>">
177 - <div class="row" id="wppm_add_new_checklist_item_<?php echo esc_attr($list->id) ?>">
178 - <div class="col-sm-12">
179 - <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;">
180 - <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) ?>)">
181 - <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>
182 608 </div>
183 - </div>
184 - </br>
185 - </div>
186 - </div>
609 + <?php }?>
187 610 <hr class="wppm_checklist_divider">
611 + </ul>
188 612 <?php
189 613 }
190 614 } ?>
191 - </div>
192 - <div id="wppm_add_checklist_container">
193 - <div class="row">
194 - <div class="col-sm-12">
195 - <span id="wppm_add_checklist" onclick="wppm_add_checklist()"> <?php echo esc_html_e('+Add a checklist','taskbuilder')?> </span>
196 - </div>
197 - </div>
198 - <div class="row" id="wppm_add_new_checklist" style="display:none;">
199 - <div class="col-sm-12">
200 - <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">
201 - <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) ?>)">
202 - <span onclick="wppm_remove_add_checklist()"><img src="<?php echo esc_url( WPPM_PLUGIN_URL . 'asset/images/cross1.svg'); ?>"></span>
203 - </div>
204 - </div>
205 - </br>
206 - </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 + }?>
207 636 </div>
208 - <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;' ?>">
209 638 <div class="row">
210 639 <div class="col-sm-12" style="margin-top:5px;">
211 - <span class="wppm_task_discussion"><?php echo esc_html_e('Discussion','taskbuilder')?></span>
640 + <span class="wppm_task_discussion"><?php echo esc_html_e('Comment','taskbuilder')?></span><br>
212 641 </div>
213 642 </div>
214 643 <div class="row">
215 - <div class="col-sm-12">
644 + <div class="col-sm-12" style="<?php echo ($task->is_archived==1) ? 'display:none;' : 'display:block;' ?>">
216 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>
217 646 </div>
218 647 </div>
219 - <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;' ?>">
220 649 <div class="col-sm-6">
221 650 <span id="wppm_attach_file" onclick="wppm_upload_file()"><?php echo esc_html_e('Attach Files','taskbuilder')?></span>
222 651 </div>
223 652 <div class="col-sm-6">
@@ -223,27 +652,36 @@
223 652 <div class="col-sm-6">
224 653 <button type="button" id="wppm_individual_cancel_comment_btn" onclick="wppm_cancel_comment();" class="wppm-btn-cancel">
225 654 <?php echo esc_html_e('Cancel','taskbuilder')?>
226 655 </button>
227 - <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">
228 657 <?php echo esc_html_e('SEND','taskbuilder')?>
229 658 </button>
659 + <input type="hidden" name="_ajax_nonce" value="<?php echo esc_attr( wp_create_nonce( 'wppm_submit_task_comment' ) ); ?>">
230 660 </div>
231 661 </div>
232 - <div class="row">
662 + <div class="row" style="<?php echo ($task->is_archived==1) ? 'display:none;' : 'display:block;' ?>">
233 663 <div class="wppm_attachment_container col-sm-12" style="display:none;">
234 664 </div>
235 665 </div>
236 666 </div>
237 - <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;' ?>">
238 668 <?php
239 669 if(!empty($task_comment)){
240 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 + );
241 680 $user = get_userdata( $comment->created_by );
242 - $comment_body = stripslashes((htmlspecialchars_decode($comment->body, ENT_QUOTES)));
243 - $comment_body = preg_replace('#<script(.*?)>(.*?)</script>#is', '', $comment_body);
244 - $date = date("Y-m-d H:i:s" ,strtotime($comment->create_time));
245 - $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));
246 684 $attachment_ids = isset($comment->attachment_ids)? $comment->attachment_ids : '';
247 685 if($attachment_ids!=""){
248 686 $attachments = explode(",",$attachment_ids);
249 687 } else {
@@ -255,25 +693,133 @@
255 693 <?php echo (get_avatar($comment->created_by, 40));?>
256 694 </div>
257 695 <div class="wppm_thread_body">
258 696 <div class="wppm_thread_user_name">
259 - <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>
260 762 <div class="wppm_thread_action">
261 - <?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)){ ?>
262 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>
263 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>
264 766 <?php } ?>
265 767 </div>
266 768 </div>
267 - <div class="wppm_thread_messege">
769 + <div class="wppm_thread_messege" style="color:<?php echo esc_attr($appearance_settings['comment-secondary-color']);?>">
268 770 <?php
269 - $allowedtags = array( 'br' => array(), 'abbr' => array('title' => array(),), 'p' => array(), 'strong' => array(), 'a' => array('href' => array(), 'title' => 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(),));
270 - if(!empty($comment_body)){
271 - 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
272 817 } ?>
818 +
273 819 </div>
274 820 <?php
275 - if(!empty($attachments)):?> <br>
821 + if(!empty($attachments)&& (isset($task_comment_meta->comment_type) && !($task_comment_meta->comment_type=='delete_task_comment'))):?> <br>
276 822 <strong class="wppm_attachment_title"><?php echo esc_html_e('Attachments','taskbuilder');?>:</strong><br>
277 823 <table class="wppm_attachment_tbl">
278 824 <tbody>
279 825 <?php
@@ -278,10 +824,14 @@
278 824 <tbody>
279 825 <?php
280 826 if(!empty($attachments)){
281 827 foreach( $attachments as $attachment ):
282 - $attach = $wpdb->get_row( "SELECT * FROM {$wpdb->prefix}wppm_attachments where id=".$attachment);
283 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));
284 834 $findStr = ".txt";
285 835 if(!empty( $attach)){
286 836 $attachment_name = preg_replace('/' . $findStr . '/', "", $attach->name, 1);
287 837 $attachment_name = sanitize_file_name($attachment_name);
@@ -291,13 +841,14 @@
291 841 <tr class="wppm_attachment_tr">
292 842 <td>
293 843 <a class="wppm_attachment_link" href="<?php echo esc_url($download_url) ?>" target="_blank">
294 844 <span class="wppm_attachment_file_name" style="padding: 7px;"><?php echo isset($attach->file_name) ? esc_html($attach->file_name):"";?></span></a>
295 - <?php if((($comment->created_by == $current_user->ID) || ($current_user->has_cap('manage_options')) || ($wppmfunction->has_comment_permission('edit_task_comment',$id,$comment->id)))){ ?>
296 - <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>
297 847 <?php } ?>
298 848 </td>
299 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' ) ); ?>">
300 851 <?php }
301 852 endforeach;
302 853 } ?>
303 854 </tbody>
@@ -311,70 +862,160 @@
311 862 </div>
312 863 </div>
313 864 <div class="wppm_individual_task_widget col-sm-4 wppm_sidebar col-md-3">
314 865 <div class="row wppm_widget" id="wppm_status_widget">
315 - <h4 class="widget_header"><?php echo esc_html_e('Status','taskbuilder')?>
316 - <?php if ($wppmfunction->has_permission('change_status',$id) || $current_user->has_cap('manage_options')) { ?>
317 - <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>
318 - <?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>
319 878 <hr class="widget_divider">
320 - <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>
321 882 </div>
322 883 <div class="row wppm_widget" id="wppm_raisedby_widget">
323 - <h4 class="widget_header">
324 - <?php echo esc_html_e('Task Creator','taskbuilder')?>
325 - <?php if ($wppmfunction->has_permission('change_raised_by',$id ) || $current_user->has_cap('manage_options')) { ?>
326 - <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>
327 - <?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>
328 893 <hr class="widget_divider"> <?php
329 - $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 + }
330 899 ?>
331 - <div style="padding:2px 0;">
332 - <span class="wppm_task_user_avatar"><?php echo (get_avatar($task->created_by, 25, "mysteryman")); ?></span>
333 - <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>
334 905 </div>
335 906 </div>
336 907 <div class="row wppm_widget" id="wppm_task_users_widget_container">
337 - <h4 class="widget_header">
338 - <?php if ($wppmfunction->has_permission('assign_task_users',$id ) || $current_user->has_cap('manage_options')) { ?>
339 - <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>
340 - <?php } ?>
341 - <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>
342 917 <hr class="widget_divider">
343 - <div id="wppm_task_users">
344 - <?php
345 - $i=0;
346 - if(!empty($users)){
347 - foreach($users as $user) {
348 - $user_data = get_userdata($user);
349 - if(!empty($project_data['users'])){
350 - $proj_users = explode(',',$project_data['users']);
351 - if(in_array($user,$proj_users)){
352 - $i++;
353 - ?>
354 - <div style="padding:2px 0;">
355 - <span class="wppm_task_user_avatar"><?php echo (get_avatar($user, 25, "mysteryman")); ?></span>
356 - <span class="wppm_task_user_names"><?php echo ((!empty($user_data))? esc_html($user_data->display_name) :"") ?></span>
357 - </div>
358 - <?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 + }
359 936 }
360 937 }
361 938 }
362 - }
363 - if($i==0){ ?>
364 - <span class="wppm_display_user_none"><?php echo esc_html_e('None','taskbuilder'); ?></span> <?php
365 - }
366 - ?>
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>
367 944 </div>
368 945 </div>
369 - <?php do_action('wppm_after_task_widgets',$id,$proj_id);?>
946 + <?php do_action('wppm_after_task_widgets',$id,$task_id );?>
370 947 </div>
371 - <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'))?>">
372 949 <input type="file" id="wppm_attachment_upload" class="hidden" onchange="">
373 950 </div>
374 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>
375 960 <script>
376 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 } ?>
377 1018 <?php foreach ($wppm_checklist as $chklist) { ?>
378 1019 var $checkboxes = jQuery('.wppm_checklist_item_'+<?php echo esc_attr($chklist->id);?>);
379 1020 var $progress = jQuery('#CheckProgress_'+<?php echo esc_attr($chklist->id);?>);
380 1021 var total = $checkboxes.length;
@@ -384,9 +1025,9 @@
384 1025 jQuery('#CheckProgress_'+<?php echo esc_attr($chklist->id);?>).css('width', progressWidth + '%');
385 1026 if(progressWidth>0){
386 1027 jQuery('#wppm_progressbar_label_'+<?php echo esc_attr($chklist->id);?>).text(progressWidth+'%');
387 1028 }
388 - <?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));
389 1030 foreach ($wppm_checklist_items as $chkitems) {
390 1031 ?> jQuery( '#wppm_checklist_'+<?php echo esc_attr($chkitems->id);?>).on("mouseover", function () {
391 1032 jQuery( '#wppm_checklist_action_'+<?php echo esc_attr($chkitems->id);?>).css("display","inline");
392 1033 jQuery( '#wppm_checklist_'+<?php echo esc_attr($chkitems->id);?>).css("background-color","#e7e8ea");
@@ -397,37 +1038,188 @@
397 1038 })
398 1039 <?php
399 1040 }
400 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)){
401 1131 ?>
402 -});
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 +}
403 1149
404 1150 function wppm_add_task_comment(){
405 - tinymce.remove();
406 - tinymce.init({
407 - selector:'#wppm_task_comment',
408 - body_id: 'wppm_task_comment',
409 - directionality : '<?php //echo 'rtl'; ?>',
410 - menubar: false,
411 - statusbar: false,
412 - height : '200',
413 - width : '100%',
414 - plugins: [
415 - 'lists link image directionality paste'
416 - ],
417 - image_advtab: true,
418 - toolbar: 'bold italic underline blockquote | alignleft aligncenter alignright | bullist numlist | rtl | link image',
419 - branding: false,
420 - autoresize_bottom_margin: 20,
421 - browser_spellcheck : true,
422 - relative_urls : false,
423 - remove_script_host : false,
424 - convert_urls : true,
425 - paste_as_text: true,
426 - 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();
427 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 + }
428 1221 });
429 - jQuery('#wppm_comment_btn').show();
430 1222 }
431 1223
432 1224 function wppm_add_checklist_item(checklist_id){
433 1225 jQuery('#wppm_add_checklist_label_container_'+checklist_id).show();
@@ -463,9 +1255,10 @@
463 1255 var file_extension = file_name_split[file_name_split.length-1];
464 1256 file_extension = file_extension.toLowerCase();
465 1257 if( (jQuery.inArray(file_extension,allowedExtension) > -1)){
466 1258 flag = true;
467 - alert("<?php _e('Attached file type not allowed!','taskbuilder')?>");
1259 + alert("<?php echo esc_js(__( 'Attached file type not allowed!', 'taskbuilder' ) ); ?>");
1260 +
468 1261 };
469 1262 <?php
470 1263 $max_upload = (int)(ini_get('upload_max_filesize')); ?>
471 1264 var current_filesize=file.size/1000000;
@@ -470,9 +1263,9 @@
470 1263 $max_upload = (int)(ini_get('upload_max_filesize')); ?>
471 1264 var current_filesize=file.size/1000000;
472 1265 if(current_filesize > <?php echo esc_attr($max_upload); ?>){
473 1266 flag = true;
474 - alert("<?php _e('File size exceed allowed limit!','taskbuilder')?>");
1267 + alert("<?php echo esc_js(__('File size exceed allowed limit!','taskbuilder')); ?>");
475 1268 }
476 1269 if (!flag){
477 1270 var html_str = '<div class="wppm_attachment">'+
478 1271 '<div class="progress" style="float: none !important; width: unset !important;">'+
@@ -520,5 +1313,226 @@
520 1313 }
521 1314 });
522 1315 jQuery('#wppm_attachment_upload').trigger('click');
523 1316 }
524 -</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>