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
taskbuilder / includes / admin / tasks / open_task / wppm_open_task.php

wppm_open_task.php in Taskbuilder – Project Management & Task Management Tool With Kanban Board 6.0.6, at includes/admin/tasks/open_task/wppm_open_task.php

1,541 lines 93.6 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2 if ( ! defined( 'ABSPATH' ) ) {
3 exit; // Exit if accessed directly
4 }
5
6 global $current_user,$wpdb,$wppmfunction;
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;
22 $auth_id = $wppmfunction->wppm_get_auth_code($id);
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);
45 if(!empty($id)){
46 $task = $wpdb->get_row($wpdb->prepare("SELECT * FROM {$wpdb->prefix}wppm_task where id=%d",$id));
47 $project_data = $wppmfunction->get_project($task->project);
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):"";
53 }
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));
57 }
58 $wppm_checklist=$wpdb->get_results( $wpdb->prepare("SELECT * FROM {$wpdb->prefix}wppm_checklist where task_id=%d",$task_id));
59 if(!empty($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));
62 }
63 if(!empty($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));
66 }
67 if(!empty($task->users)){
68 $users = explode(",",$task->users);
69 }
70
71 if(!empty($task->description)){
72 $task_description = !empty($task->description) ? wp_kses_post(wpautop($task->description)) : '';
73 }
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));
182 ?>
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>
190 <div class="wppm_headers row">
191 <div class="col-sm-8">
192 <span class="wppm-heading-inline">
193 <?php echo esc_html_e('Task','taskbuilder');?>
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>
208 <?php }
209 else{ ?>
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>
211 <?php } ?>
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>
224 <?php }
225 else{
226 ?>
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>
228 <?php } ?>
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>
244 <?php do_action('wppm_individual_task_button',$id);?>
245 </div>
246 </div>
247 <div id="wppm_load_individual_task_container" class="row">
248 <div class="col-sm-8 wppm_body col-md-9">
249 <div class="wppm_task_details_container">
250 <div class="row">
251 <div class="col-sm-12">
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>
255 <?php } ?>
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 } ?>
272 </div>
273 </div>
274 <div class="row">
275 <div class="col-sm-3">
276 <span class="wppm_task_details_label"><?php echo esc_html_e('Project:','taskbuilder');?></span>
277 </div>
278 <div class="col-sm-9">
279 <span class="wppm_task_details"><?php echo (isset($project_name))? esc_html($project_name ):"" ?></span>
280 </div>
281 </div>
282 <div class="row">
283 <div class="col-sm-3">
284 <span class="wppm_task_details_label"><?php echo esc_html_e('Created On:','taskbuilder');?></span>
285 </div>
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>
310 </div>
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 }?>
346 <div class="row">
347 <div class="col-sm-3">
348 <span class="wppm_task_details_label"><?php echo esc_html_e('Task Priority:','taskbuilder');?></span>
349 </div>
350 <div class="col-sm-9">
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>
352 </div>
353 </div>
354 <div class="row">
355 <div class="col-sm-3">
356 <span class="wppm_task_details_label"><?php echo esc_html_e('Description:','taskbuilder');?></span>
357 </div>
358 <div class="col-sm-9">
359 <span class="wppm_task_description"><?php echo (!empty($task_description))? wp_kses_post(wpautop($task_description)):"" ?></span>
360 </div>
361 </div>
362 <?php do_action('wppm_after_task_details_in_open_task',$task->id, $task->project);?>
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 } ?>
524 <div class="wppm_task_checklist_container" id="wppm_task_checklist_container">
525 <div id="wppm_checklist_container">
526 <?php
527 if(!empty($wppm_checklist)){
528 foreach( $wppm_checklist as $key=>$list){
529 ?>
530 <div class="row">
531 <div class="col-sm-8">
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>
533 </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 }?>
543 </div>
544 <div class="wppm_progress_bar_container row">
545 <div class="col-sm-4">
546 <span class="wppm_progressbar_label" id="wppm_progressbar_label_<?php echo esc_attr($list->id)?>">0%</span>
547 </div>
548 <div class="wppm_progress_bar col-sm-8">
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>
550 </div>
551 </div>
552 <?php
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);
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;">
565 <?php
566 if(!empty( $wppm_checklist_items)){
567 foreach($wppm_checklist_items as $key=>$val){
568 $checked = $val->checked == 1 ? 'checked="checked"' : '';
569 ?>
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;">
571 <div class="col-sm-8" id="wppm_checklist_item_container_<?php echo esc_attr($val->id) ?>">
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' ) ); ?>">
575 </div>
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) { ?>
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' ) ); ?>">
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' ) ); ?>">
582 </div>
583 <?php } ?>
584 </li>
585 <?php
586 }
587 } ?>
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>
593 </div>
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>
608 </div>
609 <?php }?>
610 <hr class="wppm_checklist_divider">
611 </ul>
612 <?php
613 }
614 } ?>
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 }?>
636 </div>
637 <div id="wppm_activity_container" style="<?php echo ($wppm_task_hide_comment_section==0 || $user_role==3) ? 'display:none;' : 'display:block;' ?>">
638 <div class="row">
639 <div class="col-sm-12" style="margin-top:5px;">
640 <span class="wppm_task_discussion"><?php echo esc_html_e('Comment','taskbuilder')?></span><br>
641 </div>
642 </div>
643 <div class="row">
644 <div class="col-sm-12" style="<?php echo ($task->is_archived==1) ? 'display:none;' : 'display:block;' ?>">
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>
646 </div>
647 </div>
648 <div class="row" id="wppm_comment_btn" style="<?php echo ($task->is_archived==1) ? 'display:none;' : 'display:block;' ?>">
649 <div class="col-sm-6">
650 <span id="wppm_attach_file" onclick="wppm_upload_file()"><?php echo esc_html_e('Attach Files','taskbuilder')?></span>
651 </div>
652 <div class="col-sm-6">
653 <button type="button" id="wppm_individual_cancel_comment_btn" onclick="wppm_cancel_comment();" class="wppm-btn-cancel">
654 <?php echo esc_html_e('Cancel','taskbuilder')?>
655 </button>
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">
657 <?php echo esc_html_e('SEND','taskbuilder')?>
658 </button>
659 <input type="hidden" name="_ajax_nonce" value="<?php echo esc_attr( wp_create_nonce( 'wppm_submit_task_comment' ) ); ?>">
660 </div>
661 </div>
662 <div class="row" style="<?php echo ($task->is_archived==1) ? 'display:none;' : 'display:block;' ?>">
663 <div class="wppm_attachment_container col-sm-12" style="display:none;">
664 </div>
665 </div>
666 </div>
667 <div class="wppm_thread_container" style="<?php echo ($wppm_task_hide_comment_section==0 || $user_role==3) ? 'display:none;' : 'display:block;' ?>">
668 <?php
669 if(!empty($task_comment)){
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 );
680 $user = get_userdata( $comment->created_by );
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));
684 $attachment_ids = isset($comment->attachment_ids)? $comment->attachment_ids : '';
685 if($attachment_ids!=""){
686 $attachments = explode(",",$attachment_ids);
687 } else {
688 $attachments = array();
689 }
690 ?>
691 <div class="wppm_thread">
692 <div class="wppm_thread_avatar">
693 <?php echo (get_avatar($comment->created_by, 40));?>
694 </div>
695 <div class="wppm_thread_body">
696 <div class="wppm_thread_user_name">
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>
762 <div class="wppm_thread_action">
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)){ ?>
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>
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>
766 <?php } ?>
767 </div>
768 </div>
769 <div class="wppm_thread_messege" style="color:<?php echo esc_attr($appearance_settings['comment-secondary-color']);?>">
770 <?php
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
817 } ?>
818
819 </div>
820 <?php
821 if(!empty($attachments)&& (isset($task_comment_meta->comment_type) && !($task_comment_meta->comment_type=='delete_task_comment'))):?> <br>
822 <strong class="wppm_attachment_title"><?php echo esc_html_e('Attachments','taskbuilder');?>:</strong><br>
823 <table class="wppm_attachment_tbl">
824 <tbody>
825 <?php
826 if(!empty($attachments)){
827 foreach( $attachments as $attachment ):
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));
834 $findStr = ".txt";
835 if(!empty( $attach)){
836 $attachment_name = preg_replace('/' . $findStr . '/', "", $attach->name, 1);
837 $attachment_name = sanitize_file_name($attachment_name);
838 }
839 if((!empty($attachment_name))){
840 ?>
841 <tr class="wppm_attachment_tr">
842 <td>
843 <a class="wppm_attachment_link" href="<?php echo esc_url($download_url) ?>" target="_blank">
844 <span class="wppm_attachment_file_name" style="padding: 7px;"><?php echo isset($attach->file_name) ? esc_html($attach->file_name):"";?></span></a>
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>
847 <?php } ?>
848 </td>
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' ) ); ?>">
851 <?php }
852 endforeach;
853 } ?>
854 </tbody>
855 </table>
856 <?php do_action('wppm_after_comment_attachment',$id,$comment->id);?>
857 <?php endif;?>
858 </div>
859 </div>
860 <?php }
861 } ?>
862 </div>
863 </div>
864 <div class="wppm_individual_task_widget col-sm-4 wppm_sidebar col-md-3">
865 <div class="row wppm_widget" id="wppm_status_widget">
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>
878 <hr class="widget_divider">
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>
882 </div>
883 <div class="row wppm_widget" id="wppm_raisedby_widget">
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>
893 <hr class="widget_divider"> <?php
894 if(isset($task->created_by)){
895 $user_info = get_userdata($task->created_by);
896 }else{
897 $user_info ="";
898 }
899 ?>
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>
905 </div>
906 </div>
907 <div class="row wppm_widget" id="wppm_task_users_widget_container">
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>
917 <hr class="widget_divider">
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 }
936 }
937 }
938 }
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>
944 </div>
945 </div>
946 <?php do_action('wppm_after_task_widgets',$id,$task_id );?>
947 </div>
948 <input type="hidden" id="wppm_nonce" value="<?php echo esc_attr(wp_create_nonce('wppm_upload_file'))?>">
949 <input type="file" id="wppm_attachment_upload" class="hidden" onchange="">
950 </div>
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>
960 <script>
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 } ?>
1018 <?php foreach ($wppm_checklist as $chklist) { ?>
1019 var $checkboxes = jQuery('.wppm_checklist_item_'+<?php echo esc_attr($chklist->id);?>);
1020 var $progress = jQuery('#CheckProgress_'+<?php echo esc_attr($chklist->id);?>);
1021 var total = $checkboxes.length;
1022 var checked = jQuery('.wppm_checklist_item_'+<?php echo esc_attr($chklist->id);?>).filter(':checked').length;
1023 var progressWidth = Math.ceil((checked / total) * 100);
1024 jQuery('#CheckProgress_'+<?php echo esc_attr($chklist->id);?>).css('background','#5ba4cf');
1025 jQuery('#CheckProgress_'+<?php echo esc_attr($chklist->id);?>).css('width', progressWidth + '%');
1026 if(progressWidth>0){
1027 jQuery('#wppm_progressbar_label_'+<?php echo esc_attr($chklist->id);?>).text(progressWidth+'%');
1028 }
1029 <?php $wppm_checklist_items = $wpdb->get_results( $wpdb->prepare("SELECT * FROM {$wpdb->prefix}wppm_checklist_items where checklist_id=%d",$chklist->id));
1030 foreach ($wppm_checklist_items as $chkitems) {
1031 ?> jQuery( '#wppm_checklist_'+<?php echo esc_attr($chkitems->id);?>).on("mouseover", function () {
1032 jQuery( '#wppm_checklist_action_'+<?php echo esc_attr($chkitems->id);?>).css("display","inline");
1033 jQuery( '#wppm_checklist_'+<?php echo esc_attr($chkitems->id);?>).css("background-color","#e7e8ea");
1034 })
1035 jQuery( '#wppm_checklist_'+<?php echo esc_attr($chkitems->id);?>).on("mouseout", function () {
1036 jQuery( '#wppm_checklist_action_'+<?php echo esc_attr($chkitems->id);?>).css("display","none");
1037 jQuery( '#wppm_checklist_'+<?php echo esc_attr($chkitems->id);?>).css("background-color","#ffffff");
1038 })
1039 <?php
1040 }
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 } // �
1093 only ONE setup
1094 });
1095 jQuery('#wppm_comment_btn').show();
1096 }
1097 <?php } ?>
1098 });
1099
1100 jQuery(function(jQuery){
1101 // Checklist Sorting
1102 jQuery(".wppm_checklist_items_container").sortable({
1103 handle: ".wppm_chk_items_drag",
1104 update: function() {
1105 let order = [];
1106 jQuery(this).find("li").each(function(){
1107 order.push(jQuery(this).data("id")); // checklist item id
1108 });
1109
1110 // AJAX Save
1111 jQuery.post(wppm_admin.ajax_url, {
1112 action: "wppm_update_checklist_order",
1113 order: order,
1114 task_id: <?php echo esc_attr($id); ?>,
1115 _ajax_nonce: '<?php echo esc_attr( wp_create_nonce( 'wppm_update_checklist_order' ) ); ?>'
1116 }, function(response_str){
1117 var response = JSON.parse(response_str);
1118 jQuery('.wppm_submit_wait').hide();
1119 if (response.sucess_status=='1') {
1120 jQuery('#wppm_alert_success .wppm_alert_text').text(response.messege);
1121 }
1122 jQuery('#wppm_alert_success').slideDown('fast',function(){});
1123 setTimeout(function(){ jQuery('#wppm_alert_success').slideUp('fast',function(){}); }, 3000);
1124 });
1125 }
1126 });
1127
1128 });
1129
1130 function wppm_cancel_comment(){ <?php
1131 if(!empty($wppm_rich_text_editor) && ($wppm_rich_text_editor == 1)){
1132 ?>
1133 tinyMCE. activeEditor. setContent('');
1134 tinymce.remove('#wppm_task_comment');
1135 jQuery('#wppm_comment_btn').hide();
1136 <?php } else{
1137 ?>
1138 jQuery('#wppm_task_comment').css("width", "80%");
1139 jQuery('#wppm_task_comment').css("height", "30px");
1140 jQuery('#wppm_task_comment').css("color", "#000");
1141 jQuery('#wppm_task_comment').css("padding", "5px");
1142 jQuery('#wppm_task_comment').css(" margin-bottom", "15px");
1143 jQuery('#wppm_task_comment').css("overflow", "hidden");
1144 jQuery('#wppm_task_comment').css("border", "1 px solid #eee");
1145 jQuery('#wppm_task_comment').css("color", "#eee");
1146 jQuery('#wppm_task_comment').css("margin-top", "10px");
1147 jQuery('#wppm_comment_btn').hide();
1148 <?php }?>
1149 }
1150
1151 function wppm_add_task_comment(){
1152 if((wppm_admin.rich_text_editor == 1)){
1153 tinymce.remove();
1154 tinymce.init({
1155 selector:'#wppm_task_comment',
1156 body_id: 'wppm_task_comment',
1157 directionality : '<?php //echo 'rtl'; ?>',
1158 menubar: false,
1159 statusbar: false,
1160 height : '200',
1161 width : '100%',
1162 plugins: [
1163 'lists link image directionality paste textcolor'
1164 ],
1165 image_advtab: true,
1166 toolbar:'<?php echo esc_js( $toolbar ); ?>',
1167 branding: false,
1168 autoresize_bottom_margin: 20,
1169 browser_spellcheck : true,
1170 relative_urls : false,
1171 remove_script_host : false,
1172 convert_urls : true,
1173 paste_as_text: true,
1174 setup: function (editor) {
1175 wppmMentionSetup(editor);
1176 }
1177 });
1178 } else{
1179 jQuery('#wppm_task_comment').css("width", "100%");
1180 jQuery('#wppm_task_comment').css("height", "160px");
1181 jQuery('#wppm_task_comment').css("color", "#000");
1182 }
1183 jQuery('#wppm_comment_btn').show();
1184 }
1185
1186 function wppm_submit_task_comment(id, proj_id){
1187 jQuery('#wppm_mention_list').remove();
1188 var dataform = new FormData(jQuery('#wppm_open_task')[0]);
1189 dataform.append('action','wppm_submit_task_comment');
1190 let comment_body;
1191 if(wppm_admin.rich_text_editor == 1){
1192 const editor = tinyMCE.get('wppm_task_comment');
1193 // Remove dropdown from TinyMCE iframe
1194 const dropdown = editor.getDoc().getElementById('wppm_mention_list');
1195 if (dropdown) {
1196 dropdown.remove();
1197 }
1198 comment_body = editor.getContent().trim();
1199 //comment_body = tinyMCE.get('wppm_task_comment').getContent().trim();
1200 // remove mention dropdown if accidentally inserted
1201 //comment_body = comment_body.replace(/<div[^>]*id="wppm_mention_list"[^>]*>.*?<\/div>/gi, '');
1202 comment_body = comment_body.replace( /<div class="mention-item"[\s\S]*?<\/div>/g, '');
1203 } else {
1204 comment_body = jQuery("#wppm_task_comment").val();
1205 }
1206 dataform.append('comment_body', comment_body);
1207 dataform.append('task_id', id);
1208 jQuery('#wppm_task_container').html(wppm_admin.loading_html);
1209 jQuery.ajax({
1210 url: wppm_admin.ajax_url,
1211 type: 'POST',
1212 data: dataform,
1213 processData: false,
1214 contentType: false
1215 })
1216 .done(function () {
1217 if (proj_id != 0 && proj_id != "") {
1218 wppm_open_project_tasks(id, proj_id);
1219 } else {
1220 wppm_open_task(id);
1221 }
1222 });
1223 }
1224
1225 function wppm_add_checklist_item(checklist_id){
1226 jQuery('#wppm_add_checklist_label_container_'+checklist_id).show();
1227 jQuery('#wppm_add_checklist_item_btn_'+checklist_id).hide();
1228 jQuery('.wppm_add_checklist_label_container_'+checklist_id).show();
1229 jQuery('.wppm_checklist_item_label_'+checklist_id).css('height', '30px');
1230 jQuery('.wppm_add_new_item_btn_'+checklist_id).css('margin', '10px');
1231 }
1232
1233 function wppm_add_checklist(){
1234 jQuery('#wppm_add_checklist').hide();
1235 jQuery('#wppm_add_new_checklist').show();
1236 }
1237
1238 function wppm_remove_add_checklist_container(checklist_id){
1239 jQuery('#wppm_add_checklist_label_container_'+checklist_id).hide();
1240 jQuery('#wppm_add_checklist_item_btn_'+checklist_id).show();
1241 }
1242
1243 function wppm_remove_add_checklist(){
1244 jQuery('#wppm_add_new_checklist').hide();
1245 jQuery('#wppm_add_checklist').show();
1246 }
1247
1248 function wppm_upload_file(){
1249 jQuery('#wppm_attachment_upload').unbind('change');
1250 jQuery('#wppm_attachment_upload').on('change', function() {
1251 var flag = false;
1252 var file = this.files[0];
1253 jQuery('#wppm_attachment_upload').val('');
1254 var allowedExtension = ['exe', 'php','js'];
1255 var file_name_split = file.name.split('.');
1256 var file_extension = file_name_split[file_name_split.length-1];
1257 file_extension = file_extension.toLowerCase();
1258 if( (jQuery.inArray(file_extension,allowedExtension) > -1)){
1259 flag = true;
1260 alert("<?php echo esc_js(__( 'Attached file type not allowed!', 'taskbuilder' ) ); ?>");
1261
1262 };
1263 <?php
1264 $max_upload = (int)(ini_get('upload_max_filesize')); ?>
1265 var current_filesize=file.size/1000000;
1266 if(current_filesize > <?php echo esc_attr($max_upload); ?>){
1267 flag = true;
1268 alert("<?php echo esc_js(__('File size exceed allowed limit!','taskbuilder')); ?>");
1269 }
1270 if (!flag){
1271 var html_str = '<div class="wppm_attachment">'+
1272 '<div class="progress" style="float: none !important; width: unset !important;">'+
1273 '<div class="progress-bar" role="progressbar" aria-valuenow="0" aria-valuemin="0" aria-valuemax="100" style="width:0%">'+
1274 file.name+
1275 '</div>'+
1276 '<span class="wppm_attachment_cancel" onclick="wppm_attachment_cancel(this);" style="display:none;"><img src="<?php echo esc_url( WPPM_PLUGIN_URL . 'asset/images/cross_icon.svg'); ?>" alt="delete_icon"></span>'+
1277 '</div>'+
1278 '</div>';
1279 jQuery('.wppm_attachment_container').show();
1280 jQuery('.wppm_attachment_container').append(html_str);
1281 var attachment = jQuery('.wppm_attachment_container').find('.wppm_attachment').last();
1282 var data = new FormData();
1283 data.append('file', file);
1284 data.append('arr_name', file.name);
1285 data.append('action', 'wppm_upload_file');
1286 data.append('nonce', jQuery('#wppm_nonce').val().trim());
1287 jQuery.ajax({
1288 type: 'post',
1289 url: wppm_admin.ajax_url,
1290 data: data,
1291 xhr: function(){
1292 var xhr = new window.XMLHttpRequest();
1293 xhr.upload.addEventListener("progress", function(evt){
1294 if (evt.lengthComputable) {
1295 var percentComplete = Math.floor((evt.loaded / evt.total) * 100);
1296 jQuery(attachment).find('.progress-bar').css('width',percentComplete+'%');
1297 }
1298 }, false);
1299 return xhr;
1300 },
1301 processData: false,
1302 contentType: false,
1303 success: function(response) {
1304 var return_obj=JSON.parse(response);
1305 jQuery(attachment).find('.wppm_attachment_cancel').show();
1306 if( parseInt(return_obj.id) != 0 ){
1307 jQuery(attachment).append('<input type="hidden" class="wppm_comment_attachment" name="wppm_comment_attachment[]" value="'+return_obj.id+'">');
1308 jQuery(attachment).find('.progress-bar').addClass('progress-bar-success');
1309 }else {
1310 jQuery(attachment).find('.progress-bar').addClass('progress-bar-danger');
1311 }
1312 }
1313 });
1314 }
1315 });
1316 jQuery('#wppm_attachment_upload').trigger('click');
1317 }
1318
1319 function wppmMentionSetup(editor) {
1320 let mentionIndex = -1;
1321 editor.on('keyup', function (e) {
1322 editor.lastMentionRange = editor.selection.getRng();
1323 let rng = editor.selection.getRng();
1324 let node = rng.startContainer;
1325
1326 if (!node || node.nodeType !== 3) return;
1327
1328 let text = node.textContent;
1329 let cursorPos = rng.startOffset;
1330 let textBeforeCursor = text.substring(0, cursorPos);
1331
1332 let match = textBeforeCursor.match(/@(\w*)$/);
1333 let dropdown = getMentionDropdown(editor);
1334
1335 if (match) {
1336 let query = match[1];
1337 let rect = rng.getBoundingClientRect();
1338 if (!rect || rect.top === 0) {
1339 rect = editor.selection.getNode().getBoundingClientRect();
1340 }
1341 let top = rect.bottom + editor.getWin().scrollY;
1342 let left = rect.left + editor.getWin().scrollX;
1343 jQuery.post(wppm_admin.ajax_url, {
1344 action: 'wppm_filter_autocomplete',
1345 term: query,
1346 field : 'task_user_name',
1347 task_id:<?php echo esc_attr($task_id) ?>,
1348 proj_id:<?php echo esc_attr($proj_id) ?>
1349 }, function (res) {
1350
1351 if (typeof res === "string") res = JSON.parse(res);
1352 if (res.success) res = res.data;
1353
1354 if (!Array.isArray(res)) return;
1355
1356 dropdown.empty();
1357 if( res.length === 0 ){
1358 dropdown.hide();
1359 return;
1360 }else{
1361 res.forEach(user => {
1362 let item = jQuery('<div>')
1363 .addClass('mention-item')
1364 .attr('data-username', user.label)
1365 .attr('data-user-id', user.user_id)
1366 .text(user.label)
1367 .css({
1368 padding: '8px 12px',
1369 cursor: 'pointer',
1370 fontSize: '14px',
1371 color: '#333',
1372 background: '#fff',
1373 borderBottom: '1px solid #eee'
1374 });
1375
1376 item.on('mouseenter', function () {
1377 jQuery(this).css({
1378 background: '#0073aa',
1379 color: '#fff'
1380 });
1381 });
1382 item.on('mouseleave', function () {
1383 if (!jQuery(this).hasClass('active')) {
1384 jQuery(this).css({
1385 background: '#fff',
1386 color: '#333'
1387 });
1388 }
1389 });
1390 dropdown.append(item);
1391 });
1392 let items = dropdown.find('.mention-item');
1393 items.removeClass('active').css({
1394 background: '#fff',
1395 color: '#333'
1396 });
1397 items.eq(0)
1398 .addClass('active')
1399 .css({
1400 background: '#0073aa',
1401 color: '#fff'
1402 });
1403 mentionIndex = 0;
1404 updateActiveItem(items.eq(0), mentionIndex);
1405 dropdown.css({
1406 position: 'absolute',
1407 display: 'none',
1408 background: '#fff',
1409 border: '1px solid #ddd',
1410 borderRadius: '6px',
1411 padding: '5px 0',
1412 minWidth: '180px',
1413 maxHeight: '220px',
1414 overflowY: 'auto',
1415 boxShadow: '0 4px 10px rgba(0,0,0,.15)',
1416 zIndex: 999999999999999
1417 }).show();
1418 }
1419 });
1420 } else {
1421 dropdown.hide();
1422 }
1423 });
1424 editor.on('keydown', function (e) {
1425 let dropdown = getMentionDropdown(editor);
1426 let items = dropdown.find('.mention-item');
1427
1428 if (!dropdown.is(':visible') || !items.length) return;
1429
1430 // DOWN
1431 if (e.key === 'ArrowDown') {
1432 e.preventDefault();
1433 mentionIndex++;
1434
1435 if (mentionIndex >= items.length) {
1436 mentionIndex = 0;
1437 }
1438 updateActiveItem(items, mentionIndex);
1439 items.removeClass('active').css({
1440 background: '#fff',
1441 color: '#333'
1442 });
1443
1444 items.eq(mentionIndex)
1445 .addClass('active')
1446 .css({
1447 background: '#0073aa',
1448 color: '#fff'
1449 });
1450 }
1451
1452 // UP
1453 if (e.key === 'ArrowUp') {
1454 e.preventDefault();
1455 mentionIndex--;
1456 if (mentionIndex < 0) {
1457 mentionIndex = items.length - 1;
1458 }
1459 updateActiveItem(items, mentionIndex);
1460 items.removeClass('active').css({
1461 background: '#fff',
1462 color: '#333'
1463 });
1464
1465 items.eq(mentionIndex)
1466 .addClass('active')
1467 .css({
1468 background: '#0073aa',
1469 color: '#fff'
1470 });
1471 }
1472 // ENTER
1473 if (e.key === 'Enter') {
1474 if (mentionIndex >= 0) {
1475 e.preventDefault();
1476 items.eq(mentionIndex).trigger('click');
1477 }
1478 }
1479 // ESC
1480 if (e.key === 'Escape') {
1481 dropdown.hide();
1482 mentionIndex = -1;
1483 }
1484 });
1485 editor.on('click', function (e) {
1486 let target = jQuery(e.target);
1487 if (target.hasClass('mention-item')) {
1488 let username = target.data('username');
1489 let userId = target.data('user-id');
1490
1491 editor.focus();
1492
1493 let rng = editor.lastMentionRange || editor.selection.getRng();
1494 editor.selection.setRng(rng);
1495
1496 let node = rng.startContainer;
1497 if (!node || node.nodeType !== 3) return;
1498
1499 let text = node.textContent;
1500 let cursorPos = rng.startOffset;
1501
1502 let lastAtIndex = text.substring(0, cursorPos).lastIndexOf('@');
1503
1504 if (lastAtIndex !== -1) {
1505
1506 let range = editor.selection.getRng();
1507 range.setStart(node, lastAtIndex);
1508 range.setEnd(node, cursorPos);
1509
1510 editor.selection.setRng(range);
1511
1512 editor.selection.setContent(
1513 '<span class="wppm-mention" contenteditable="false" data-username="' + username + '" data-user-id="' + userId + '">@' + username + '</span>&nbsp;'
1514 );
1515 }
1516 getMentionDropdown(editor).hide();
1517 }
1518 });
1519
1520 editor.on('blur', function () {
1521 getMentionDropdown(editor).hide();
1522 });
1523
1524 editor.on('init', function () {
1525 let body = editor.getBody();
1526 if (!body) return;
1527
1528 body.addEventListener('mousedown', function (e) {
1529 if (e.target.classList.contains('mention-item')) {
1530 e.preventDefault();
1531 }
1532 });
1533 if (!editor.mentionDropdown) {
1534 editor.mentionDropdown = jQuery('<div class="mention-dropdown"></div>');
1535 jQuery('body').append(editor.mentionDropdown); // �
1536 ONLY HERE
1537 }
1538 });
1539 }
1540 </script>
1541