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 +1538 -1081 5.0.56.0.6 View file →
@@ -1,1081 +1,1538 @@
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 -$task_list_view = get_option('wppm_default_task_list_view');
9 -$wppm_default_task_date = get_option('wppm_default_task_date');
10 -$wppm_task_time = get_option('wppm_task_time');
11 -$appearance_settings = get_option("wppm-ap-individual-task");
12 -$wppm_tinymce_visibility_open_task = get_option('wppm_tinymce_visibility_open_task');
13 -$settings = get_option("wppm-ap-modal");
14 -$wppm_rich_text_editor = get_option('wppm_rich_text_editor');
15 -$wppm_toolbar_actions = get_option('wppm_toolbar_actions');
16 -$wppm_date_setting = get_option('wppm_date_setting');
17 -$wppm_task_hide_comment_section = get_option('wppm_task_hide_comment_section');
18 -$wppm_deafault_time_duration_task = get_option('wppm_display_time_duration_task');
19 -$url_auth = false;
20 -$auth_id = $wppmfunction->wppm_get_auth_code($id);
21 -$auth_id = sanitize_text_field($auth_id);
22 -// url authentication.
23 -$auth_code = isset( $_POST['auth-code'] ) ? sanitize_text_field( wp_unslash($_POST['auth-code'] ) ) : ''; // phpcs:ignore
24 -if ( ! $auth_code ) {
25 - $auth_code = isset( $_POST['auth_code'] ) ? sanitize_text_field( wp_unslash($_POST['auth_code'] ) ) : ''; // phpcs:ignore
26 -}
27 -
28 -if ( $auth_code && $auth_id == $auth_code ) {
29 - $url_auth = true;
30 -}
31 -if (!(($current_user->ID && $current_user->has_cap('manage_options')) || ($wppmfunction->has_permission('view_task',$id)) || ($url_auth==true))) { ?>
32 - <div style="align-item:center;" ><h6><?php esc_attr_e( 'Unauthorized access!', 'taskbuilder' ); ?></h6></div>
33 - <?php
34 - wp_die();
35 -}
36 -$proj_id = isset($_POST) && isset($_POST['proj_id']) ? intval(sanitize_text_field(wp_unslash($_POST['proj_id']))) : 0;
37 -$current_date = wp_date('Y-m-d');
38 -$wppm_current_user_capability = get_user_meta( $current_user->ID, 'wppm_capability', true );
39 -$cu_id = absint($current_user->ID);
40 -if(!empty($id)){
41 - $task = $wpdb->get_row($wpdb->prepare("SELECT * FROM {$wpdb->prefix}wppm_task where id=%d",$id));
42 - $project_data = $wppmfunction->get_project($task->project);
43 - $task_comment = $wpdb->get_results( $wpdb->prepare("SELECT * FROM {$wpdb->prefix}wppm_task_comment where task_id=%d ORDER BY create_time DESC",$id));
44 - $orderby_proj_sql = (sanitize_sql_orderby( "create_time DESC" ));
45 - $task_comment = $wpdb->get_results( $wpdb->prepare("SELECT * FROM {$wpdb->prefix}wppm_task_comment where task_id=%d ORDER BY ". $orderby_proj_sql,$id));
46 - $task_proj = isset($task->project) ? absint($task->project) :"";
47 - $task_id = isset($task->id) ? absint($task->id):"";
48 -}
49 -$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));
50 -if(!empty($task_proj)){
51 - $project_name = $wpdb->get_var( $wpdb->prepare("SELECT project_name FROM {$wpdb->prefix}wppm_project where id= %d",$task_proj));
52 -}
53 -$wppm_checklist=$wpdb->get_results( $wpdb->prepare("SELECT * FROM {$wpdb->prefix}wppm_checklist where task_id=%d",$task_id));
54 -if(!empty($task->status)){
55 - $task_status_var = absint($task->status);
56 - $task_status = $wpdb->get_row( $wpdb->prepare("SELECT * FROM {$wpdb->prefix}wppm_task_statuses where id=%d",$task_status_var));
57 -}
58 -if(!empty($task->priority)){
59 - $task_priority_var = absint($task->priority);
60 - $task_priority = $wpdb->get_row( $wpdb->prepare("SELECT * FROM {$wpdb->prefix}wppm_task_priorities where id=%d",$task_priority_var));
61 -}
62 -if(!empty($task->users)){
63 - $users = explode(",",$task->users);
64 -}
65 -
66 -if(!empty($task->description)){
67 - $task_description = !empty($task->description) ? wp_kses_post(wpautop($task->description)) : '';
68 -}
69 -
70 -if($wppm_task_time == 1){
71 - $tsDate = new DateTime($task->start_date);
72 - $teDate = new DateTime($task->end_date);
73 - if($task->start_date=='0000-00-00 00:00:00'){
74 - if($wppm_date_setting=='Y-m-d H:i:s'){
75 - $task_start_date = '0000-00-00 00:00:00';
76 - }elseif($wppm_date_setting=='d-m-Y H:i:s'){
77 - $task_start_date = '00-00-0000 00:00:00';
78 - }elseif($wppm_date_setting=='m-d-Y H:i:s'){
79 - $task_start_date = '00-00-0000 00:00:00';
80 - }else{
81 - $task_start_date = '0000-00-00 00:00:00';
82 - }
83 - }if($task->end_date=='0000-00-00 00:00:00'){
84 - if($wppm_date_setting=='Y-m-d H:i:s'){
85 - $task_end_date = '0000-00-00 00:00:00';
86 - }elseif($wppm_date_setting=='d-m-Y H:i:s'){
87 - $task_end_date = '00-00-0000 00:00:00';
88 - }elseif($wppm_date_setting=='m-d-Y H:i:s'){
89 - $task_end_date = '00-00-0000 00:00:00';
90 - }else{
91 - $task_end_date = '0000-00-00 00:00:00';
92 - }
93 - }if($task->start_date!='0000-00-00 00:00:00'){
94 - if(!empty($wppm_date_setting)){
95 - $task_start_date = $tsDate->format($wppm_date_setting);
96 - }else{
97 - $task_start_date = isset($task->start_date)? $task->start_date:"";
98 - }
99 - }
100 - if($task->end_date!='0000-00-00 00:00:00'){
101 - if(!empty($wppm_date_setting)){
102 - $task_end_date = $teDate->format($wppm_date_setting);
103 - }else{
104 - $task_end_date = isset($task->end_date) ? $task->end_date: "" ;
105 - }
106 - }
107 -} elseif($wppm_task_time == 0){
108 - $tsDate = isset($task->start_date) ? new DateTime($task->start_date): "";
109 - $teDate = isset($task->end_date) ? new DateTime($task->end_date):"";
110 - $task_start_date = !empty($tsDate) ? $tsDate->format( $wppm_date_setting):"";
111 - $task_end_date = !empty($teDate) ? $teDate->format( $wppm_date_setting):"";
112 - if($task->start_date=='0000-00-00 00:00:00'){
113 - if($wppm_date_setting=='Y-m-d H:i:s'){
114 - $task_start_date = '0000-00-00';
115 - }elseif($wppm_date_setting=='d-m-Y H:i:s'){
116 - $task_start_date = '00-00-0000';
117 - }elseif($wppm_date_setting=='m-d-Y H:i:s'){
118 - $task_start_date = '00-00-0000';
119 - }else{
120 - $task_start_date = '0000-00-00';
121 - }
122 - }
123 - if($task->end_date=='0000-00-00 00:00:00'){
124 - if($wppm_date_setting=='Y-m-d H:i:s'){
125 - $task_end_date = '0000-00-00';
126 - }elseif($wppm_date_setting=='d-m-Y H:i:s'){
127 - $task_end_date = '00-00-0000';
128 - }elseif($wppm_date_setting=='m-d-Y H:i:s'){
129 - $task_end_date = '00-00-0000';
130 - }
131 - else{
132 - $task_end_date = '0000-00-00';
133 - }
134 - }if($task->start_date!='0000-00-00 00:00:00'){
135 - if($wppm_date_setting=='Y-m-d H:i:s'){
136 - $task_start_date = $tsDate->format('Y-m-d');
137 - }elseif($wppm_date_setting=='d-m-Y H:i:s'){
138 - $task_start_date = $tsDate->format('d-m-Y');
139 - }elseif($wppm_date_setting=='m-d-Y H:i:s'){
140 - $task_start_date = $tsDate->format('m-d-Y');
141 - }else{
142 - $task_start_date = $tsDate->format('Y-m-d');
143 - }
144 - }if($task->end_date!='0000-00-00 00:00:00'){
145 - if($wppm_date_setting=='Y-m-d H:i:s'){
146 - $task_end_date = $teDate->format('Y-m-d');
147 - }elseif($wppm_date_setting=='d-m-Y H:i:s'){
148 - $task_end_date = $teDate->format('d-m-Y');
149 - }elseif($wppm_date_setting=='m-d-Y H:i:s'){
150 - $task_end_date = $teDate->format('m-d-Y');
151 - }else{
152 - $task_end_date = $teDate->format('Y-m-d');
153 - }
154 - }
155 -}
156 -$flag = false;
157 -$wppm_task_fillter = $wpdb->get_results( $wpdb->prepare("SELECT * FROM {$wpdb->prefix}wppm_task where id=%d",$id));
158 -if(!empty($wppm_task_fillter)){
159 - foreach($wppm_task_fillter as $key_filter=>$val_filter){
160 - $val_array = (array) $val_filter;
161 - $tusers = $val_array['users'];
162 - $tusers_arr = explode(',',$tusers);
163 - $tproject_id = $val_array['project'];
164 - $tproject_id = absint($tproject_id);
165 - if(!empty($tusers) && in_array($current_user->ID,$tusers_arr)){
166 - $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));
167 - $project_users = $wpdb->get_var( $wpdb->prepare("SELECT users FROM {$wpdb->prefix}wppm_project WHERE id = %d",$tproject_id));
168 - $project_users_arr = explode(',',(string)$project_users);
169 - if((!empty($project_user_role)) && ($project_user_role == 1) && in_array($current_user->ID,$project_users_arr)){
170 - $flag= true;
171 - break;
172 - }
173 - }
174 - }
175 -}
176 -$project_creator = $wpdb->get_var( $wpdb->prepare("SELECT created_by FROM {$wpdb->prefix}wppm_project WHERE created_by = %d",$cu_id));
177 -?>
178 -<form id="wppm_open_task" method="post">
179 - <div id="wppm_alert_success" class="alert alert-success wppm_alert" style="display:none;" role="alert">
180 - <img src="<?php echo esc_url( WPPM_PLUGIN_URL . 'asset/images/success.svg'); ?>" alt="success"> <span class="wppm_alert_text"></span>
181 - </div>
182 - <div id="wppm_alert_error" class="alert alert-danger wppm_alert" style="display:none;" role="alert">
183 - <img src="<?php echo esc_url( WPPM_PLUGIN_URL . 'asset/images/warning-triangle.svg'); ?>" alt="warning-triangle"> <span class="wppm_alert_text"></span>
184 - </div>
185 - <div class="wppm_headers row">
186 - <div class="col-sm-8">
187 - <span class="wppm-heading-inline">
188 - <?php echo esc_html_e('Task','taskbuilder');?>
189 - </span><?php
190 - if(($current_user->has_cap('manage_options') || $wppmfunction->has_permission('add_new_task',$task_id) || ($flag==true) || $project_creator!="") && $task->is_archived!=1){
191 - $style = "display:inline;";
192 - }else{
193 - $style = "display:none;";
194 - }
195 - $style = apply_filters('wppm_add_new_task_btn_style_open_task_form',$style);
196 - 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){
197 - $archive_style= "display:inline;";
198 - }else{
199 - $archive_style= "display:none;";
200 - }
201 - if($proj_id==0) {
202 - ?> <span onclick="wppm_add_new_task(<?php echo esc_attr($proj_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>
203 - <?php }
204 - else{ ?>
205 - <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>
206 - <?php } ?>
207 - <?php if($proj_id==0) {
208 - $task_list_function = ($task_list_view==1)?"wppm_get_task_list()":"wppm_view_task_search_filter()";
209 - ?>
210 - <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>
211 - <?php }
212 - else{
213 - ?>
214 - <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>
215 - <?php } ?>
216 - <?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 )? "display:inline":"display:none"; ?>
217 - <?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) ? "display:inline":"display:none"; ?>
218 - <?php $ar_css = ($task->is_archived==1) ? "display:none;" : "display:inline"; ?>
219 - <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) ?>)" style="<?php echo esc_attr($style) ?>"><img src="<?php echo esc_url( WPPM_PLUGIN_URL . 'asset/images/bin.svg'); ?>" alt="delete"></span>
220 - <div 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)?>)" style="<?php echo esc_attr($clone_style) ?>"><img src="<?php echo esc_url( WPPM_PLUGIN_URL . 'asset/images/duplicate.svg'); ?>" alt="clone"></div>
221 - <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>
222 - <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) ?>)" style="<?php echo esc_attr($archive_style) ?>"><img src="<?php echo esc_url( WPPM_PLUGIN_URL . 'asset/images/archive.svg'); ?>" alt="archive"></span>
223 - <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' ) ); ?>">
224 - <div class="menu" id="wppmprint_menu" onclick="event.stopPropagation();">
225 - <a href="#" id="wppm_openPDF" onclick="wppm_open_pdf(<?php echo esc_attr($id) ?>)">🖨️ <?php echo esc_html_e('Open In Browser','taskbuilder');?></a>
226 - <a href="#" id="wppm_downloadPDF" onclick="wppm_download_pdf(<?php echo esc_attr($id) ?>)">💾 <?php echo esc_html_e('Download PDF','taskbuilder');?></a>
227 - </div>
228 - <?php do_action('wppm_individual_task_button',$id);?>
229 - </div>
230 - </div>
231 - <div id="wppm_load_individual_task_container" class="row">
232 - <div class="col-sm-8 wppm_body col-md-9">
233 - <div class="wppm_task_details_container">
234 - <div class="row">
235 - <div class="col-sm-12">
236 - <span class="wppm_task_label"> <?php echo isset($task->task_name) ? esc_html($task->task_name ):"" ?>
237 - <?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) { ?>
238 - <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>
239 - <?php } ?>
240 - </span>
241 - </div>
242 - </div>
243 - <div class="row">
244 - <div class="col-sm-3">
245 - <span class="wppm_task_details_label"><?php echo esc_html_e('Project:','taskbuilder');?></span>
246 - </div>
247 - <div class="col-sm-9">
248 - <span class="wppm_task_details"><?php echo (isset($project_name))? esc_html($project_name ):"" ?></span>
249 - </div>
250 - </div>
251 - <div class="row">
252 - <div class="col-sm-3">
253 - <span class="wppm_task_details_label"><?php echo esc_html_e('Created On:','taskbuilder');?></span>
254 - </div>
255 - <div class="col-sm-9"><?php
256 - $tcDate = isset($task->date_created) ? new DateTime($task->date_created): "";
257 - if($wppm_task_time !=0){
258 - if($wppm_date_setting=='Y-m-d H:i:s'){
259 - $task_create_date = !empty($tcDate) ? $tcDate->format('Y-m-d H:i:s'):"";
260 - } elseif($wppm_date_setting=='d-m-Y H:i:s'){
261 - $task_create_date = !empty($tcDate) ? $tcDate->format('d-m-Y H:i:s'):"";
262 - } elseif($wppm_date_setting=='m-d-Y H:i:s'){
263 - $task_create_date = !empty($tcDate) ? $tcDate->format('m-d-Y H:i:s'):"";
264 - } else {
265 - $task_create_date = !empty($tcDate) ? $tcDate->format('Y-m-d H:i:s'):"";
266 - }
267 - } elseif($wppm_task_time == 0){
268 - if($wppm_date_setting=='Y-m-d H:i:s'){
269 - $task_create_date = !empty($tcDate) ? $tcDate->format('Y-m-d'):"";
270 - } elseif($wppm_date_setting=='d-m-Y H:i:s'){
271 - $task_create_date = !empty($tcDate) ? $tcDate->format('d-m-Y'):"";
272 - } elseif($wppm_date_setting=='m-d-Y H:i:s'){
273 - $task_create_date = !empty($tcDate) ? $tcDate->format('m-d-Y'):"";
274 - } else {
275 - $task_create_date = !empty($tcDate) ? $tcDate->format('Y-m-d'):"";
276 - }
277 - } ?>
278 - <span class="wppm_task_details"><?php echo (isset($task_create_date))? esc_html($task_create_date):"" ?></span>
279 - </div>
280 - </div>
281 - <?php if($wppm_default_task_date == 1 && $wppm_deafault_time_duration_task==0){ ?>
282 - <div class="row">
283 - <div class="col-sm-3">
284 - <span class="wppm_task_details_label"><?php echo esc_html_e('Start Date:','taskbuilder');?></span>
285 - </div>
286 - <div class="col-sm-9">
287 - <span class="wppm_task_details" id="wppm_edit_tstart_date"><?php echo (isset($task_start_date))? esc_html($task_start_date):"" ?></span>
288 - </div>
289 - <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' ) ); ?>">
290 - </div>
291 - <div class="row">
292 - <div class="col-sm-3">
293 - <span class="wppm_task_details_label"><?php echo esc_html_e('End Date:','taskbuilder');?></span>
294 - </div>
295 - <div class="col-sm-9">
296 - <?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"; ?>
297 - <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>
298 - </div>
299 - <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' ) ); ?>">
300 - </div>
301 - <?php }
302 - if($wppm_deafault_time_duration_task==1){
303 - $wppm_task_duration = $wppmfunction->wppm_get_duration($task->start_date,$task->end_date);
304 - $tstatus = isset($task->status) ? $task->status :"";
305 - $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"; ?>
306 - <div class="row">
307 - <div class="col-sm-3">
308 - <span class="wppm_task_details_label"><?php echo esc_html_e('Task Duration:','taskbuilder');?></span>
309 - </div>
310 - <div class="col-sm-9">
311 - <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>
312 - </div>
313 - </div> <?php
314 - }?>
315 - <div class="row">
316 - <div class="col-sm-3">
317 - <span class="wppm_task_details_label"><?php echo esc_html_e('Task Priority:','taskbuilder');?></span>
318 - </div>
319 - <div class="col-sm-9">
320 - <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>
321 - </div>
322 - </div>
323 - <div class="row">
324 - <div class="col-sm-3">
325 - <span class="wppm_task_details_label"><?php echo esc_html_e('Description:','taskbuilder');?></span>
326 - </div>
327 - <div class="col-sm-9">
328 - <span class="wppm_task_description"><?php echo (!empty($task_description))? wp_kses_post(wpautop($task_description)):"" ?></span>
329 - </div>
330 - </div>
331 - <?php do_action('wppm_after_task_details_in_open_task',$task->id, $task->project);?>
332 - </div>
333 - <div class="wppm_task_checklist_container" id="wppm_task_checklist_container">
334 - <div id="wppm_checklist_container">
335 - <?php
336 - if(!empty($wppm_checklist)){
337 - foreach( $wppm_checklist as $key=>$list){
338 - ?>
339 - <div class="row">
340 - <div class="col-sm-8">
341 - <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>
342 - </div>
343 - <?php
344 - $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"; ?>
345 - <?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"; ?>
346 - <?php if($wppmfunction->has_permission('add_checklist',$task->id) || $current_user->has_cap('manage_options')){ ?>
347 - <div class="col-sm-4" style="text-align:right;<?php echo esc_attr($check_style) ?>">
348 - <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>
349 - <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' ) ); ?>">
350 - </div>
351 - <?php }?>
352 - </div>
353 - <div class="wppm_progress_bar_container row">
354 - <div class="col-sm-4">
355 - <span class="wppm_progressbar_label" id="wppm_progressbar_label_<?php echo esc_attr($list->id)?>">0%</span>
356 - </div>
357 - <div class="wppm_progress_bar col-sm-8">
358 - <div id="CheckProgress_<?php echo esc_attr($list->id);?>" class="wppm_checkprogress" role="progressbar" style="width: 0%" aria-valuemin="0" aria-valuemax="100"></div>
359 - </div>
360 - </div>
361 - <?php
362 - $list_id = absint($list->id);
363 - $sql = $wpdb->prepare(
364 - "SELECT *
365 - FROM {$wpdb->prefix}wppm_checklist_items
366 - WHERE checklist_id = %d
367 - ORDER BY load_order ASC",
368 - $list_id
369 - );
370 - // Execute
371 - $wppm_checklist_items = $wpdb->get_results($sql);
372 - ?>
373 - <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;">
374 - <?php
375 - if(!empty( $wppm_checklist_items)){
376 - foreach($wppm_checklist_items as $key=>$val){
377 - $checked = $val->checked == 1 ? 'checked="checked"' : '';
378 - ?>
379 - <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;">
380 - <div class="col-sm-8" id="wppm_checklist_item_container_<?php echo esc_attr($val->id) ?>">
381 - <span class="wppm_chk_items_drag">☰</span>
382 - <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>
383 - <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' ) ); ?>">
384 - </div>
385 - <?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) { ?>
386 - <div class="col-sm-4" id="wppm_checklist_action_<?php echo esc_attr($val->id) ?>" style="text-align:right; display:none;cursor:pointer;">
387 - <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>
388 - <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' ) ); ?>">
389 - <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>
390 - <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' ) ); ?>">
391 - </div>
392 - <?php } ?>
393 - </li>
394 - <?php
395 - }
396 - } ?>
397 - <?php if(($wppmfunction->has_permission('add_checklist',$task->id) || $current_user->has_cap('manage_options')) && $task->is_archived!=1){ ?>
398 - <div class="row">
399 - <div class="col-sm-12 wppm_add_checklist_item_container_<?php echo esc_attr($list->id) ?>" style="padding-top:15px;">
400 - <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>
401 - </div>
402 - </div>
403 - <?php }?>
404 - <?php if(($wppmfunction->has_permission('add_checklist',$task->id) || $current_user->has_cap('manage_options')) && $task->is_archived!=1){ ?>
405 - <div class="row">
406 - <div class="col-sm-12" style="display:none;" id="wppm_add_checklist_label_container_<?php echo esc_attr($list->id) ?>">
407 - <div class="row" id="wppm_add_new_checklist_item_<?php echo esc_attr($list->id) ?>">
408 - <div class="col-sm-12">
409 - <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;">
410 - <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) ?>)">
411 - <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' ) ); ?>">
412 - <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>
413 - </div>
414 - </div>
415 - </br>
416 - </div>
417 - </div>
418 - <?php }?>
419 - <hr class="wppm_checklist_divider">
420 - </ul>
421 - <?php
422 - }
423 - } ?>
424 - </div><?php
425 - if(($wppmfunction->has_permission('add_checklist',$task->id) || $current_user->has_cap('manage_options')) && $task->is_archived!=1){ ?>
426 - <div id="wppm_add_checklist_container">
427 - <div class="row">
428 - <div class="col-sm-12">
429 - <span id="wppm_add_checklist" onclick="wppm_add_checklist()"> <?php echo esc_html_e('+Add a checklist','taskbuilder')?> </span>
430 - </div>
431 - </div>
432 - <div class="row" id="wppm_add_new_checklist" style="display:none;">
433 - <div class="col-sm-12">
434 - <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">
435 - <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) ?>)">
436 - <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' ) ); ?>">
437 - <span onclick="wppm_remove_add_checklist()"><img src="<?php echo esc_url( WPPM_PLUGIN_URL . 'asset/images/cross1.svg'); ?>"></span>
438 - </div>
439 - </div>
440 - </br>
441 - </div><?php
442 - } ?>
443 - </div>
444 - <div id="wppm_activity_container" style="<?php echo ($wppm_task_hide_comment_section==0) ? 'display:none;' : 'display:block;' ?>">
445 - <div class="row">
446 - <div class="col-sm-12" style="margin-top:5px;">
447 - <span class="wppm_task_discussion"><?php echo esc_html_e('Comment','taskbuilder')?></span><br>
448 - </div>
449 - </div>
450 - <div class="row">
451 - <div class="col-sm-12" style="<?php echo ($task->is_archived==1) ? 'display:none;' : 'display:block;' ?>">
452 - <textarea id="wppm_task_comment" placeholder="<?php echo esc_attr__('Write a comment...','taskbuilder');?>" onclick="wppm_add_task_comment()" name="wppm_task_comment"></textarea>
453 - </div>
454 - </div>
455 - <div class="row" id="wppm_comment_btn" style="<?php echo ($task->is_archived==1) ? 'display:none;' : 'display:block;' ?>">
456 - <div class="col-sm-6">
457 - <span id="wppm_attach_file" onclick="wppm_upload_file()"><?php echo esc_html_e('Attach Files','taskbuilder')?></span>
458 - </div>
459 - <div class="col-sm-6">
460 - <button type="button" id="wppm_individual_cancel_comment_btn" onclick="wppm_cancel_comment();" class="wppm-btn-cancel">
461 - <?php echo esc_html_e('Cancel','taskbuilder')?>
462 - </button>
463 - <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">
464 - <?php echo esc_html_e('SEND','taskbuilder')?>
465 - </button>
466 - <input type="hidden" name="_ajax_nonce" value="<?php echo esc_attr( wp_create_nonce( 'wppm_submit_task_comment' ) ); ?>">
467 - </div>
468 - </div>
469 - <div class="row" style="<?php echo ($task->is_archived==1) ? 'display:none;' : 'display:block;' ?>">
470 - <div class="wppm_attachment_container col-sm-12" style="display:none;">
471 - </div>
472 - </div>
473 - </div>
474 - <div class="wppm_thread_container" style="<?php echo ($wppm_task_hide_comment_section==0) ? 'display:none;' : 'display:block;' ?>">
475 - <?php
476 - if(!empty($task_comment)){
477 - foreach($task_comment as $comment){
478 - $task_comment_meta = $wpdb->get_row( $wpdb->prepare(
479 - "SELECT *
480 - FROM {$wpdb->prefix}wppm_task_comment_meta
481 - WHERE task_id = %d
482 - AND comment_id = %d",
483 - absint($id),
484 - absint($comment->id)
485 - )
486 - );
487 - $user = get_userdata( $comment->created_by );
488 - $comment_body = (!empty($comment->body) ? wp_kses_post(wpautop($comment->body)) : '');
489 - $date = wp_date("Y-m-d H:i:s" ,strtotime($comment->create_time));
490 - $thread_date = wp_date("d F Y, h:i:s A" ,strtotime($date));
491 - $attachment_ids = isset($comment->attachment_ids)? $comment->attachment_ids : '';
492 - if($attachment_ids!=""){
493 - $attachments = explode(",",$attachment_ids);
494 - } else {
495 - $attachments = array();
496 - }
497 - ?>
498 - <div class="wppm_thread">
499 - <div class="wppm_thread_avatar">
500 - <?php echo (get_avatar($comment->created_by, 40));?>
501 - </div>
502 - <div class="wppm_thread_body">
503 - <div class="wppm_thread_user_name">
504 - <strong style="color:<?php echo esc_attr($appearance_settings['comment-primary-color']);?>"><?php echo isset($user->display_name) ? esc_html($user->display_name) : '' ?></strong>
505 - <span><?php if(!empty($comment->body) && (isset($task_comment_meta->comment_type) && $task_comment_meta->comment_type=='change_task_status')){
506 - $comment_log_body = unserialize($comment->body);
507 - $prev_status = $comment_log_body['prev_status'];
508 - $new_status = $comment_log_body['new_status'];
509 - if(isset($prev_status)){
510 - $task_prev_status = $wpdb->get_row( $wpdb->prepare(
511 - "SELECT * FROM {$wpdb->prefix}wppm_task_statuses where id = %d",
512 - absint($prev_status)
513 - ));
514 - }
515 - if(isset($new_status)){
516 - $task_new_status = $wpdb->get_row( $wpdb->prepare(
517 - "SELECT * FROM {$wpdb->prefix}wppm_task_statuses where id = %d",
518 - absint($new_status)
519 - ));
520 - }
521 - printf(
522 - esc_html__( 'Changed status from %1$s to %2$s', 'taskbuilder' ),
523 - esc_html( $task_prev_status->name ),
524 - esc_html( $task_new_status->name )
525 - );
526 - } if(!empty($comment->body) && (isset($task_comment_meta->comment_type) && $task_comment_meta->comment_type=='change_task_creator')){
527 - $comment_log_body = unserialize($comment->body);
528 - $prev_user = $comment_log_body['prev_user'];
529 - $new_user = $comment_log_body['new_user'];
530 - $prev_user_data = get_userdata($prev_user);
531 - $new_user_data = get_userdata($new_user);
532 - printf(
533 - esc_html__( 'Changed creator from %1$s to %2$s', 'taskbuilder' ),
534 - esc_html( $prev_user_data->display_name ),
535 - esc_html( $new_user_data->display_name )
536 - );
537 - }
538 - if( !empty($comment->body) && (isset($task_comment_meta->comment_type) && $task_comment_meta->comment_type=='change_assign_user')){
539 - esc_html_e("changed the Assignee","taskbuilder");
540 - }
541 - if(!empty($comment->body) && (isset($task_comment_meta->comment_type) && $task_comment_meta->comment_type=='change_task_priority')){
542 - $comment_log_body = unserialize($comment->body);
543 - $prev_prio = $comment_log_body['prev_prio'];
544 - $new_prio = $comment_log_body['new_prio'];
545 - if(isset($prev_prio)){
546 - $prev_prio = absint($prev_prio);
547 - $task_prev_prio = $wpdb->get_row( $wpdb->prepare(
548 - "SELECT * FROM {$wpdb->prefix}wppm_task_priorities where id = %d",
549 - $prev_prio
550 - ));
551 - }
552 - if(isset($new_prio)){
553 - $new_prio = absint($new_prio);
554 - $task_new_prio = $wpdb->get_row( $wpdb->prepare(
555 - "SELECT * FROM {$wpdb->prefix}wppm_task_priorities where id = %d",
556 - $new_prio
557 - ));
558 - }
559 - $task_prev_prio_name = !empty($task_prev_prio) ? $task_prev_prio->name: "None";
560 - $task_new_prio_name = !empty($task_new_prio) ? $task_new_prio->name: "None";
561 - printf(
562 - esc_html__( 'Changed priority from %1$s to %2$s', 'taskbuilder' ),
563 - esc_html( $task_prev_prio_name ),
564 - esc_html( $task_new_prio_name )
565 - );
566 - }
567 - ?>
568 - <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>
569 - <div class="wppm_thread_action">
570 - <?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)){ ?>
571 - <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>
572 - <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>
573 - <?php } ?>
574 - </div>
575 - </div>
576 - <div class="wppm_thread_messege" style="color:<?php echo esc_attr($appearance_settings['comment-secondary-color']);?>">
577 - <?php
578 - $allowedtags = array( 'br' => array(), 'abbr' => array('title' => array(),), 'p' => array(), 'strong' => array(), 'a' => array('href' => array(), 'title' => array(), 'target'=> array(), 'rel'=>array()),'em' =>array(),'span' =>array(), 'blockquote'=>array('cite' => array(),),'div' => array('class' => array(),'title' => array(),'style' => array(),),'ul'=>array(),'li'=>array(),'ol'=>array(),'img' => array( 'alt'=> array(),'class' => array(),'height' => array(),'src'=> array(),'width'=> array(),));
579 - 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'))){
580 - echo wp_kses(wpautop($comment_body),$allowedtags);
581 - } elseif(!empty($comment->body) && (isset($task_comment_meta->comment_type) && $task_comment_meta->comment_type=='change_task_status')){ ?>
582 - <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
583 - }elseif(!empty($comment->body) && (isset($task_comment_meta->comment_type) && $task_comment_meta->comment_type=='change_task_creator')){ ?>
584 - <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
585 - } elseif(!empty($comment->body) && (isset($task_comment_meta->comment_type) && $task_comment_meta->comment_type=='change_assign_user')) {
586 - $comment_log_body = unserialize($comment->body);
587 - $prev_assign_user = $comment_log_body['prev_assign_user'];
588 - $new_assign_user = $comment_log_body['new_assign_user'];
589 - $prev_assign_user_array = array();
590 - $new_assign_user_array = array();
591 - if(!empty($prev_assign_user)){
592 - $prev_assign_user_array = explode(",",$prev_assign_user);
593 - }
594 - if(!empty($new_assign_user)){
595 - $new_assign_user_array = explode(",",$new_assign_user);
596 - }
597 - $assign_user_name = array();
598 - $assign_user_name_str = "";
599 - if(!empty($prev_assign_user_array)){
600 - foreach($prev_assign_user_array as $val){
601 - $assign_user = get_userdata($val);
602 - $assign_user_name[] = $assign_user->display_name;
603 - }
604 - $assign_user_name_str = implode(",",$assign_user_name);
605 - }
606 - $new_assign_user_name = array();
607 - $new_assign_user_name_str = "";
608 - if(!empty($new_assign_user_array)){
609 - foreach($new_assign_user_array as $val){
610 - $new_assign_user = get_userdata($val);
611 - $new_assign_user_name[] = $new_assign_user->display_name;
612 - }
613 - $new_assign_user_name_str = implode(",",$new_assign_user_name);
614 - }
615 - ?>
616 - <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
617 - } elseif(!empty($comment->body) && (isset($task_comment_meta->comment_type) && $task_comment_meta->comment_type=='change_task_priority')){ ?>
618 - <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
619 - } ?>
620 -
621 - </div>
622 - <?php
623 - if(!empty($attachments)&& (isset($task_comment_meta->comment_type) && !($task_comment_meta->comment_type=='delete_task_comment'))):?> <br>
624 - <strong class="wppm_attachment_title"><?php echo esc_html_e('Attachments','taskbuilder');?>:</strong><br>
625 - <table class="wppm_attachment_tbl">
626 - <tbody>
627 - <?php
628 - if(!empty($attachments)){
629 - foreach( $attachments as $attachment ):
630 - $download_url = site_url('/').'?wppm_attachment='.$attachment.'&tid='.$id.'&tac='.$auth_id;
631 - $attachment = absint($attachment);
632 - $attach = $wpdb->get_row( $wpdb->prepare("SELECT * FROM {$wpdb->prefix}wppm_attachments where id=%d",$attachment));
633 - $findStr = ".txt";
634 - if(!empty( $attach)){
635 - $attachment_name = preg_replace('/' . $findStr . '/', "", $attach->name, 1);
636 - $attachment_name = sanitize_file_name($attachment_name);
637 - }
638 - if((!empty($attachment_name))){
639 - ?>
640 - <tr class="wppm_attachment_tr">
641 - <td>
642 - <a class="wppm_attachment_link" href="<?php echo esc_url($download_url) ?>" target="_blank">
643 - <span class="wppm_attachment_file_name" style="padding: 7px;"><?php echo isset($attach->file_name) ? esc_html($attach->file_name):"";?></span></a>
644 - <?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)){ ?>
645 - <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>
646 - <?php } ?>
647 - </td>
648 - </tr>
649 - <input type="hidden" name="wppm_ajax_nonce" id="wppm_ajax_nonce" value="<?php echo esc_attr( wp_create_nonce( 'wppm_remove_thread_attachment' ) ); ?>">
650 - <?php }
651 - endforeach;
652 - } ?>
653 - </tbody>
654 - </table>
655 - <?php do_action('wppm_after_comment_attachment',$id,$comment->id);?>
656 - <?php endif;?>
657 - </div>
658 - </div>
659 - <?php }
660 - } ?>
661 - </div>
662 - </div>
663 - <div class="wppm_individual_task_widget col-sm-4 wppm_sidebar col-md-3">
664 - <div class="row wppm_widget" id="wppm_status_widget">
665 - <div class="wppm-widget-header" style="background-color:<?php echo esc_attr($appearance_settings['widget-header-bg-color'])?>">
666 - <h4 class="widget_header" style="color:<?php echo esc_attr($appearance_settings['widget-header-text-color'])?>"><?php echo esc_html_e('Status','taskbuilder')?></h4>
667 - <?php
668 - 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))){
669 - ?>
670 - <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>
671 - <?php
672 - }
673 - ?>
674 - </div>
675 - <hr class="widget_divider">
676 - <div class="wppm-widget-body" style="background-color:<?php echo esc_attr($appearance_settings['widget-body-bg-color'])?>">
677 - <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>
678 - </div>
679 - </div>
680 - <div class="row wppm_widget" id="wppm_raisedby_widget">
681 - <div class="wppm-widget-header" style="background-color:<?php echo esc_attr($appearance_settings['widget-header-bg-color'])?>">
682 - <h4 class="widget_header" style="color:<?php echo esc_attr($appearance_settings['widget-header-text-color'])?>">
683 - <?php echo esc_html_e('Task Creator','taskbuilder')?></h4>
684 - <?php if ((($wppmfunction->has_permission('change_raised_by',$id ) || $current_user->has_cap('manage_options')) && ($task->is_archived!=1))) { ?>
685 - <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>
686 - <?php } ?>
687 - </div>
688 - <hr class="widget_divider"> <?php
689 - if(isset($task->created_by)){
690 - $user_info = get_userdata($task->created_by);
691 - }else{
692 - $user_info ="";
693 - }
694 - ?>
695 - <div class="wppm-widget-body" style="background-color:<?php echo esc_attr($appearance_settings['widget-body-bg-color'])?>">
696 - <div style="padding:2px 0;">
697 - <span class="wppm_task_user_avatar"><?php echo (get_avatar($task->created_by, 25, "mysteryman")); ?></span>
698 - <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>
699 - </div>
700 - </div>
701 - </div>
702 - <div class="row wppm_widget" id="wppm_task_users_widget_container">
703 - <div class="wppm-widget-header" style="background-color:<?php echo esc_attr($appearance_settings['widget-header-bg-color'])?>">
704 - <h4 class="widget_header" style="color:<?php echo esc_attr($appearance_settings['widget-header-text-color'])?>;"><?php echo esc_html_e('Users','taskbuilder')?></h4>
705 - <?php if ((($wppmfunction->has_permission('assign_task_users',$id ) || $current_user->has_cap('manage_options')) && ($task->is_archived!=1))) { ?>
706 - <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>
707 - <?php } ?>
708 - </div>
709 - <hr class="widget_divider">
710 - <div class="wppm-widget-body" style="background-color:<?php echo esc_attr($appearance_settings['widget-body-bg-color'])?>">
711 - <div id="wppm_task_users">
712 - <?php
713 - $i=0;
714 - if(!empty($users)){
715 - foreach($users as $user) {
716 - $user_data = get_userdata($user);
717 - if(!empty($project_data['users'])){
718 - $proj_users = explode(',',$project_data['users']);
719 - if(in_array($user,$proj_users)){
720 - $i++;
721 - ?>
722 - <div style="padding:2px 0;">
723 - <span class="wppm_task_user_avatar"><?php echo (get_avatar($user, 25, "mysteryman")); ?></span>
724 - <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>
725 - </div>
726 - <?php
727 - }
728 - }
729 - }
730 - }
731 - if($i==0){ ?>
732 - <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
733 - }
734 - ?>
735 - </div>
736 - </div>
737 - </div>
738 - <?php do_action('wppm_after_task_widgets',$id,$task_id );?>
739 - </div>
740 - <input type="hidden" id="wppm_nonce" value="<?php echo esc_attr(wp_create_nonce('wppm_upload_file'))?>">
741 - <input type="file" id="wppm_attachment_upload" class="hidden" onchange="">
742 - </div>
743 -</form>
744 -<style>
745 - .wppm_comment_date i:hover{
746 - color: <?php echo esc_attr($appearance_settings['comment-date-hover-color'])?>;
747 - }
748 - #Layer_1{
749 - fill:red!important;
750 - }
751 -</style>
752 -<script>
753 -jQuery( document ).ready( function( jQuery ) {
754 - const button = document.getElementById('wppm_print_task_btn');
755 - const box = document.getElementById('wppmprint_menu');
756 -
757 - // Show box on button click
758 - button.addEventListener('click', (e) => {
759 - e.stopPropagation(); // prevent document click from firing immediately
760 - box.style.display = 'flex';
761 - });
762 -
763 - // Prevent hiding when clicking inside box
764 - box.addEventListener('click', (e) => {
765 - e.stopPropagation();
766 - });
767 -
768 - // Hide when clicking outside
769 - document.addEventListener('click', () => {
770 - box.style.display = 'none';
771 - });
772 -<?php
773 - if ((($current_user->ID && $current_user->has_cap('manage_options')) || $wppmfunction->has_permission('change_task_details',$task->id))){ ?>
774 - jQuery("#wppm_edit_tstart_date").flatpickr({
775 - enableTime: true,
776 - dateFormat: "Y-m-d H:i",
777 - onChange: function(selectedDates, dateStr, instance) {
778 - var data = {
779 - action: 'wppm_set_change_task_start_date',
780 - task_id:<?php echo esc_attr($task->id);?>,
781 - date:dateStr,
782 - _ajax_nonce:jQuery('#wppm_edit_tstart_date_ajax_nonce').val()
783 - };
784 - jQuery.post(wppm_admin.ajax_url, data, function(response) {
785 - instance.close();
786 - wppm_open_task(<?php echo esc_attr($task->id);?>);
787 - });
788 - },
789 - });
790 - jQuery("#wppm_edit_tend_date").flatpickr({
791 - enableTime: true,
792 - dateFormat: "Y-m-d H:i",
793 - onChange: function(selectedDates, dateStr, instance) {
794 - var data = {
795 - action: 'wppm_set_change_task_end_date',
796 - task_id:<?php echo esc_attr($task->id);?>,
797 - date:dateStr,
798 - _ajax_nonce:jQuery('#wppm_edit_tend_date_ajax_nonce').val()
799 - };
800 - jQuery.post(wppm_admin.ajax_url, data, function(response) {
801 - instance.close();
802 - wppm_open_task(<?php echo esc_attr($task->id);?>);
803 - });
804 - },
805 - });
806 - <?php } ?>
807 - <?php foreach ($wppm_checklist as $chklist) { ?>
808 - var $checkboxes = jQuery('.wppm_checklist_item_'+<?php echo esc_attr($chklist->id);?>);
809 - var $progress = jQuery('#CheckProgress_'+<?php echo esc_attr($chklist->id);?>);
810 - var total = $checkboxes.length;
811 - var checked = jQuery('.wppm_checklist_item_'+<?php echo esc_attr($chklist->id);?>).filter(':checked').length;
812 - var progressWidth = Math.ceil((checked / total) * 100);
813 - jQuery('#CheckProgress_'+<?php echo esc_attr($chklist->id);?>).css('background','#5ba4cf');
814 - jQuery('#CheckProgress_'+<?php echo esc_attr($chklist->id);?>).css('width', progressWidth + '%');
815 - if(progressWidth>0){
816 - jQuery('#wppm_progressbar_label_'+<?php echo esc_attr($chklist->id);?>).text(progressWidth+'%');
817 - }
818 - <?php $wppm_checklist_items = $wpdb->get_results( $wpdb->prepare("SELECT * FROM {$wpdb->prefix}wppm_checklist_items where checklist_id=%d",$chklist->id));
819 - foreach ($wppm_checklist_items as $chkitems) {
820 - ?> jQuery( '#wppm_checklist_'+<?php echo esc_attr($chkitems->id);?>).on("mouseover", function () {
821 - jQuery( '#wppm_checklist_action_'+<?php echo esc_attr($chkitems->id);?>).css("display","inline");
822 - jQuery( '#wppm_checklist_'+<?php echo esc_attr($chkitems->id);?>).css("background-color","#e7e8ea");
823 - })
824 - jQuery( '#wppm_checklist_'+<?php echo esc_attr($chkitems->id);?>).on("mouseout", function () {
825 - jQuery( '#wppm_checklist_action_'+<?php echo esc_attr($chkitems->id);?>).css("display","none");
826 - jQuery( '#wppm_checklist_'+<?php echo esc_attr($chkitems->id);?>).css("background-color","#ffffff");
827 - })
828 - <?php
829 - }
830 - }
831 - $bold = (isset($wppm_toolbar_actions['bold']) && $wppm_toolbar_actions['bold']==1)? 'bold' :"";
832 - $italic = (isset($wppm_toolbar_actions['italic']) && $wppm_toolbar_actions['italic']==1)? 'italic' :"";
833 - $underline = (isset($wppm_toolbar_actions['underline']) && $wppm_toolbar_actions['underline']==1)?'underline' :"";
834 - $blockquote = (isset($wppm_toolbar_actions['blockquote']) && $wppm_toolbar_actions['blockquote']==1)? 'blockquote' :"";
835 - $align = (isset($wppm_toolbar_actions['align']) && $wppm_toolbar_actions['align']==1)? ' alignleft aligncenter alignright ' :"";
836 - $bullist = (isset($wppm_toolbar_actions['bullist']) && $wppm_toolbar_actions['bullist']==1)? $bullist = 'bullist' :"";
837 - $numlist = (isset($wppm_toolbar_actions['numlist']) && $wppm_toolbar_actions['numlist']==1)? $numlist = 'numlist' :"";
838 - $rtl = (isset($wppm_toolbar_actions['rtl']) && $wppm_toolbar_actions['rtl']==1)? $rtl = 'rtl' :"";
839 - $link = (isset($wppm_toolbar_actions['link']) && $wppm_toolbar_actions['link']==1)? $link = 'link' :"";
840 - $image = (isset($wppm_toolbar_actions['wppm_insert_editor_img']) && $wppm_toolbar_actions['wppm_insert_editor_img']==1)? $image = 'image' :"";
841 - $forecolor = (isset($wppm_toolbar_actions['forecolor']) && $wppm_toolbar_actions['forecolor']==1)? $forecolor = 'forecolor' :"";
842 - $backcolor = (isset($wppm_toolbar_actions['backcolor']) && $wppm_toolbar_actions['backcolor']==1)? $backcolor = 'backcolor' :"";
843 - $strikethrough = (isset($wppm_toolbar_actions['strikethrough']) && $wppm_toolbar_actions['strikethrough']==1)? $strikethrough = 'strikethrough' :"";
844 - $toolbar = trim("$bold $italic $underline $blockquote | $align | $bullist $numlist | $rtl | $link $image | $forecolor $backcolor $strikethrough");
845 - if(($wppm_tinymce_visibility_open_task==1)){ ?>
846 - if((wppm_admin.rich_text_editor) && (wppm_admin.rich_text_editor.trim().length > 0) && (wppm_admin.rich_text_editor == 1)){
847 - tinymce.remove();
848 - tinymce.init({
849 - selector:'#wppm_task_comment',
850 - body_id: 'wppm_task_comment',
851 - directionality : '<?php //echo 'rtl'; ?>',
852 - menubar: false,
853 - statusbar: false,
854 - height : '200',
855 - width : '100%',
856 - plugins: [
857 - 'lists link image directionality paste textcolor'
858 - ],
859 - image_advtab: true,
860 - toolbar:'<?php echo esc_js( $toolbar ); ?>',
861 - branding: false,
862 - autoresize_bottom_margin: 20,
863 - browser_spellcheck : true,
864 - relative_urls : false,
865 - remove_script_host : false,
866 - convert_urls : true,
867 - paste_as_text: true,
868 - setup: function (editor) {
869 - }
870 - });
871 - jQuery('#wppm_comment_btn').show();
872 - }
873 - <?php } ?>
874 -});
875 -
876 -jQuery(function(jQuery){
877 - // Checklist Sorting
878 - jQuery(".wppm_checklist_items_container").sortable({
879 - handle: ".wppm_chk_items_drag",
880 - update: function() {
881 - let order = [];
882 - jQuery(this).find("li").each(function(){
883 - order.push(jQuery(this).data("id")); // checklist item id
884 - });
885 -
886 - // AJAX Save
887 - jQuery.post(wppm_admin.ajax_url, {
888 - action: "wppm_update_checklist_order",
889 - order: order,
890 - task_id: <?php echo esc_attr($id); ?>,
891 - _ajax_nonce: '<?php echo esc_attr( wp_create_nonce( 'wppm_update_checklist_order' ) ); ?>'
892 - }, function(response_str){
893 - var response = JSON.parse(response_str);
894 - jQuery('.wppm_submit_wait').hide();
895 - if (response.sucess_status=='1') {
896 - jQuery('#wppm_alert_success .wppm_alert_text').text(response.messege);
897 - }
898 - jQuery('#wppm_alert_success').slideDown('fast',function(){});
899 - setTimeout(function(){ jQuery('#wppm_alert_success').slideUp('fast',function(){}); }, 3000);
900 - });
901 - }
902 - });
903 -
904 -});
905 -
906 -function wppm_cancel_comment(){ <?php
907 - if(!empty($wppm_rich_text_editor) && ($wppm_rich_text_editor == 1)){
908 - ?>
909 - tinyMCE. activeEditor. setContent('');
910 - tinymce.remove('#wppm_task_comment');
911 - jQuery('#wppm_comment_btn').hide();
912 - <?php } else{
913 - ?>
914 - jQuery('#wppm_task_comment').css("width", "80%");
915 - jQuery('#wppm_task_comment').css("height", "30px");
916 - jQuery('#wppm_task_comment').css("color", "#000");
917 - jQuery('#wppm_task_comment').css("padding", "5px");
918 - jQuery('#wppm_task_comment').css(" margin-bottom", "15px");
919 - jQuery('#wppm_task_comment').css("overflow", "hidden");
920 - jQuery('#wppm_task_comment').css("border", "1 px solid #eee");
921 - jQuery('#wppm_task_comment').css("color", "#eee");
922 - jQuery('#wppm_task_comment').css("margin-top", "10px");
923 - jQuery('#wppm_comment_btn').hide();
924 - <?php }?>
925 -}
926 -
927 -function wppm_add_task_comment(){
928 - if((wppm_admin.rich_text_editor == 1)){
929 - tinymce.remove();
930 - tinymce.init({
931 - selector:'#wppm_task_comment',
932 - body_id: 'wppm_task_comment',
933 - directionality : '<?php //echo 'rtl'; ?>',
934 - menubar: false,
935 - statusbar: false,
936 - height : '200',
937 - width : '100%',
938 - plugins: [
939 - 'lists link image directionality paste textcolor'
940 - ],
941 - image_advtab: true,
942 - toolbar:'<?php echo esc_js( $toolbar ); ?>',
943 - branding: false,
944 - autoresize_bottom_margin: 20,
945 - browser_spellcheck : true,
946 - relative_urls : false,
947 - remove_script_host : false,
948 - convert_urls : true,
949 - paste_as_text: true,
950 - setup: function (editor) {
951 - }
952 - });
953 - } else{
954 - jQuery('#wppm_task_comment').css("width", "100%");
955 - jQuery('#wppm_task_comment').css("height", "160px");
956 - jQuery('#wppm_task_comment').css("color", "#000");
957 - }
958 - jQuery('#wppm_comment_btn').show();
959 -}
960 -
961 -function wppm_submit_task_comment(id,proj_id){
962 - var dataform = new FormData(jQuery('#wppm_open_task')[0]);
963 - dataform.append('action','wppm_submit_task_comment');
964 - if((wppm_admin.rich_text_editor == 1)){
965 - var comment_body = tinyMCE.get('wppm_task_comment').getContent().trim();
966 - } else{
967 - var comment_body = jQuery("#wppm_task_comment").val();
968 - }
969 - dataform.append('comment_body',comment_body);
970 - dataform.append('task_id',id);
971 - jQuery('#wppm_task_container').html(wppm_admin.loading_html);
972 - jQuery.ajax({
973 - url: wppm_admin.ajax_url,
974 - type: 'POST',
975 - data: dataform,
976 - processData: false,
977 - contentType: false
978 - })
979 - .done(function (response_str) {
980 - if((proj_id!=0)||(proj_id!="")){
981 - wppm_open_project_tasks(id,proj_id);
982 - }else if((proj_id==0)||(proj_id=="")){
983 - wppm_open_task(id);
984 - }
985 - });
986 -}
987 -
988 -function wppm_add_checklist_item(checklist_id){
989 - jQuery('#wppm_add_checklist_label_container_'+checklist_id).show();
990 - jQuery('#wppm_add_checklist_item_btn_'+checklist_id).hide();
991 - jQuery('.wppm_add_checklist_label_container_'+checklist_id).show();
992 - jQuery('.wppm_checklist_item_label_'+checklist_id).css('height', '30px');
993 - jQuery('.wppm_add_new_item_btn_'+checklist_id).css('margin', '10px');
994 -}
995 -
996 -function wppm_add_checklist(){
997 - jQuery('#wppm_add_checklist').hide();
998 - jQuery('#wppm_add_new_checklist').show();
999 -}
1000 -
1001 -function wppm_remove_add_checklist_container(checklist_id){
1002 - jQuery('#wppm_add_checklist_label_container_'+checklist_id).hide();
1003 - jQuery('#wppm_add_checklist_item_btn_'+checklist_id).show();
1004 -}
1005 -
1006 -function wppm_remove_add_checklist(){
1007 - jQuery('#wppm_add_new_checklist').hide();
1008 - jQuery('#wppm_add_checklist').show();
1009 -}
1010 -
1011 -function wppm_upload_file(){
1012 - jQuery('#wppm_attachment_upload').unbind('change');
1013 - jQuery('#wppm_attachment_upload').on('change', function() {
1014 - var flag = false;
1015 - var file = this.files[0];
1016 - jQuery('#wppm_attachment_upload').val('');
1017 - var allowedExtension = ['exe', 'php','js'];
1018 - var file_name_split = file.name.split('.');
1019 - var file_extension = file_name_split[file_name_split.length-1];
1020 - file_extension = file_extension.toLowerCase();
1021 - if( (jQuery.inArray(file_extension,allowedExtension) > -1)){
1022 - flag = true;
1023 - alert("<?php echo esc_js(__( 'Attached file type not allowed!', 'taskbuilder' ) ); ?>");
1024 -
1025 - };
1026 - <?php
1027 - $max_upload = (int)(ini_get('upload_max_filesize')); ?>
1028 - var current_filesize=file.size/1000000;
1029 - if(current_filesize > <?php echo esc_attr($max_upload); ?>){
1030 - flag = true;
1031 - alert("<?php echo esc_js(__('File size exceed allowed limit!','taskbuilder')); ?>");
1032 - }
1033 - if (!flag){
1034 - var html_str = '<div class="wppm_attachment">'+
1035 - '<div class="progress" style="float: none !important; width: unset !important;">'+
1036 - '<div class="progress-bar" role="progressbar" aria-valuenow="0" aria-valuemin="0" aria-valuemax="100" style="width:0%">'+
1037 - file.name+
1038 - '</div>'+
1039 - '<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>'+
1040 - '</div>'+
1041 - '</div>';
1042 - jQuery('.wppm_attachment_container').show();
1043 - jQuery('.wppm_attachment_container').append(html_str);
1044 - var attachment = jQuery('.wppm_attachment_container').find('.wppm_attachment').last();
1045 - var data = new FormData();
1046 - data.append('file', file);
1047 - data.append('arr_name', file.name);
1048 - data.append('action', 'wppm_upload_file');
1049 - data.append('nonce', jQuery('#wppm_nonce').val().trim());
1050 - jQuery.ajax({
1051 - type: 'post',
1052 - url: wppm_admin.ajax_url,
1053 - data: data,
1054 - xhr: function(){
1055 - var xhr = new window.XMLHttpRequest();
1056 - xhr.upload.addEventListener("progress", function(evt){
1057 - if (evt.lengthComputable) {
1058 - var percentComplete = Math.floor((evt.loaded / evt.total) * 100);
1059 - jQuery(attachment).find('.progress-bar').css('width',percentComplete+'%');
1060 - }
1061 - }, false);
1062 - return xhr;
1063 - },
1064 - processData: false,
1065 - contentType: false,
1066 - success: function(response) {
1067 - var return_obj=JSON.parse(response);
1068 - jQuery(attachment).find('.wppm_attachment_cancel').show();
1069 - if( parseInt(return_obj.id) != 0 ){
1070 - jQuery(attachment).append('<input type="hidden" class="wppm_comment_attachment" name="wppm_comment_attachment[]" value="'+return_obj.id+'">');
1071 - jQuery(attachment).find('.progress-bar').addClass('progress-bar-success');
1072 - }else {
1073 - jQuery(attachment).find('.progress-bar').addClass('progress-bar-danger');
1074 - }
1075 - }
1076 - });
1077 - }
1078 - });
1079 - jQuery('#wppm_attachment_upload').trigger('click');
1080 -}
1081 -</script>
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 + } // ✅ 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)){
1131 + ?>
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 +}
1149 +
1150 +function wppm_add_task_comment(){
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();
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 + }
1221 + });
1222 +}
1223 +
1224 +function wppm_add_checklist_item(checklist_id){
1225 + jQuery('#wppm_add_checklist_label_container_'+checklist_id).show();
1226 + jQuery('#wppm_add_checklist_item_btn_'+checklist_id).hide();
1227 + jQuery('.wppm_add_checklist_label_container_'+checklist_id).show();
1228 + jQuery('.wppm_checklist_item_label_'+checklist_id).css('height', '30px');
1229 + jQuery('.wppm_add_new_item_btn_'+checklist_id).css('margin', '10px');
1230 +}
1231 +
1232 +function wppm_add_checklist(){
1233 + jQuery('#wppm_add_checklist').hide();
1234 + jQuery('#wppm_add_new_checklist').show();
1235 +}
1236 +
1237 +function wppm_remove_add_checklist_container(checklist_id){
1238 + jQuery('#wppm_add_checklist_label_container_'+checklist_id).hide();
1239 + jQuery('#wppm_add_checklist_item_btn_'+checklist_id).show();
1240 +}
1241 +
1242 +function wppm_remove_add_checklist(){
1243 + jQuery('#wppm_add_new_checklist').hide();
1244 + jQuery('#wppm_add_checklist').show();
1245 +}
1246 +
1247 +function wppm_upload_file(){
1248 + jQuery('#wppm_attachment_upload').unbind('change');
1249 + jQuery('#wppm_attachment_upload').on('change', function() {
1250 + var flag = false;
1251 + var file = this.files[0];
1252 + jQuery('#wppm_attachment_upload').val('');
1253 + var allowedExtension = ['exe', 'php','js'];
1254 + var file_name_split = file.name.split('.');
1255 + var file_extension = file_name_split[file_name_split.length-1];
1256 + file_extension = file_extension.toLowerCase();
1257 + if( (jQuery.inArray(file_extension,allowedExtension) > -1)){
1258 + flag = true;
1259 + alert("<?php echo esc_js(__( 'Attached file type not allowed!', 'taskbuilder' ) ); ?>");
1260 +
1261 + };
1262 + <?php
1263 + $max_upload = (int)(ini_get('upload_max_filesize')); ?>
1264 + var current_filesize=file.size/1000000;
1265 + if(current_filesize > <?php echo esc_attr($max_upload); ?>){
1266 + flag = true;
1267 + alert("<?php echo esc_js(__('File size exceed allowed limit!','taskbuilder')); ?>");
1268 + }
1269 + if (!flag){
1270 + var html_str = '<div class="wppm_attachment">'+
1271 + '<div class="progress" style="float: none !important; width: unset !important;">'+
1272 + '<div class="progress-bar" role="progressbar" aria-valuenow="0" aria-valuemin="0" aria-valuemax="100" style="width:0%">'+
1273 + file.name+
1274 + '</div>'+
1275 + '<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>'+
1276 + '</div>'+
1277 + '</div>';
1278 + jQuery('.wppm_attachment_container').show();
1279 + jQuery('.wppm_attachment_container').append(html_str);
1280 + var attachment = jQuery('.wppm_attachment_container').find('.wppm_attachment').last();
1281 + var data = new FormData();
1282 + data.append('file', file);
1283 + data.append('arr_name', file.name);
1284 + data.append('action', 'wppm_upload_file');
1285 + data.append('nonce', jQuery('#wppm_nonce').val().trim());
1286 + jQuery.ajax({
1287 + type: 'post',
1288 + url: wppm_admin.ajax_url,
1289 + data: data,
1290 + xhr: function(){
1291 + var xhr = new window.XMLHttpRequest();
1292 + xhr.upload.addEventListener("progress", function(evt){
1293 + if (evt.lengthComputable) {
1294 + var percentComplete = Math.floor((evt.loaded / evt.total) * 100);
1295 + jQuery(attachment).find('.progress-bar').css('width',percentComplete+'%');
1296 + }
1297 + }, false);
1298 + return xhr;
1299 + },
1300 + processData: false,
1301 + contentType: false,
1302 + success: function(response) {
1303 + var return_obj=JSON.parse(response);
1304 + jQuery(attachment).find('.wppm_attachment_cancel').show();
1305 + if( parseInt(return_obj.id) != 0 ){
1306 + jQuery(attachment).append('<input type="hidden" class="wppm_comment_attachment" name="wppm_comment_attachment[]" value="'+return_obj.id+'">');
1307 + jQuery(attachment).find('.progress-bar').addClass('progress-bar-success');
1308 + }else {
1309 + jQuery(attachment).find('.progress-bar').addClass('progress-bar-danger');
1310 + }
1311 + }
1312 + });
1313 + }
1314 + });
1315 + jQuery('#wppm_attachment_upload').trigger('click');
1316 +}
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>