PluginProbe
Taskbuilder – Project Management & Task Management Tool With Kanban Board / 6.0.5
Taskbuilder – Project Management & Task Management Tool With Kanban Board v6.0.5
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 1.0.6 All 57 releases
taskbuilder / includes / admin / tasks / open_task / wppm_open_task.php

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

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