← All changes
|
includes/admin/tasks/open_task/wppm_open_task.php
+1192
-181
1.0.2
→
6.0.6
View file →
| @@ -3,29 +3,67 @@ | ||
| 3 | 3 | exit; // Exit if accessed directly |
| 4 | 4 | } |
| 5 | 5 | |
| 6 | 6 | global $current_user,$wpdb,$wppmfunction; |
| 7 | -$id = isset($_POST) && isset($_POST['id']) ? intval(sanitize_text_field($_POST['id'])) : "0"; | |
| 7 | +$id = isset($_POST) && isset($_POST['id']) ? intval(sanitize_text_field(wp_unslash($_POST['id']))) : "0"; | |
| 8 | +$page = isset($_POST) && isset($_POST['page']) ? sanitize_text_field(wp_unslash($_POST['page'])) : ''; | |
| 8 | 9 | $task_list_view = get_option('wppm_default_task_list_view'); |
| 9 | -if (!(($current_user->ID && $current_user->has_cap('manage_options')) || ($wppmfunction->has_permission('view_task',$id)))) {exit;} | |
| 10 | -$proj_id = isset($_POST) && isset($_POST['proj_id']) ? intval(sanitize_text_field($_POST['proj_id'])) : 0; | |
| 10 | +$project_id = isset($_POST) && isset($_POST['project_id']) ? intval(sanitize_text_field($_POST['project_id'])) : "0"; | |
| 11 | +$wppm_default_task_date = get_option('wppm_default_task_date'); | |
| 12 | +$wppm_task_time = get_option('wppm_task_time'); | |
| 13 | +$appearance_settings = get_option("wppm-ap-individual-task"); | |
| 14 | +$wppm_tinymce_visibility_open_task = get_option('wppm_tinymce_visibility_open_task'); | |
| 15 | +$settings = get_option("wppm-ap-modal"); | |
| 16 | +$wppm_rich_text_editor = get_option('wppm_rich_text_editor'); | |
| 17 | +$wppm_toolbar_actions = get_option('wppm_toolbar_actions'); | |
| 18 | +$wppm_date_setting = get_option('wppm_date_setting'); | |
| 19 | +$wppm_task_hide_comment_section = get_option('wppm_task_hide_comment_section'); | |
| 20 | +$wppm_deafault_time_duration_task = get_option('wppm_display_time_duration_task'); | |
| 21 | +$url_auth = false; | |
| 11 | 22 | $auth_id = $wppmfunction->wppm_get_auth_code($id); |
| 12 | 23 | $auth_id = sanitize_text_field($auth_id); |
| 24 | +// url authentication. | |
| 25 | +$auth_code = isset( $_POST['auth-code'] ) ? sanitize_text_field( wp_unslash($_POST['auth-code'] ) ) : ''; // phpcs:ignore | |
| 26 | +if ( ! $auth_code ) { | |
| 27 | + $auth_code = isset( $_POST['auth_code'] ) ? sanitize_text_field( wp_unslash($_POST['auth_code'] ) ) : ''; // phpcs:ignore | |
| 28 | +} | |
| 29 | + | |
| 30 | +if ( $auth_code && $auth_id == $auth_code ) { | |
| 31 | + $url_auth = true; | |
| 32 | +} | |
| 33 | +if (!(($current_user->ID && $current_user->has_cap('manage_options')) || ($wppmfunction->has_permission('view_task',$id)) || ($url_auth==true))) { ?> | |
| 34 | + <div style="text-align:center;padding:20px 0;"> | |
| 35 | + <h6><?php esc_attr_e( 'Unauthorized access!', 'taskbuilder' ); ?></h6> | |
| 36 | + <a href="<?php echo esc_url( admin_url('admin.php?page=wppm-tasks') ); ?>" class="btn btn-success btn-sm"><?php esc_html_e( 'Go to Task List', 'taskbuilder' ); ?></a> | |
| 37 | + </div> | |
| 38 | + <?php | |
| 39 | + wp_die(); | |
| 40 | +} | |
| 41 | +$proj_id = isset($_POST) && isset($_POST['proj_id']) ? intval(sanitize_text_field(wp_unslash($_POST['proj_id']))) : 0; | |
| 42 | +$current_date = wp_date('Y-m-d'); | |
| 43 | +$wppm_current_user_capability = get_user_meta( $current_user->ID, 'wppm_capability', true ); | |
| 44 | +$cu_id = absint($current_user->ID); | |
| 13 | 45 | if(!empty($id)){ |
| 14 | - $task = $wpdb->get_row( "SELECT * FROM {$wpdb->prefix}wppm_task where id=".$id); | |
| 46 | + $task = $wpdb->get_row($wpdb->prepare("SELECT * FROM {$wpdb->prefix}wppm_task where id=%d",$id)); | |
| 15 | 47 | $project_data = $wppmfunction->get_project($task->project); |
| 16 | - $task_comment = $wpdb->get_results( "SELECT * FROM {$wpdb->prefix}wppm_task_comment where task_id=".$id." ORDER BY create_time DESC"); | |
| 48 | + $task_comment = $wpdb->get_results( $wpdb->prepare("SELECT * FROM {$wpdb->prefix}wppm_task_comment where task_id=%d ORDER BY create_time DESC",$id)); | |
| 49 | + $orderby_proj_sql = (sanitize_sql_orderby( "create_time DESC" )); | |
| 50 | + $task_comment = $wpdb->get_results( $wpdb->prepare("SELECT * FROM {$wpdb->prefix}wppm_task_comment where task_id=%d ORDER BY ". $orderby_proj_sql,$id)); | |
| 51 | + $task_proj = isset($task->project) ? absint($task->project) :""; | |
| 52 | + $task_id = isset($task->id) ? absint($task->id):""; | |
| 17 | 53 | } |
| 18 | -$user_role = $wpdb->get_var( "SELECT role_id FROM {$wpdb->prefix}wppm_project_users where proj_id = $task->project AND user_id = $current_user->ID"); | |
| 19 | -if(!empty($task->project)){ | |
| 20 | - $project_name = $wpdb->get_var( "SELECT project_name FROM {$wpdb->prefix}wppm_project where id=".$task->project); | |
| 54 | +$user_role = $wpdb->get_var( $wpdb->prepare("SELECT role_id FROM {$wpdb->prefix}wppm_project_users where proj_id = %d AND user_id = %d",$task_proj,$cu_id)); | |
| 55 | +if(!empty($task_proj)){ | |
| 56 | + $project_name = $wpdb->get_var( $wpdb->prepare("SELECT project_name FROM {$wpdb->prefix}wppm_project where id= %d",$task_proj)); | |
| 21 | 57 | } |
| 22 | -$wppm_checklist=$wpdb->get_results( "SELECT * FROM {$wpdb->prefix}wppm_checklist where task_id=".$task->id ); | |
| 58 | +$wppm_checklist=$wpdb->get_results( $wpdb->prepare("SELECT * FROM {$wpdb->prefix}wppm_checklist where task_id=%d",$task_id)); | |
| 23 | 59 | if(!empty($task->status)){ |
| 24 | - $task_status = $wpdb->get_row( "SELECT * FROM {$wpdb->prefix}wppm_task_statuses where id=".$task->status); | |
| 60 | + $task_status_var = absint($task->status); | |
| 61 | + $task_status = $wpdb->get_row( $wpdb->prepare("SELECT * FROM {$wpdb->prefix}wppm_task_statuses where id=%d",$task_status_var)); | |
| 25 | 62 | } |
| 26 | 63 | if(!empty($task->priority)){ |
| 27 | - $task_priority = $wpdb->get_row( "SELECT * FROM {$wpdb->prefix}wppm_task_priorities where id=".$task->priority); | |
| 64 | + $task_priority_var = absint($task->priority); | |
| 65 | + $task_priority = $wpdb->get_row( $wpdb->prepare("SELECT * FROM {$wpdb->prefix}wppm_task_priorities where id=%d",$task_priority_var)); | |
| 28 | 66 | } |
| 29 | 67 | if(!empty($task->users)){ |
| 30 | 68 | $users = explode(",",$task->users); |
| 31 | 69 | } |
| @@ -30,37 +68,182 @@ | ||
| 30 | 68 | $users = explode(",",$task->users); |
| 31 | 69 | } |
| 32 | 70 | |
| 33 | 71 | if(!empty($task->description)){ |
| 34 | - $task_description = stripslashes((htmlspecialchars_decode($task->description, ENT_QUOTES))); | |
| 72 | + $task_description = !empty($task->description) ? wp_kses_post(wpautop($task->description)) : ''; | |
| 35 | 73 | } |
| 36 | 74 | |
| 75 | +if($wppm_task_time == 1){ | |
| 76 | + $tsDate = new DateTime($task->start_date); | |
| 77 | + $teDate = new DateTime($task->end_date); | |
| 78 | + if($task->start_date=='0000-00-00 00:00:00'){ | |
| 79 | + if($wppm_date_setting=='Y-m-d H:i:s'){ | |
| 80 | + $task_start_date = '0000-00-00 00:00:00'; | |
| 81 | + }elseif($wppm_date_setting=='d-m-Y H:i:s'){ | |
| 82 | + $task_start_date = '00-00-0000 00:00:00'; | |
| 83 | + }elseif($wppm_date_setting=='m-d-Y H:i:s'){ | |
| 84 | + $task_start_date = '00-00-0000 00:00:00'; | |
| 85 | + }else{ | |
| 86 | + $task_start_date = '0000-00-00 00:00:00'; | |
| 87 | + } | |
| 88 | + }if($task->end_date=='0000-00-00 00:00:00'){ | |
| 89 | + if($wppm_date_setting=='Y-m-d H:i:s'){ | |
| 90 | + $task_end_date = '0000-00-00 00:00:00'; | |
| 91 | + }elseif($wppm_date_setting=='d-m-Y H:i:s'){ | |
| 92 | + $task_end_date = '00-00-0000 00:00:00'; | |
| 93 | + }elseif($wppm_date_setting=='m-d-Y H:i:s'){ | |
| 94 | + $task_end_date = '00-00-0000 00:00:00'; | |
| 95 | + }else{ | |
| 96 | + $task_end_date = '0000-00-00 00:00:00'; | |
| 97 | + } | |
| 98 | + }if($task->start_date!='0000-00-00 00:00:00'){ | |
| 99 | + if(!empty($wppm_date_setting)){ | |
| 100 | + $task_start_date = $tsDate->format($wppm_date_setting); | |
| 101 | + }else{ | |
| 102 | + $task_start_date = isset($task->start_date)? $task->start_date:""; | |
| 103 | + } | |
| 104 | + } | |
| 105 | + if($task->end_date!='0000-00-00 00:00:00'){ | |
| 106 | + if(!empty($wppm_date_setting)){ | |
| 107 | + $task_end_date = $teDate->format($wppm_date_setting); | |
| 108 | + }else{ | |
| 109 | + $task_end_date = isset($task->end_date) ? $task->end_date: "" ; | |
| 110 | + } | |
| 111 | + } | |
| 112 | +} elseif($wppm_task_time == 0){ | |
| 113 | + $tsDate = isset($task->start_date) ? new DateTime($task->start_date): ""; | |
| 114 | + $teDate = isset($task->end_date) ? new DateTime($task->end_date):""; | |
| 115 | + $task_start_date = !empty($tsDate) ? $tsDate->format( $wppm_date_setting):""; | |
| 116 | + $task_end_date = !empty($teDate) ? $teDate->format( $wppm_date_setting):""; | |
| 117 | + if($task->start_date=='0000-00-00 00:00:00'){ | |
| 118 | + if($wppm_date_setting=='Y-m-d H:i:s'){ | |
| 119 | + $task_start_date = '0000-00-00'; | |
| 120 | + }elseif($wppm_date_setting=='d-m-Y H:i:s'){ | |
| 121 | + $task_start_date = '00-00-0000'; | |
| 122 | + }elseif($wppm_date_setting=='m-d-Y H:i:s'){ | |
| 123 | + $task_start_date = '00-00-0000'; | |
| 124 | + }else{ | |
| 125 | + $task_start_date = '0000-00-00'; | |
| 126 | + } | |
| 127 | + } | |
| 128 | + if($task->end_date=='0000-00-00 00:00:00'){ | |
| 129 | + if($wppm_date_setting=='Y-m-d H:i:s'){ | |
| 130 | + $task_end_date = '0000-00-00'; | |
| 131 | + }elseif($wppm_date_setting=='d-m-Y H:i:s'){ | |
| 132 | + $task_end_date = '00-00-0000'; | |
| 133 | + }elseif($wppm_date_setting=='m-d-Y H:i:s'){ | |
| 134 | + $task_end_date = '00-00-0000'; | |
| 135 | + } | |
| 136 | + else{ | |
| 137 | + $task_end_date = '0000-00-00'; | |
| 138 | + } | |
| 139 | + }if($task->start_date!='0000-00-00 00:00:00'){ | |
| 140 | + if($wppm_date_setting=='Y-m-d H:i:s'){ | |
| 141 | + $task_start_date = $tsDate->format('Y-m-d'); | |
| 142 | + }elseif($wppm_date_setting=='d-m-Y H:i:s'){ | |
| 143 | + $task_start_date = $tsDate->format('d-m-Y'); | |
| 144 | + }elseif($wppm_date_setting=='m-d-Y H:i:s'){ | |
| 145 | + $task_start_date = $tsDate->format('m-d-Y'); | |
| 146 | + }else{ | |
| 147 | + $task_start_date = $tsDate->format('Y-m-d'); | |
| 148 | + } | |
| 149 | + }if($task->end_date!='0000-00-00 00:00:00'){ | |
| 150 | + if($wppm_date_setting=='Y-m-d H:i:s'){ | |
| 151 | + $task_end_date = $teDate->format('Y-m-d'); | |
| 152 | + }elseif($wppm_date_setting=='d-m-Y H:i:s'){ | |
| 153 | + $task_end_date = $teDate->format('d-m-Y'); | |
| 154 | + }elseif($wppm_date_setting=='m-d-Y H:i:s'){ | |
| 155 | + $task_end_date = $teDate->format('m-d-Y'); | |
| 156 | + }else{ | |
| 157 | + $task_end_date = $teDate->format('Y-m-d'); | |
| 158 | + } | |
| 159 | + } | |
| 160 | +} | |
| 161 | +$flag = false; | |
| 162 | +$wppm_task_fillter = $wpdb->get_results( $wpdb->prepare("SELECT * FROM {$wpdb->prefix}wppm_task where id=%d",$id)); | |
| 163 | +if(!empty($wppm_task_fillter)){ | |
| 164 | + foreach($wppm_task_fillter as $key_filter=>$val_filter){ | |
| 165 | + $val_array = (array) $val_filter; | |
| 166 | + $tusers = $val_array['users']; | |
| 167 | + $tusers_arr = explode(',',$tusers); | |
| 168 | + $tproject_id = $val_array['project']; | |
| 169 | + $tproject_id = absint($tproject_id); | |
| 170 | + if(!empty($tusers) && in_array($current_user->ID,$tusers_arr)){ | |
| 171 | + $project_user_role = $wpdb->get_var( $wpdb->prepare("SELECT role_id FROM {$wpdb->prefix}wppm_project_users WHERE proj_id = %d AND user_id = %d",$tproject_id,$cu_id)); | |
| 172 | + $project_users = $wpdb->get_var( $wpdb->prepare("SELECT users FROM {$wpdb->prefix}wppm_project WHERE id = %d",$tproject_id)); | |
| 173 | + $project_users_arr = explode(',',(string)$project_users); | |
| 174 | + if((!empty($project_user_role)) && ($project_user_role == 1) && in_array($current_user->ID,$project_users_arr)){ | |
| 175 | + $flag= true; | |
| 176 | + break; | |
| 177 | + } | |
| 178 | + } | |
| 179 | + } | |
| 180 | +} | |
| 181 | +$project_creator = $wpdb->get_var( $wpdb->prepare("SELECT created_by FROM {$wpdb->prefix}wppm_project WHERE created_by = %d",$cu_id)); | |
| 37 | 182 | ?> |
| 38 | 183 | <form id="wppm_open_task" method="post"> |
| 184 | + <div id="wppm_alert_success" class="alert alert-success wppm_alert" style="display:none;" role="alert"> | |
| 185 | + <img src="<?php echo esc_url( WPPM_PLUGIN_URL . 'asset/images/success.svg'); ?>" alt="success"> <span class="wppm_alert_text"></span> | |
| 186 | + </div> | |
| 187 | + <div id="wppm_alert_error" class="alert alert-danger wppm_alert" style="display:none;" role="alert"> | |
| 188 | + <img src="<?php echo esc_url( WPPM_PLUGIN_URL . 'asset/images/warning-triangle.svg'); ?>" alt="warning-triangle"> <span class="wppm_alert_text"></span> | |
| 189 | + </div> | |
| 39 | 190 | <div class="wppm_headers row"> |
| 40 | 191 | <div class="col-sm-8"> |
| 41 | 192 | <span class="wppm-heading-inline"> |
| 42 | 193 | <?php echo esc_html_e('Task','taskbuilder');?> |
| 43 | - </span> | |
| 44 | - <?php if($proj_id==0) { ?> | |
| 45 | - <span onclick="wppm_add_new_task(<?php echo esc_attr($proj_id) ?>)" class="wppm_add_new_task_btn" id="wppm_add_new_task_btn" title="Create Task"><img src="<?php echo esc_url( WPPM_PLUGIN_URL . 'asset/images/plus.svg'); ?>" alt="add"></span> | |
| 194 | + </span><?php | |
| 195 | + if(($current_user->has_cap('manage_options') || $wppmfunction->has_permission('add_new_task',$task_id) || ($flag==true) || $project_creator!="") && $task->is_archived!=1){ | |
| 196 | + $style = "display:inline;"; | |
| 197 | + }else{ | |
| 198 | + $style = "display:none;"; | |
| 199 | + } | |
| 200 | + $style = apply_filters('wppm_add_new_task_btn_style_open_task_form',$style); | |
| 201 | + if(($wppm_task_fillter && (!empty($project_user_role)) && ($project_user_role == 1) && in_array($current_user->ID,$project_users_arr)) || $wppm_current_user_capability == 'wppm_admin'|| $wppm_current_user_capability == 'wppm_manager' || $current_user->has_cap('manage_options') || $project_data['created_by']==$current_user->ID){ | |
| 202 | + $archive_style= "display:inline;"; | |
| 203 | + }else{ | |
| 204 | + $archive_style= "display:none;"; | |
| 205 | + } | |
| 206 | + if($proj_id==0) { | |
| 207 | + ?> <span onclick="wppm_add_new_task(<?php echo esc_attr($proj_id) ?>,<?php echo esc_attr($project_id) ?>)" class="wppm_add_new_task_btn" id="wppm_add_new_task_btn" style="<?php echo esc_attr($style)?>" title="<?php esc_attr_e( 'Create Task', 'taskbuilder' ); ?>"><img src="<?php echo esc_url( WPPM_PLUGIN_URL . 'asset/images/plus.svg'); ?>" alt="add"></span> | |
| 46 | 208 | <?php } |
| 47 | 209 | else{ ?> |
| 48 | - <span class="wppm_add_new_task_btn" id="wppm_add_new_task_btn" title="Create Task" onclick="wppm_create_project_task(<?php echo esc_attr($proj_id) ?>)"><img src="<?php echo esc_url( WPPM_PLUGIN_URL . 'asset/images/plus.svg'); ?>" alt="add"></span> | |
| 210 | + <span class="wppm_add_new_task_btn" id="wppm_add_new_task_btn" title="<?php esc_attr_e( '"Create Task', 'taskbuilder' ); ?>" onclick="wppm_create_project_task(<?php echo esc_attr($proj_id) ?>)" style="<?php echo esc_attr($style) ?>"><img src="<?php echo esc_url( WPPM_PLUGIN_URL . 'asset/images/plus.svg'); ?>" alt="add"></span> | |
| 49 | 211 | <?php } ?> |
| 50 | - <?php if($proj_id==0) { | |
| 51 | - $task_list_function = ($task_list_view==1)?"wppm_get_task_list()":"wppm_view_task_search_filter()"; | |
| 212 | + <?php if($proj_id==0) { | |
| 213 | + if (($project_id!=0)) { | |
| 214 | + $task_list_function = "wppm_get_project_tasks_kanban_view( {$project_id})"; | |
| 215 | + } | |
| 216 | + if (empty($project_id) && $task_list_view == 1) { | |
| 217 | + $task_list_function = "wppm_get_task_list('', {$project_id})"; | |
| 218 | + } | |
| 219 | + if(empty($task_list_view) && empty($project_id)) { | |
| 220 | + $task_list_function = "wppm_view_task_search_filter('', '', {$project_id})"; | |
| 221 | + } | |
| 52 | 222 | ?> |
| 53 | - <span class="wppm-task-list-btn" id="wppm_task_list_btn" title="Task List" onclick="<?php echo $task_list_function ?>"><img src="<?php echo esc_url( WPPM_PLUGIN_URL . 'asset/images/list.svg'); ?>" alt="list"></span> | |
| 223 | + <span class="wppm-task-list-btn" id="wppm_task_list_btn" title="<?php esc_attr_e( 'Task List', 'taskbuilder' ); ?>"onclick="<?php echo esc_attr($task_list_function) ?>"><img src="<?php echo esc_url( WPPM_PLUGIN_URL . 'asset/images/list.svg'); ?>" alt="list"></span> | |
| 54 | 224 | <?php } |
| 55 | 225 | else{ |
| 56 | 226 | ?> |
| 57 | - <span class="wppm-task-list-btn" id="wppm_task_list_btn" title="Task List" onclick="wppm_get_project_tasks(<?php echo esc_attr($proj_id) ?>)"><img src="<?php echo esc_url( WPPM_PLUGIN_URL . 'asset/images/list.svg'); ?>" alt="list"></span> | |
| 227 | + <span class="wppm-task-list-btn" id="wppm_task_list_btn" title="<?php esc_attr_e( 'Task List', 'taskbuilder' ); ?>" onclick="wppm_get_project_tasks(<?php echo esc_attr($proj_id) ?>)"><img src="<?php echo esc_url( WPPM_PLUGIN_URL . 'asset/images/list.svg'); ?>" alt="list"></span> | |
| 58 | 228 | <?php } ?> |
| 59 | - <?php $style = (($current_user->ID && $current_user->has_cap('manage_options')) || ($wppmfunction->has_permission('delete_task',$id)))? "display:inline":"display:none"; ?> | |
| 60 | - <span class="wppm-delete_task_btn" id="wppm_delete_task_btn" title="Task List" onclick="wppm_get_delete_task(<?php echo esc_attr($id) ?>)" style="<?php echo esc_attr($style) ?>"><img src="<?php echo esc_url( WPPM_PLUGIN_URL . 'asset/images/bin.svg'); ?>" alt="delete"></span> | |
| 229 | + <?php $style = ((($current_user->ID && $current_user->has_cap('manage_options')) || ($wppmfunction->has_permission('delete_task',$id)) || $wppm_current_user_capability == 'wppm_admin'|| $project_data['created_by']==$current_user->ID ) && $user_role != 3) ? "display:inline":"display:none"; ?> | |
| 230 | + <?php $clone_style = ((($current_user->ID && $current_user->has_cap('manage_options') || $wppm_current_user_capability == 'wppm_admin') || ($wppmfunction->has_permission('clone_task',$id)) || $project_data['created_by']==$current_user->ID ) && $task->is_archived!=1 && $user_role != 3) ? "display:inline":"display:none"; ?> | |
| 231 | + <?php $ar_css = ($task->is_archived==1) ? "display:none;" : "display:inline"; ?> | |
| 232 | + <span class="wppm-dashboard-btn" id="wppm_dashboard_btn" title="<?php esc_attr_e( 'Dashboard', 'taskbuilder' ); ?>" onclick="wppm_get_project_tasks(<?php echo esc_attr($proj_id) ?>)"> | |
| 233 | + <a href="<?php echo esc_url(admin_url('admin.php?page=wppm-dashboard')); ?>"><img src="<?php echo esc_url( WPPM_PLUGIN_URL . 'asset/images/dashboard-icon.svg'); ?>" alt="dashboard"></a> | |
| 234 | + </span> | |
| 235 | + <span class="wppm-delete_task_btn" id="wppm_delete_task_btn" title="Delete Task" onclick="wppm_get_delete_task(<?php echo esc_attr($id) ?>,<?php echo esc_attr($proj_id) ?>,<?php echo esc_attr($project_id) ?>)" style="<?php echo esc_attr($style) ?>"><img src="<?php echo esc_url( WPPM_PLUGIN_URL . 'asset/images/bin.svg'); ?>" alt="delete"></span> | |
| 236 | + <span class="wppm-clone_task_btn" id="wppm_clone_task_btn" title="Clone Task" onclick="wppm_clone_task(<?php echo esc_attr($id) ?>,<?php echo esc_attr($proj_id)?>,<?php echo esc_attr($project_id) ?>)" style="<?php echo esc_attr($clone_style) ?>"><img src="<?php echo esc_url( WPPM_PLUGIN_URL . 'asset/images/duplicate.svg'); ?>" alt="clone"></span> | |
| 237 | + <span class="wppm-print_task_btn" id="wppm_print_task_btn" title="Print Task" onclick="wppm_print_task(<?php echo esc_attr($id) ?>)"><img src="<?php echo esc_url( WPPM_PLUGIN_URL . 'asset/images/printer_menu.svg'); ?>" alt="print" style="<?php echo esc_attr($ar_css);?>"></span> | |
| 238 | + <span class="wppm-archieve_task_btn" id="wppm_archieve_task_btn" title="<?php echo ($task->is_archived==1 ) ? 'Restore Task' : 'Archive Task'; ?>" onclick="wppm_archive_task(<?php echo esc_attr($id) ?>,<?php echo esc_attr($task->is_archived) ?>,<?php echo esc_attr($project_id) ?>)" style="<?php echo esc_attr($archive_style) ?>"><img src="<?php echo esc_url( WPPM_PLUGIN_URL . 'asset/images/archive.svg'); ?>" alt="archive"></span> | |
| 239 | + <input type="hidden" name="wppm_archive_task_ajax_nonce" id="wppm_archive_task_ajax_nonce" value="<?php echo esc_attr( wp_create_nonce( 'wppm_archive_task_ajax_nonce' ) ); ?>"> | |
| 240 | + <div class="menu" id="wppmprint_menu" onclick="event.stopPropagation();"> | |
| 241 | + <a href="#" id="wppm_openPDF" onclick="wppm_open_pdf(<?php echo esc_attr($id) ?>)">🖨️ <?php echo esc_html_e('Open In Browser','taskbuilder');?></a> | |
| 242 | + <a href="#" id="wppm_downloadPDF" onclick="wppm_download_pdf(<?php echo esc_attr($id) ?>)">💾 <?php echo esc_html_e('Download PDF','taskbuilder');?></a> | |
| 243 | + </div> | |
| 61 | 244 | <?php do_action('wppm_individual_task_button',$id);?> |
| 62 | - </div> | |
| 245 | + </div> | |
| 63 | 246 | </div> |
| 64 | 247 | <div id="wppm_load_individual_task_container" class="row"> |
| 65 | 248 | <div class="col-sm-8 wppm_body col-md-9"> |
| 66 | 249 | <div class="wppm_task_details_container"> |
| @@ -65,13 +248,28 @@ | ||
| 65 | 248 | <div class="col-sm-8 wppm_body col-md-9"> |
| 66 | 249 | <div class="wppm_task_details_container"> |
| 67 | 250 | <div class="row"> |
| 68 | 251 | <div class="col-sm-12"> |
| 69 | - <span class="wppm_task_label"> <?php echo esc_html_e($task->task_name,'taskbuilder'); | |
| 70 | - if ($wppmfunction->has_permission('change_task_details',$id) || $current_user->has_cap('manage_options')) { ?> | |
| 71 | - <span id="wppm_individual_edit_task_subject" onclick="wppm_edit_task_details(<?php echo esc_attr($id) ?>,<?php echo esc_attr($proj_id) ?>)" class="btn btn-sm wppm_action_btn" style="background-color:#FFFFFF !important;color:#000000 !important;"><img src="<?php echo esc_url( WPPM_PLUGIN_URL . 'asset/images/edit_01.svg'); ?>" alt="edit"></span> | |
| 252 | + <span class="wppm_task_label"> <?php echo isset($task->task_name) ? esc_html($task->task_name ):"" ?> | |
| 253 | + <?php if (($wppmfunction->has_permission('change_task_details',$id) || $current_user->has_cap('manage_options') || $wppm_current_user_capability == 'wppm_admin') && $task->is_archived!=1) { ?> | |
| 254 | + <span id="wppm_individual_edit_task_subject" onclick="wppm_edit_task_details(<?php echo esc_attr($id) ?>,<?php echo esc_attr($proj_id) ?>,<?php echo esc_attr($project_id) ?>)" class="btn btn-sm wppm_action_btn" style="background-color:#FFFFFF !important;color:#000000 !important;"><img src="<?php echo esc_url( WPPM_PLUGIN_URL . 'asset/images/edit_01.svg'); ?>" alt="edit"></span> | |
| 72 | 255 | <?php } ?> |
| 73 | 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 | + | <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 | + } ?> | |
| 74 | 272 | </div> |
| 75 | 273 | </div> |
| 76 | 274 | <div class="row"> |
| 77 | 275 | <div class="col-sm-3"> |
| @@ -77,9 +275,9 @@ | ||
| 77 | 275 | <div class="col-sm-3"> |
| 78 | 276 | <span class="wppm_task_details_label"><?php echo esc_html_e('Project:','taskbuilder');?></span> |
| 79 | 277 | </div> |
| 80 | 278 | <div class="col-sm-9"> |
| 81 | - <span class="wppm_task_details"><?php echo (isset($project_name))? esc_html_e($project_name,'taskbuilder'):"" ?></span> | |
| 279 | + <span class="wppm_task_details"><?php echo (isset($project_name))? esc_html($project_name ):"" ?></span> | |
| 82 | 280 | </div> |
| 83 | 281 | </div> |
| 84 | 282 | <div class="row"> |
| 85 | 283 | <div class="col-sm-3"> |
| @@ -84,34 +282,74 @@ | ||
| 84 | 282 | <div class="row"> |
| 85 | 283 | <div class="col-sm-3"> |
| 86 | 284 | <span class="wppm_task_details_label"><?php echo esc_html_e('Created On:','taskbuilder');?></span> |
| 87 | 285 | </div> |
| 88 | - <div class="col-sm-9"> | |
| 89 | - <span class="wppm_task_details"><?php echo (isset($task->date_created))? esc_html($task->date_created):"" ?></span> | |
| 286 | + <div class="col-sm-9"><?php | |
| 287 | + $tcDate = isset($task->date_created) ? new DateTime($task->date_created): ""; | |
| 288 | + if($wppm_task_time !=0){ | |
| 289 | + if($wppm_date_setting=='Y-m-d H:i:s'){ | |
| 290 | + $task_create_date = !empty($tcDate) ? $tcDate->format('Y-m-d H:i:s'):""; | |
| 291 | + } elseif($wppm_date_setting=='d-m-Y H:i:s'){ | |
| 292 | + $task_create_date = !empty($tcDate) ? $tcDate->format('d-m-Y H:i:s'):""; | |
| 293 | + } elseif($wppm_date_setting=='m-d-Y H:i:s'){ | |
| 294 | + $task_create_date = !empty($tcDate) ? $tcDate->format('m-d-Y H:i:s'):""; | |
| 295 | + } else { | |
| 296 | + $task_create_date = !empty($tcDate) ? $tcDate->format('Y-m-d H:i:s'):""; | |
| 297 | + } | |
| 298 | + } elseif($wppm_task_time == 0){ | |
| 299 | + if($wppm_date_setting=='Y-m-d H:i:s'){ | |
| 300 | + $task_create_date = !empty($tcDate) ? $tcDate->format('Y-m-d'):""; | |
| 301 | + } elseif($wppm_date_setting=='d-m-Y H:i:s'){ | |
| 302 | + $task_create_date = !empty($tcDate) ? $tcDate->format('d-m-Y'):""; | |
| 303 | + } elseif($wppm_date_setting=='m-d-Y H:i:s'){ | |
| 304 | + $task_create_date = !empty($tcDate) ? $tcDate->format('m-d-Y'):""; | |
| 305 | + } else { | |
| 306 | + $task_create_date = !empty($tcDate) ? $tcDate->format('Y-m-d'):""; | |
| 307 | + } | |
| 308 | + } ?> | |
| 309 | + <span class="wppm_task_details"><?php echo (isset($task_create_date))? esc_html($task_create_date):"" ?></span> | |
| 90 | 310 | </div> |
| 91 | 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 | + }?> | |
| 92 | 346 | <div class="row"> |
| 93 | 347 | <div class="col-sm-3"> |
| 94 | - <span class="wppm_task_details_label"><?php echo esc_html_e('Start Date:','taskbuilder');?></span> | |
| 95 | - </div> | |
| 96 | - <div class="col-sm-9"> | |
| 97 | - <span class="wppm_task_details"><?php echo (isset($task->start_date))? esc_html($task->start_date):"" ?></span> | |
| 98 | - </div> | |
| 99 | - </div> | |
| 100 | - <div class="row"> | |
| 101 | - <div class="col-sm-3"> | |
| 102 | - <span class="wppm_task_details_label"><?php echo esc_html_e('End Date:','taskbuilder');?></span> | |
| 103 | - </div> | |
| 104 | - <div class="col-sm-9"> | |
| 105 | - <span class="wppm_task_details"><?php echo (isset($task->end_date))? esc_html($task->end_date):"" ?></span> | |
| 106 | - </div> | |
| 107 | - </div> | |
| 108 | - <div class="row"> | |
| 109 | - <div class="col-sm-3"> | |
| 110 | 348 | <span class="wppm_task_details_label"><?php echo esc_html_e('Task Priority:','taskbuilder');?></span> |
| 111 | 349 | </div> |
| 112 | 350 | <div class="col-sm-9"> |
| 113 | - <span class="wppm_task_details_priority"><span class="wppm_admin_label" style="background-color:<?php echo (isset($task_priority->bg_color))? esc_html($task_priority->bg_color):""?>;color:<?php echo (isset($task_priority->color))? esc_html($task_priority->color):""?>;"><?php echo (isset($task_priority->name)) ? esc_html_e($task_priority->name,'taskbuilder'):"" ?> </span></span> | |
| 351 | + <span class="wppm_task_details_priority"><span class="wppm_admin_label" style="background-color:<?php echo (isset($task_priority->bg_color))? esc_html($task_priority->bg_color):""?>;color:<?php echo (isset($task_priority->color))? esc_html($task_priority->color):""?>;"><?php echo (isset($task_priority->name)) ? esc_html($task_priority->name):"" ?> </span></span> | |
| 114 | 352 | </div> |
| 115 | 353 | </div> |
| 116 | 354 | <div class="row"> |
| 117 | 355 | <div class="col-sm-3"> |
| @@ -116,16 +354,174 @@ | ||
| 116 | 354 | <div class="row"> |
| 117 | 355 | <div class="col-sm-3"> |
| 118 | 356 | <span class="wppm_task_details_label"><?php echo esc_html_e('Description:','taskbuilder');?></span> |
| 119 | 357 | </div> |
| 120 | - <?php | |
| 121 | - $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(),));?> | |
| 122 | 358 | <div class="col-sm-9"> |
| 123 | - <span class="wppm_task_description"><?php echo (isset($task_description))? wp_kses(wpautop($task_description),$allowedtags):"" ?></span> | |
| 359 | + <span class="wppm_task_description"><?php echo (!empty($task_description))? wp_kses_post(wpautop($task_description)):"" ?></span> | |
| 124 | 360 | </div> |
| 125 | 361 | </div> |
| 126 | 362 | <?php do_action('wppm_after_task_details_in_open_task',$task->id, $task->project);?> |
| 127 | 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 } ?> | |
| 128 | 524 | <div class="wppm_task_checklist_container" id="wppm_task_checklist_container"> |
| 129 | 525 | <div id="wppm_checklist_container"> |
| 130 | 526 | <?php |
| 131 | 527 | if(!empty($wppm_checklist)){ |
| @@ -132,15 +528,19 @@ | ||
| 132 | 528 | foreach( $wppm_checklist as $key=>$list){ |
| 133 | 529 | ?> |
| 134 | 530 | <div class="row"> |
| 135 | 531 | <div class="col-sm-8"> |
| 136 | - <span class="wppm_checklist_label"><img src="<?php echo esc_url( WPPM_PLUGIN_URL . 'asset/images/checklist.svg'); ?>" alt="checklist"><?php echo esc_html_e($list->checklist_name,'taskbuilder');?></span> | |
| 532 | + <span class="wppm_checklist_label"><img src="<?php echo esc_url( WPPM_PLUGIN_URL . 'asset/images/checklist.svg'); ?>" alt="checklist"><?php echo isset($list->checklist_name) ? esc_html($list->checklist_name):"" ?></span> | |
| 137 | 533 | </div> |
| 138 | - <?php $check_style = (($list->created_by == $current_user->ID || $current_user->has_cap('manage_options') || $user_role == 1))? "display:inline":"display:none"; ?> | |
| 139 | - <?php $disabled = (($list->created_by == $current_user->ID || $current_user->has_cap('manage_options') || $user_role == 1))? "":"disabled"; ?> | |
| 140 | - <div class="col-sm-4" style="text-align:right;<?php echo esc_attr($check_style) ?>"> | |
| 141 | - <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> | |
| 142 | - </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 }?> | |
| 143 | 543 | </div> |
| 144 | 544 | <div class="wppm_progress_bar_container row"> |
| 145 | 545 | <div class="col-sm-4"> |
| 146 | 546 | <span class="wppm_progressbar_label" id="wppm_progressbar_label_<?php echo esc_attr($list->id)?>">0%</span> |
| @@ -149,67 +549,93 @@ | ||
| 149 | 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> |
| 150 | 550 | </div> |
| 151 | 551 | </div> |
| 152 | 552 | <?php |
| 153 | - $wppm_checklist_items = $wpdb->get_results( "SELECT * FROM {$wpdb->prefix}wppm_checklist_items where checklist_id=".$list->id); | |
| 553 | + $list_id = absint($list->id); | |
| 554 | + $sql = $wpdb->prepare( | |
| 555 | + "SELECT * | |
| 556 | + FROM {$wpdb->prefix}wppm_checklist_items | |
| 557 | + WHERE checklist_id = %d | |
| 558 | + ORDER BY load_order ASC", | |
| 559 | + $list_id | |
| 560 | + ); | |
| 561 | + // Execute | |
| 562 | + $wppm_checklist_items = $wpdb->get_results($sql); | |
| 154 | 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;"> | |
| 155 | 565 | <?php |
| 156 | 566 | if(!empty( $wppm_checklist_items)){ |
| 157 | 567 | foreach($wppm_checklist_items as $key=>$val){ |
| 158 | 568 | $checked = $val->checked == 1 ? 'checked="checked"' : ''; |
| 159 | 569 | ?> |
| 160 | - <div id="wppm_checklist_<?php echo esc_attr($val->id) ?>" class="row" style="margin-bottom:10px;font: 15px 'Helvetica Neue',Helvetica,Arial,sans-serif;"> | |
| 570 | + <li id="wppm_checklist_<?php echo esc_attr($val->id) ?>" data-id="<?php echo esc_attr($val->id); ?>" class="row wppm_checklist_item" style="margin-bottom:10px;font: 15px 'Helvetica Neue',Helvetica,Arial,sans-serif;"> | |
| 161 | 571 | <div class="col-sm-8" id="wppm_checklist_item_container_<?php echo esc_attr($val->id) ?>"> |
| 162 | - <input id="wppm_checklist_item_<?php echo esc_attr($val->id) ?>" class="wppm_checklist_item_<?php echo esc_attr($val->checklist_id) ?>" onchange="wppm_checklist_progress(<?php echo esc_attr($val->checklist_id) ?>,<?php echo esc_attr($val->id) ?>,<?php echo esc_attr($task->id) ?>)" type="checkbox" name="wppm_checklist" <?php echo esc_attr($checked) ?> value="<?php echo esc_attr($val->id) ?>" <?php echo esc_attr($disabled) ?> style="margin:5px;"><label style="padding-top: 5px;font-weight: normal;font: 13px 'Helvetica Neue',Helvetica,Arial,sans-serif;"><?php echo esc_html_e($val->item_name,'taskbuilder') ?></label> | |
| 572 | + <span class="wppm_chk_items_drag">☰</span> | |
| 573 | + <input id="wppm_checklist_item_<?php echo esc_attr($val->id) ?>" class="wppm_checklist_item_<?php echo esc_attr($val->checklist_id) ?>" onchange="wppm_checklist_progress(<?php echo esc_attr($val->checklist_id) ?>,<?php echo esc_attr($val->id) ?>,<?php echo esc_attr($task->id) ?>)" type="checkbox" name="wppm_checklist" <?php echo esc_attr($checked) ?> value="<?php echo esc_attr($val->id) ?>" <?php echo esc_attr($disabled) ?> style="margin:5px;"><label style="padding-top: 5px;font-weight: normal;font: 13px 'Helvetica Neue',Helvetica,Arial,sans-serif;"><?php echo isset($val->item_name) ? esc_html($val->item_name) : "" ?></label> | |
| 574 | + <input type="hidden" name="wppm_checklist_progress_ajax_nonce" id="wppm_checklist_progress_ajax_nonce" value="<?php echo esc_attr( wp_create_nonce( 'wppm_set_checklist_progress' ) ); ?>"> | |
| 163 | 575 | </div> |
| 164 | - <?php if ($list->created_by == $current_user->ID || $current_user->has_cap('manage_options') || $user_role == 1) { ?> | |
| 576 | + <?php if (($list->created_by == $current_user->ID || $current_user->has_cap('manage_options') || $user_role == 1 || $wppmfunction->has_permission('delete_checklist',$task->id)) && $task->is_archived!=1) { ?> | |
| 165 | 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' ) ); ?>"> | |
| 166 | 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' ) ); ?>"> | |
| 167 | 582 | </div> |
| 168 | 583 | <?php } ?> |
| 169 | - </div> | |
| 584 | + </li> | |
| 170 | 585 | <?php |
| 171 | 586 | } |
| 172 | 587 | } ?> |
| 173 | - <div class="row"> | |
| 174 | - <div class="col-sm-12 wppm_add_checklist_item_container_<?php echo esc_attr($list->id) ?>" style="padding-top:15px;"> | |
| 175 | - <a class="wppm_add_checklist" id="wppm_add_checklist_item_btn_<?php echo esc_attr($list->id) ?>" onclick="wppm_add_checklist_item(<?php echo esc_attr($list->id)?>)"><?php echo esc_html_e('+ Add item','taskbuilder');?></a> | |
| 588 | + <?php if(($wppmfunction->has_permission('add_checklist',$task->id) || $current_user->has_cap('manage_options')) && $task->is_archived!=1){ ?> | |
| 589 | + <div class="row"> | |
| 590 | + <div class="col-sm-12 wppm_add_checklist_item_container_<?php echo esc_attr($list->id) ?>" style="padding-top:15px;"> | |
| 591 | + <a class="wppm_add_checklist" id="wppm_add_checklist_item_btn_<?php echo esc_attr($list->id) ?>" onclick="wppm_add_checklist_item(<?php echo esc_attr($list->id)?>)"><?php echo esc_html_e('+ Add item','taskbuilder');?></a> | |
| 592 | + </div> | |
| 176 | 593 | </div> |
| 177 | - </div> | |
| 178 | - <div class="row"> | |
| 179 | - <div class="col-sm-12" style="display:none;" id="wppm_add_checklist_label_container_<?php echo esc_attr($list->id) ?>"> | |
| 180 | - <div class="row" id="wppm_add_new_checklist_item_<?php echo esc_attr($list->id) ?>"> | |
| 181 | - <div class="col-sm-12"> | |
| 182 | - <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;"> | |
| 183 | - <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) ?>)"> | |
| 184 | - <span onclick="wppm_remove_add_checklist_container(<?php echo esc_attr($list->id) ?>)"><img src="<?php echo esc_url( WPPM_PLUGIN_URL . 'asset/images/cancel.svg'); ?>" alt="delete"></span> | |
| 594 | + <?php }?> | |
| 595 | + <?php if(($wppmfunction->has_permission('add_checklist',$task->id) || $current_user->has_cap('manage_options')) && $task->is_archived!=1){ ?> | |
| 596 | + <div class="row"> | |
| 597 | + <div class="col-sm-12" style="display:none;" id="wppm_add_checklist_label_container_<?php echo esc_attr($list->id) ?>"> | |
| 598 | + <div class="row" id="wppm_add_new_checklist_item_<?php echo esc_attr($list->id) ?>"> | |
| 599 | + <div class="col-sm-12"> | |
| 600 | + <input type="text" id="wppm_checklist_item_label_<?php echo esc_attr($list->id) ?>" class="wppm_checklist_item_label_<?php echo esc_attr($list->id) ?>" placeholder="<?php echo esc_attr__('Add an item','taskbuilder') ?>" name="wppm_checklist_item_label" style="font: 13px 'Helvetica Neue',Helvetica,Arial,sans-serif;"> | |
| 601 | + <input type="button" value="Add" class="btn btn-success btn-sm wppm_add_new_item_btn_<?php echo esc_attr($list->id); ?>" onclick="wppm_add_new_checklist_item(<?php echo esc_attr($list->id)?>,<?php echo esc_attr($task->id)?>,<?php echo esc_attr($proj_id) ?>)"> | |
| 602 | + <input type="hidden" name="wppm_checklist_item_ajax_nonce" id="wppm_checklist_item_ajax_nonce" value="<?php echo esc_attr( wp_create_nonce( 'wppm_add_new_checklist_item' ) ); ?>"> | |
| 603 | + <span onclick="wppm_remove_add_checklist_container(<?php echo esc_attr($list->id) ?>)"><img src="<?php echo esc_url( WPPM_PLUGIN_URL . 'asset/images/cancel.svg'); ?>" alt="delete"></span> | |
| 604 | + </div> | |
| 605 | + </div> | |
| 606 | + </br> | |
| 607 | + </div> | |
| 185 | 608 | </div> |
| 186 | - </div> | |
| 187 | - </br> | |
| 188 | - </div> | |
| 189 | - </div> | |
| 609 | + <?php }?> | |
| 190 | 610 | <hr class="wppm_checklist_divider"> |
| 611 | + </ul> | |
| 191 | 612 | <?php |
| 192 | 613 | } |
| 193 | 614 | } ?> |
| 194 | - </div> | |
| 195 | - <div id="wppm_add_checklist_container"> | |
| 196 | - <div class="row"> | |
| 197 | - <div class="col-sm-12"> | |
| 198 | - <span id="wppm_add_checklist" onclick="wppm_add_checklist()"> <?php echo esc_html_e('+Add a checklist','taskbuilder')?> </span> | |
| 199 | - </div> | |
| 200 | - </div> | |
| 201 | - <div class="row" id="wppm_add_new_checklist" style="display:none;"> | |
| 202 | - <div class="col-sm-12"> | |
| 203 | - <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"> | |
| 204 | - <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) ?>)"> | |
| 205 | - <span onclick="wppm_remove_add_checklist()"><img src="<?php echo esc_url( WPPM_PLUGIN_URL . 'asset/images/cross1.svg'); ?>"></span> | |
| 206 | - </div> | |
| 207 | - </div> | |
| 208 | - </br> | |
| 209 | - </div> | |
| 615 | + </div><?php | |
| 616 | + if($user_role != 3){ | |
| 617 | + if(($wppmfunction->has_permission('add_checklist',$task->id) || $current_user->has_cap('manage_options')) && $task->is_archived!=1){ ?> | |
| 618 | + <div id="wppm_add_checklist_container"> | |
| 619 | + <div class="row"> | |
| 620 | + <div class="col-sm-12"> | |
| 621 | + <span id="wppm_add_checklist" onclick="wppm_add_checklist()"> <?php echo esc_html_e('+Add a checklist','taskbuilder')?> </span> | |
| 622 | + </div> | |
| 623 | + </div> | |
| 624 | + <div class="row" id="wppm_add_new_checklist" style="display:none;"> | |
| 625 | + <div class="col-sm-12"> | |
| 626 | + <input type="text" class="wppm_checklist_label" placeholder="<?php echo esc_attr__('Please insert checklist title','taskbuilder');?>" id="wppm_checklist_label" name="wppm_checklist_label"> | |
| 627 | + <input type="button" value="Add" id="wppm_checklist_btn" class="btn btn-success btn-sm" onclick="wppm_add_new_checklist(<?php echo esc_attr($id)?>,<?php echo esc_attr($proj_id) ?>)"> | |
| 628 | + <input type="hidden" name="wppm_checklist_ajax_nonce" id="wppm_checklist_ajax_nonce" value="<?php echo esc_attr( wp_create_nonce( 'wppm_add_new_checklist' ) ); ?>"> | |
| 629 | + <span onclick="wppm_remove_add_checklist()"><img src="<?php echo esc_url( WPPM_PLUGIN_URL . 'asset/images/cross1.svg'); ?>"></span> | |
| 630 | + </div> | |
| 631 | + </div> | |
| 632 | + </br> | |
| 633 | + </div><?php | |
| 634 | + } | |
| 635 | + }?> | |
| 210 | 636 | </div> |
| 211 | - <div id="wppm_activity_container"> | |
| 637 | + <div id="wppm_activity_container" style="<?php echo ($wppm_task_hide_comment_section==0 || $user_role==3) ? 'display:none;' : 'display:block;' ?>"> | |
| 212 | 638 | <div class="row"> |
| 213 | 639 | <div class="col-sm-12" style="margin-top:5px;"> |
| 214 | 640 | <span class="wppm_task_discussion"><?php echo esc_html_e('Comment','taskbuilder')?></span><br> |
| 215 | 641 | </div> |
| @@ -214,13 +640,13 @@ | ||
| 214 | 640 | <span class="wppm_task_discussion"><?php echo esc_html_e('Comment','taskbuilder')?></span><br> |
| 215 | 641 | </div> |
| 216 | 642 | </div> |
| 217 | 643 | <div class="row"> |
| 218 | - <div class="col-sm-12"> | |
| 644 | + <div class="col-sm-12" style="<?php echo ($task->is_archived==1) ? 'display:none;' : 'display:block;' ?>"> | |
| 219 | 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> |
| 220 | 646 | </div> |
| 221 | 647 | </div> |
| 222 | - <div class="row" id="wppm_comment_btn"> | |
| 648 | + <div class="row" id="wppm_comment_btn" style="<?php echo ($task->is_archived==1) ? 'display:none;' : 'display:block;' ?>"> | |
| 223 | 649 | <div class="col-sm-6"> |
| 224 | 650 | <span id="wppm_attach_file" onclick="wppm_upload_file()"><?php echo esc_html_e('Attach Files','taskbuilder')?></span> |
| 225 | 651 | </div> |
| 226 | 652 | <div class="col-sm-6"> |
| @@ -226,27 +652,36 @@ | ||
| 226 | 652 | <div class="col-sm-6"> |
| 227 | 653 | <button type="button" id="wppm_individual_cancel_comment_btn" onclick="wppm_cancel_comment();" class="wppm-btn-cancel"> |
| 228 | 654 | <?php echo esc_html_e('Cancel','taskbuilder')?> |
| 229 | 655 | </button> |
| 230 | - <button type="button" id="wppm_individual_submit_task_comment_btn" onclick="wppm_submit_task_comment(<?php echo esc_attr($id); ?>,<?php echo esc_attr($proj_id); ?>);" class="wppm-btn"> | |
| 656 | + <button type="button" id="wppm_individual_submit_task_comment_btn" style="background-color:<?php echo esc_attr($appearance_settings['comment-send-btn-bg-color'])?>;color:<?php echo esc_attr($appearance_settings['comment-send-btn-color'])?>!important;" onclick="wppm_submit_task_comment(<?php echo esc_attr($id); ?>,<?php echo esc_attr($proj_id); ?>);" class="wppm-btn"> | |
| 231 | 657 | <?php echo esc_html_e('SEND','taskbuilder')?> |
| 232 | 658 | </button> |
| 659 | + <input type="hidden" name="_ajax_nonce" value="<?php echo esc_attr( wp_create_nonce( 'wppm_submit_task_comment' ) ); ?>"> | |
| 233 | 660 | </div> |
| 234 | 661 | </div> |
| 235 | - <div class="row"> | |
| 662 | + <div class="row" style="<?php echo ($task->is_archived==1) ? 'display:none;' : 'display:block;' ?>"> | |
| 236 | 663 | <div class="wppm_attachment_container col-sm-12" style="display:none;"> |
| 237 | 664 | </div> |
| 238 | 665 | </div> |
| 239 | 666 | </div> |
| 240 | - <div class="wppm_thread_container"> | |
| 667 | + <div class="wppm_thread_container" style="<?php echo ($wppm_task_hide_comment_section==0 || $user_role==3) ? 'display:none;' : 'display:block;' ?>"> | |
| 241 | 668 | <?php |
| 242 | 669 | if(!empty($task_comment)){ |
| 243 | 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 | + ); | |
| 244 | 680 | $user = get_userdata( $comment->created_by ); |
| 245 | - $comment_body = stripslashes((htmlspecialchars_decode($comment->body, ENT_QUOTES))); | |
| 246 | - $comment_body = preg_replace('#<script(.*?)>(.*?)</script>#is', '', $comment_body); | |
| 247 | - $date = date("Y-m-d H:i:s" ,strtotime($comment->create_time)); | |
| 248 | - $thread_date = date("d F Y, h:i:s A" ,strtotime($date)); | |
| 681 | + $comment_body = (!empty($comment->body) ? ($comment->body) : ''); | |
| 682 | + $date = wp_date("Y-m-d H:i:s" ,strtotime($comment->create_time)); | |
| 683 | + $thread_date = wp_date("d F Y, h:i:s A" ,strtotime($date)); | |
| 249 | 684 | $attachment_ids = isset($comment->attachment_ids)? $comment->attachment_ids : ''; |
| 250 | 685 | if($attachment_ids!=""){ |
| 251 | 686 | $attachments = explode(",",$attachment_ids); |
| 252 | 687 | } else { |
| @@ -258,25 +693,133 @@ | ||
| 258 | 693 | <?php echo (get_avatar($comment->created_by, 40));?> |
| 259 | 694 | </div> |
| 260 | 695 | <div class="wppm_thread_body"> |
| 261 | 696 | <div class="wppm_thread_user_name"> |
| 262 | - <strong><?php echo esc_html($user->display_name) ?></strong> <small class="wppm_comment_date"><i><?php echo esc_html($thread_date) ?></i></small> | |
| 697 | + <strong style="color:<?php echo esc_attr($appearance_settings['comment-primary-color']);?>"><?php echo isset($user->display_name) ? esc_html($user->display_name) : '' ?></strong> | |
| 698 | + <span><?php if(!empty($comment->body) && (isset($task_comment_meta->comment_type) && $task_comment_meta->comment_type=='change_task_status')){ | |
| 699 | + $comment_log_body = unserialize($comment->body); | |
| 700 | + $prev_status = $comment_log_body['prev_status']; | |
| 701 | + $new_status = $comment_log_body['new_status']; | |
| 702 | + if(isset($prev_status)){ | |
| 703 | + $task_prev_status = $wpdb->get_row( $wpdb->prepare( | |
| 704 | + "SELECT * FROM {$wpdb->prefix}wppm_task_statuses where id = %d", | |
| 705 | + absint($prev_status) | |
| 706 | + )); | |
| 707 | + } | |
| 708 | + if(isset($new_status)){ | |
| 709 | + $task_new_status = $wpdb->get_row( $wpdb->prepare( | |
| 710 | + "SELECT * FROM {$wpdb->prefix}wppm_task_statuses where id = %d", | |
| 711 | + absint($new_status) | |
| 712 | + )); | |
| 713 | + } | |
| 714 | + printf( | |
| 715 | + esc_html__( 'Changed status from %1$s to %2$s', 'taskbuilder' ), | |
| 716 | + esc_html( $task_prev_status->name ), | |
| 717 | + esc_html( $task_new_status->name ) | |
| 718 | + ); | |
| 719 | + } if(!empty($comment->body) && (isset($task_comment_meta->comment_type) && $task_comment_meta->comment_type=='change_task_creator')){ | |
| 720 | + $comment_log_body = unserialize($comment->body); | |
| 721 | + $prev_user = $comment_log_body['prev_user']; | |
| 722 | + $new_user = $comment_log_body['new_user']; | |
| 723 | + $prev_user_data = get_userdata($prev_user); | |
| 724 | + $new_user_data = get_userdata($new_user); | |
| 725 | + printf( | |
| 726 | + esc_html__( 'Changed creator from %1$s to %2$s', 'taskbuilder' ), | |
| 727 | + esc_html( $prev_user_data->display_name ), | |
| 728 | + esc_html( $new_user_data->display_name ) | |
| 729 | + ); | |
| 730 | + } | |
| 731 | + if( !empty($comment->body) && (isset($task_comment_meta->comment_type) && $task_comment_meta->comment_type=='change_assign_user')){ | |
| 732 | + esc_html_e("changed the Assignee","taskbuilder"); | |
| 733 | + } | |
| 734 | + if(!empty($comment->body) && (isset($task_comment_meta->comment_type) && $task_comment_meta->comment_type=='change_task_priority')){ | |
| 735 | + $comment_log_body = unserialize($comment->body); | |
| 736 | + $prev_prio = $comment_log_body['prev_prio']; | |
| 737 | + $new_prio = $comment_log_body['new_prio']; | |
| 738 | + if(isset($prev_prio)){ | |
| 739 | + $prev_prio = absint($prev_prio); | |
| 740 | + $task_prev_prio = $wpdb->get_row( $wpdb->prepare( | |
| 741 | + "SELECT * FROM {$wpdb->prefix}wppm_task_priorities where id = %d", | |
| 742 | + $prev_prio | |
| 743 | + )); | |
| 744 | + } | |
| 745 | + if(isset($new_prio)){ | |
| 746 | + $new_prio = absint($new_prio); | |
| 747 | + $task_new_prio = $wpdb->get_row( $wpdb->prepare( | |
| 748 | + "SELECT * FROM {$wpdb->prefix}wppm_task_priorities where id = %d", | |
| 749 | + $new_prio | |
| 750 | + )); | |
| 751 | + } | |
| 752 | + $task_prev_prio_name = !empty($task_prev_prio) ? $task_prev_prio->name: "None"; | |
| 753 | + $task_new_prio_name = !empty($task_new_prio) ? $task_new_prio->name: "None"; | |
| 754 | + printf( | |
| 755 | + esc_html__( 'Changed priority from %1$s to %2$s', 'taskbuilder' ), | |
| 756 | + esc_html( $task_prev_prio_name ), | |
| 757 | + esc_html( $task_new_prio_name ) | |
| 758 | + ); | |
| 759 | + } | |
| 760 | + ?> | |
| 761 | + <small class="wppm_comment_date" style="color:<?php echo esc_attr($appearance_settings['comment-date-color']);?>"><i><?php echo isset($thread_date) ? esc_html($thread_date) : '' ?></i></small> | |
| 263 | 762 | <div class="wppm_thread_action"> |
| 264 | - <?php if(( ($current_user->has_cap('manage_options')) || ($wppmfunction->has_comment_permission('edit_task_comment',$id,$comment->id)))){ ?> | |
| 763 | + <?php if((((($current_user->has_cap('manage_options')) || ($wppmfunction->has_comment_permission('edit_task_comment',$id,$comment->id))) && ((empty($task_comment_meta->comment_type)) || (isset($task_comment_meta->comment_type) && $task_comment_meta->comment_type=='comment')))) && ($task->is_archived!=1)){ ?> | |
| 265 | 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> |
| 266 | 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> |
| 267 | 766 | <?php } ?> |
| 268 | 767 | </div> |
| 269 | 768 | </div> |
| 270 | - <div class="wppm_thread_messege"> | |
| 769 | + <div class="wppm_thread_messege" style="color:<?php echo esc_attr($appearance_settings['comment-secondary-color']);?>"> | |
| 271 | 770 | <?php |
| 272 | - $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(),)); | |
| 273 | - if(!empty($comment_body)){ | |
| 274 | - echo wp_kses(wpautop($comment_body),$allowedtags) ; | |
| 771 | + $allowedtags = array( 'br' => array(), 'abbr' => array('title' => array(),), 'p' => array(), 'strong' => array(), 'a' => array('href' => array(), 'title' => array(), 'target'=> array(), 'rel'=>array()),'em' =>array(),'span' =>array('class' => true, | |
| 772 | + 'data-user-id' => true,'data-username' => true,), 'blockquote'=>array('cite' => array(),),'div' => array('class' => array(),'title' => array(),'style' => array(),),'ul'=>array(),'li'=>array(),'ol'=>array(),'img' => array( 'alt'=> array(),'class' => array(),'height' => array(),'src'=> array(),'width'=> array(),)); | |
| 773 | + if(!empty($comment_body) && ((empty($task_comment_meta->comment_type)) || (isset($task_comment_meta->comment_type) && $task_comment_meta->comment_type=='comment') || (isset($task_comment_meta->comment_type) && $task_comment_meta->comment_type=='delete_task_comment'))){ | |
| 774 | + $comment_body = $wppmfunction->wppm_clean_mentions_html($comment_body); | |
| 775 | + $comment_body = $wppmfunction->wppm_highlight_user_mentions($comment_body, $current_user->ID); | |
| 776 | + //echo wp_kses(wpautop($comment_body),$allowedtags); | |
| 777 | + //wp_kses($comment, $allowed_tags); | |
| 778 | + echo wp_kses_post(($comment_body)); | |
| 779 | + } elseif(!empty($comment->body) && (isset($task_comment_meta->comment_type) && $task_comment_meta->comment_type=='change_task_status')){ ?> | |
| 780 | + <span class="wppm_admin_label" style="margin-right: 10px; background-color:<?php echo isset($task_prev_status->bg_color) ? esc_attr($task_prev_status->bg_color):""; ?>;color:<?php echo isset($task_prev_status->color) ? esc_attr($task_prev_status->color): "" ?>;"><?php echo isset($task_prev_status->name) ? esc_attr($task_prev_status->name) : "" ?></span> <img src="<?php echo esc_url( WPPM_PLUGIN_URL . 'asset/images/arrow-right.svg'); ?>" alt="arrow_right"> <span class="wppm_admin_label" style="margin-left:10px; background-color:<?php echo isset($task_new_status->bg_color) ? esc_attr($task_new_status->bg_color):""; ?>;color:<?php echo isset($task_new_status->color) ? esc_attr($task_new_status->color): "" ?>;"><?php echo isset($task_new_status->name) ? esc_attr($task_new_status->name) : "" ?></span><?php | |
| 781 | + }elseif(!empty($comment->body) && (isset($task_comment_meta->comment_type) && $task_comment_meta->comment_type=='change_task_creator')){ ?> | |
| 782 | + <span style="margin-right: 10px;"><?php echo isset($prev_user_data->display_name) ? esc_attr($prev_user_data->display_name) : "" ?></span> <img src="<?php echo esc_url( WPPM_PLUGIN_URL . 'asset/images/arrow-right.svg'); ?>" alt="arrow_right"> <span style="margin-left:10px;"><?php echo isset($new_user_data->display_name) ? esc_attr($new_user_data->display_name) : "" ?></span><?php | |
| 783 | + } elseif(!empty($comment->body) && (isset($task_comment_meta->comment_type) && $task_comment_meta->comment_type=='change_assign_user')) { | |
| 784 | + $comment_log_body = unserialize($comment->body); | |
| 785 | + $prev_assign_user = $comment_log_body['prev_assign_user']; | |
| 786 | + $new_assign_user = $comment_log_body['new_assign_user']; | |
| 787 | + $prev_assign_user_array = array(); | |
| 788 | + $new_assign_user_array = array(); | |
| 789 | + if(!empty($prev_assign_user)){ | |
| 790 | + $prev_assign_user_array = explode(",",$prev_assign_user); | |
| 791 | + } | |
| 792 | + if(!empty($new_assign_user)){ | |
| 793 | + $new_assign_user_array = explode(",",$new_assign_user); | |
| 794 | + } | |
| 795 | + $assign_user_name = array(); | |
| 796 | + $assign_user_name_str = ""; | |
| 797 | + if(!empty($prev_assign_user_array)){ | |
| 798 | + foreach($prev_assign_user_array as $val){ | |
| 799 | + $assign_user = get_userdata($val); | |
| 800 | + $assign_user_name[] = $assign_user->display_name; | |
| 801 | + } | |
| 802 | + $assign_user_name_str = implode(",",$assign_user_name); | |
| 803 | + } | |
| 804 | + $new_assign_user_name = array(); | |
| 805 | + $new_assign_user_name_str = ""; | |
| 806 | + if(!empty($new_assign_user_array)){ | |
| 807 | + foreach($new_assign_user_array as $val){ | |
| 808 | + $new_assign_user = get_userdata($val); | |
| 809 | + $new_assign_user_name[] = $new_assign_user->display_name; | |
| 810 | + } | |
| 811 | + $new_assign_user_name_str = implode(",",$new_assign_user_name); | |
| 812 | + } | |
| 813 | + ?> | |
| 814 | + <span style="margin-right: 10px;"><?php echo !empty($assign_user_name) ? esc_attr( $assign_user_name_str) : "None" ?></span> <img src="<?php echo esc_url( WPPM_PLUGIN_URL . 'asset/images/arrow-right.svg'); ?>" alt="arrow_right"> <span style="margin-left:10px;"><?php echo !empty($new_assign_user_name_str) ? esc_attr($new_assign_user_name_str) : "None" ?></span><?php | |
| 815 | + } elseif(!empty($comment->body) && (isset($task_comment_meta->comment_type) && $task_comment_meta->comment_type=='change_task_priority')){ ?> | |
| 816 | + <span class="wppm_admin_label" style="margin-right: 10px; background-color:<?php echo isset($task_prev_prio->bg_color) ? esc_attr($task_prev_prio->bg_color):""; ?>;color:<?php echo isset($task_prev_prio->color) ? esc_attr($task_prev_prio->color): "" ?>;"><?php echo !empty($task_prev_prio->name) ? esc_attr($task_prev_prio->name) : "None" ?></span> <img src="<?php echo esc_url( WPPM_PLUGIN_URL . 'asset/images/arrow-right.svg'); ?>" alt="arrow_right"> <span class="wppm_admin_label" style="margin-left:10px; background-color:<?php echo isset($task_new_prio->bg_color) ? esc_attr($task_new_prio->bg_color):""; ?>;color:<?php echo isset($task_new_prio->color) ? esc_attr($task_new_prio->color): "" ?>;"><?php echo !empty($task_new_prio->name) ? esc_attr($task_new_prio->name) : "None" ?></span><?php | |
| 275 | 817 | } ?> |
| 818 | + | |
| 276 | 819 | </div> |
| 277 | 820 | <?php |
| 278 | - if(!empty($attachments)):?> <br> | |
| 821 | + if(!empty($attachments)&& (isset($task_comment_meta->comment_type) && !($task_comment_meta->comment_type=='delete_task_comment'))):?> <br> | |
| 279 | 822 | <strong class="wppm_attachment_title"><?php echo esc_html_e('Attachments','taskbuilder');?>:</strong><br> |
| 280 | 823 | <table class="wppm_attachment_tbl"> |
| 281 | 824 | <tbody> |
| 282 | 825 | <?php |
| @@ -281,10 +824,14 @@ | ||
| 281 | 824 | <tbody> |
| 282 | 825 | <?php |
| 283 | 826 | if(!empty($attachments)){ |
| 284 | 827 | foreach( $attachments as $attachment ): |
| 285 | - $attach = $wpdb->get_row( "SELECT * FROM {$wpdb->prefix}wppm_attachments where id=".$attachment); | |
| 286 | 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)); | |
| 287 | 834 | $findStr = ".txt"; |
| 288 | 835 | if(!empty( $attach)){ |
| 289 | 836 | $attachment_name = preg_replace('/' . $findStr . '/', "", $attach->name, 1); |
| 290 | 837 | $attachment_name = sanitize_file_name($attachment_name); |
| @@ -294,13 +841,14 @@ | ||
| 294 | 841 | <tr class="wppm_attachment_tr"> |
| 295 | 842 | <td> |
| 296 | 843 | <a class="wppm_attachment_link" href="<?php echo esc_url($download_url) ?>" target="_blank"> |
| 297 | 844 | <span class="wppm_attachment_file_name" style="padding: 7px;"><?php echo isset($attach->file_name) ? esc_html($attach->file_name):"";?></span></a> |
| 298 | - <?php if((($comment->created_by == $current_user->ID) || ($current_user->has_cap('manage_options')) || ($wppmfunction->has_comment_permission('edit_task_comment',$id,$comment->id)))){ ?> | |
| 299 | - <span class="wppm_thread_action_btn" onclick="wppm_thread_attachment_remove(this,<?php echo esc_attr($attach->id); ?>,<?php echo esc_attr($comment->id); ?>,<?php echo esc_attr($id); ?>,<?php echo esc_attr($proj_id);?>)"><img src="<?php echo esc_url( WPPM_PLUGIN_URL . 'asset/images/cancel.svg'); ?>" alt="cancel"></span> | |
| 845 | + <?php if((($comment->created_by == $current_user->ID) || ($current_user->has_cap('manage_options')) || ($wppmfunction->has_comment_permission('edit_task_comment',$id,$comment->id))) && ($task->is_archived!=1)){ ?> | |
| 846 | + <span class="wppm_thread_action_btn" onclick="wppm_thread_attachment_remove(this,<?php echo !empty($attach->id) ? esc_attr($attach->id) : 0; ?>,<?php echo !empty($comment->id) ? esc_attr($comment->id) : 0; ?>,<?php echo !empty($id) ? esc_attr($id) : 0; ?>,<?php echo !empty($proj_id) ? esc_attr($proj_id) : 0;?>)"><img src="<?php echo esc_url( WPPM_PLUGIN_URL . 'asset/images/cancel.svg'); ?>" alt="cancel"></span> | |
| 300 | 847 | <?php } ?> |
| 301 | 848 | </td> |
| 302 | 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' ) ); ?>"> | |
| 303 | 851 | <?php } |
| 304 | 852 | endforeach; |
| 305 | 853 | } ?> |
| 306 | 854 | </tbody> |
| @@ -314,70 +862,160 @@ | ||
| 314 | 862 | </div> |
| 315 | 863 | </div> |
| 316 | 864 | <div class="wppm_individual_task_widget col-sm-4 wppm_sidebar col-md-3"> |
| 317 | 865 | <div class="row wppm_widget" id="wppm_status_widget"> |
| 318 | - <h4 class="widget_header"><?php echo esc_html_e('Status','taskbuilder')?> | |
| 319 | - <?php if ($wppmfunction->has_permission('change_status',$id) || $current_user->has_cap('manage_options')) { ?> | |
| 320 | - <span class="wppm_edit_task_details_widget" onclick="wppm_edit_task_status(<?php echo esc_attr($id) ?>,<?php echo esc_attr($proj_id) ?>)"><img src="<?php echo esc_url( WPPM_PLUGIN_URL . 'asset/images/edit_01.svg'); ?>" alt="edit"></span></h4> | |
| 321 | - <?php } ?> | |
| 866 | + <div class="wppm-widget-header" style="background-color:<?php echo esc_attr($appearance_settings['widget-header-bg-color'])?>"> | |
| 867 | + <h4 class="widget_header" style="color:<?php echo esc_attr($appearance_settings['widget-header-text-color'])?>"><?php echo esc_html_e('Status','taskbuilder')?></h4> | |
| 868 | + <?php | |
| 869 | + if($user_role != 3){ | |
| 870 | + if((($current_user->has_cap('manage_options') || $wppm_current_user_capability == ('wppm_admin') || ($flag==true) || ($wppmfunction->has_permission('change_task_status',$id))!="") && ($task->is_archived!=1))){ | |
| 871 | + ?> | |
| 872 | + <span class="wppm_edit_task_details_widget" onclick="wppm_edit_task_status(<?php echo esc_attr($id) ?>,<?php echo esc_attr($proj_id) ?>,<?php echo esc_attr($project_id) ?>)"><img src="<?php echo esc_url( WPPM_PLUGIN_URL . 'asset/images/edit_01.svg'); ?>" alt="edit"></span> | |
| 873 | + <?php | |
| 874 | + } | |
| 875 | + } | |
| 876 | + ?> | |
| 877 | + </div> | |
| 322 | 878 | <hr class="widget_divider"> |
| 323 | - <div class="wppm_sidebar_labels"><span class="wppm_label_info"><?php echo esc_html_e('Status','taskbuilder')?>:</span> <span class="wppm_admin_label" style="background-color:<?php echo (isset($task_status->bg_color))? esc_attr($task_status->bg_color):""?>;color:<?php echo (isset($task_status->color))? esc_attr($task_status->color):""?>;"><?php echo (isset($task_status->name))? esc_attr($task_status->name):"" ?> </span></div> | |
| 879 | + <div class="wppm-widget-body" style="background-color:<?php echo esc_attr($appearance_settings['widget-body-bg-color'])?>"> | |
| 880 | + <div class="wppm_sidebar_labels"><span class="wppm_label_info" style="color:<?php echo esc_attr($appearance_settings['widget-body-label-color'])?>"><?php echo esc_html_e('Status','taskbuilder')?>:</span> <span class="wppm_admin_label" style="background-color:<?php echo (isset($task_status->bg_color))? esc_attr($task_status->bg_color):""?>;color:<?php echo (isset($task_status->color))? esc_attr($task_status->color):""?>;"><?php echo (isset($task_status->name))? esc_attr($task_status->name):"" ?> </span></div> | |
| 881 | + </div> | |
| 324 | 882 | </div> |
| 325 | 883 | <div class="row wppm_widget" id="wppm_raisedby_widget"> |
| 326 | - <h4 class="widget_header"> | |
| 327 | - <?php echo esc_html_e('Task Creator','taskbuilder')?> | |
| 328 | - <?php if ($wppmfunction->has_permission('change_raised_by',$id ) || $current_user->has_cap('manage_options')) { ?> | |
| 329 | - <span class="wppm_edit_task_details_widget" onclick="wppm_edit_task_creator(<?php echo esc_attr($id) ?>,<?php echo esc_attr($proj_id) ?>)"><img src="<?php echo esc_url( WPPM_PLUGIN_URL . 'asset/images/edit_01.svg'); ?>" alt="edit"></span></h4> | |
| 330 | - <?php } ?> | |
| 884 | + <div class="wppm-widget-header" style="background-color:<?php echo esc_attr($appearance_settings['widget-header-bg-color'])?>"> | |
| 885 | + <h4 class="widget_header" style="color:<?php echo esc_attr($appearance_settings['widget-header-text-color'])?>"> | |
| 886 | + <?php echo esc_html_e('Task Creator','taskbuilder')?></h4> | |
| 887 | + <?php if($user_role != 3){ | |
| 888 | + if ((($wppmfunction->has_permission('change_raised_by',$id ) || $current_user->has_cap('manage_options')) && ($task->is_archived!=1))) { ?> | |
| 889 | + <span class="wppm_edit_task_details_widget" onclick="wppm_edit_task_creator(<?php echo esc_attr($id) ?>,<?php echo esc_attr($proj_id) ?>,<?php echo esc_attr($project_id) ?>)"><img src="<?php echo esc_url( WPPM_PLUGIN_URL . 'asset/images/edit_01.svg'); ?>" alt="edit"></span> | |
| 890 | + <?php } | |
| 891 | + }?> | |
| 892 | + </div> | |
| 331 | 893 | <hr class="widget_divider"> <?php |
| 332 | - $user_info = get_userdata($task->created_by); | |
| 894 | + if(isset($task->created_by)){ | |
| 895 | + $user_info = get_userdata($task->created_by); | |
| 896 | + }else{ | |
| 897 | + $user_info =""; | |
| 898 | + } | |
| 333 | 899 | ?> |
| 334 | - <div style="padding:2px 0;"> | |
| 335 | - <span class="wppm_task_user_avatar"><?php echo (get_avatar($task->created_by, 25, "mysteryman")); ?></span> | |
| 336 | - <span class="wppm_task_user_names"><?php echo esc_html($user_info->display_name); ?></span> | |
| 900 | + <div class="wppm-widget-body" style="background-color:<?php echo esc_attr($appearance_settings['widget-body-bg-color'])?>"> | |
| 901 | + <div style="padding:2px 0;"> | |
| 902 | + <span class="wppm_task_user_avatar"><?php echo (get_avatar($task->created_by, 25, "mysteryman")); ?></span> | |
| 903 | + <span class="wppm_task_user_names" style="color:<?php echo esc_attr($appearance_settings['widget-body-text-color'])?>;"><?php echo isset($user_info->display_name)?esc_html($user_info->display_name):""; ?></span> | |
| 904 | + </div> | |
| 337 | 905 | </div> |
| 338 | 906 | </div> |
| 339 | 907 | <div class="row wppm_widget" id="wppm_task_users_widget_container"> |
| 340 | - <h4 class="widget_header"> | |
| 341 | - <?php if ($wppmfunction->has_permission('assign_task_users',$id ) || $current_user->has_cap('manage_options')) { ?> | |
| 342 | - <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> | |
| 343 | - <?php } ?> | |
| 344 | - <span><?php echo esc_html_e('Users','taskbuilder')?></span></h4> | |
| 908 | + <div class="wppm-widget-header" style="background-color:<?php echo esc_attr($appearance_settings['widget-header-bg-color'])?>"> | |
| 909 | + <h4 class="widget_header" style="color:<?php echo esc_attr($appearance_settings['widget-header-text-color'])?>;"><?php echo esc_html_e('Users','taskbuilder')?></h4> | |
| 910 | + <?php | |
| 911 | + if($user_role != 3){ | |
| 912 | + if ((($wppmfunction->has_permission('assign_task_users',$id ) || $current_user->has_cap('manage_options')) && ($task->is_archived!=1))) { ?> | |
| 913 | + <span class="wppm_edit_task_details_widget" onclick="wppm_edit_task_users(<?php echo esc_attr($id) ?>,<?php echo esc_attr($proj_id) ?>,<?php echo esc_attr($project_id) ?>)"><img src="<?php echo esc_url( WPPM_PLUGIN_URL . 'asset/images/edit_01.svg'); ?>" alt="edit"></span> | |
| 914 | + <?php } | |
| 915 | + }?> | |
| 916 | + </div> | |
| 345 | 917 | <hr class="widget_divider"> |
| 346 | - <div id="wppm_task_users"> | |
| 347 | - <?php | |
| 348 | - $i=0; | |
| 349 | - if(!empty($users)){ | |
| 350 | - foreach($users as $user) { | |
| 351 | - $user_data = get_userdata($user); | |
| 352 | - if(!empty($project_data['users'])){ | |
| 353 | - $proj_users = explode(',',$project_data['users']); | |
| 354 | - if(in_array($user,$proj_users)){ | |
| 355 | - $i++; | |
| 356 | - ?> | |
| 357 | - <div style="padding:2px 0;"> | |
| 358 | - <span class="wppm_task_user_avatar"><?php echo (get_avatar($user, 25, "mysteryman")); ?></span> | |
| 359 | - <span class="wppm_task_user_names"><?php echo ((!empty($user_data))? esc_html($user_data->display_name) :"") ?></span> | |
| 360 | - </div> | |
| 361 | - <?php | |
| 918 | + <div class="wppm-widget-body" style="background-color:<?php echo esc_attr($appearance_settings['widget-body-bg-color'])?>"> | |
| 919 | + <div id="wppm_task_users"> | |
| 920 | + <?php | |
| 921 | + $i=0; | |
| 922 | + if(!empty($users)){ | |
| 923 | + foreach($users as $user) { | |
| 924 | + $user_data = get_userdata($user); | |
| 925 | + if(!empty($project_data['users'])){ | |
| 926 | + $proj_users = explode(',',$project_data['users']); | |
| 927 | + if(in_array($user,$proj_users)){ | |
| 928 | + $i++; | |
| 929 | + ?> | |
| 930 | + <div style="padding:2px 0;"> | |
| 931 | + <span class="wppm_task_user_avatar"><?php echo (get_avatar($user, 25, "mysteryman")); ?></span> | |
| 932 | + <span class="wppm_task_user_names" style="color:<?php echo esc_attr($appearance_settings['widget-body-text-color'])?>;"><?php echo ((!empty($user_data))? esc_html($user_data->display_name) :"") ?></span> | |
| 933 | + </div> | |
| 934 | + <?php | |
| 935 | + } | |
| 362 | 936 | } |
| 363 | 937 | } |
| 364 | 938 | } |
| 365 | - } | |
| 366 | - if($i==0){ ?> | |
| 367 | - <span class="wppm_display_user_none"><?php echo esc_html_e('None','taskbuilder'); ?></span> <?php | |
| 368 | - } | |
| 369 | - ?> | |
| 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> | |
| 370 | 944 | </div> |
| 371 | 945 | </div> |
| 372 | - <?php do_action('wppm_after_task_widgets',$id,$proj_id);?> | |
| 946 | + <?php do_action('wppm_after_task_widgets',$id,$task_id );?> | |
| 373 | 947 | </div> |
| 374 | - <input type="hidden" id="wppm_nonce" value="<?php echo wp_create_nonce()?>"> | |
| 948 | + <input type="hidden" id="wppm_nonce" value="<?php echo esc_attr(wp_create_nonce('wppm_upload_file'))?>"> | |
| 375 | 949 | <input type="file" id="wppm_attachment_upload" class="hidden" onchange=""> |
| 376 | 950 | </div> |
| 377 | 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> | |
| 378 | 960 | <script> |
| 379 | 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 } ?> | |
| 380 | 1018 | <?php foreach ($wppm_checklist as $chklist) { ?> |
| 381 | 1019 | var $checkboxes = jQuery('.wppm_checklist_item_'+<?php echo esc_attr($chklist->id);?>); |
| 382 | 1020 | var $progress = jQuery('#CheckProgress_'+<?php echo esc_attr($chklist->id);?>); |
| 383 | 1021 | var total = $checkboxes.length; |
| @@ -387,9 +1025,9 @@ | ||
| 387 | 1025 | jQuery('#CheckProgress_'+<?php echo esc_attr($chklist->id);?>).css('width', progressWidth + '%'); |
| 388 | 1026 | if(progressWidth>0){ |
| 389 | 1027 | jQuery('#wppm_progressbar_label_'+<?php echo esc_attr($chklist->id);?>).text(progressWidth+'%'); |
| 390 | 1028 | } |
| 391 | - <?php $wppm_checklist_items = $wpdb->get_results( "SELECT * FROM {$wpdb->prefix}wppm_checklist_items where checklist_id=".$chklist->id); | |
| 1029 | + <?php $wppm_checklist_items = $wpdb->get_results( $wpdb->prepare("SELECT * FROM {$wpdb->prefix}wppm_checklist_items where checklist_id=%d",$chklist->id)); | |
| 392 | 1030 | foreach ($wppm_checklist_items as $chkitems) { |
| 393 | 1031 | ?> jQuery( '#wppm_checklist_'+<?php echo esc_attr($chkitems->id);?>).on("mouseover", function () { |
| 394 | 1032 | jQuery( '#wppm_checklist_action_'+<?php echo esc_attr($chkitems->id);?>).css("display","inline"); |
| 395 | 1033 | jQuery( '#wppm_checklist_'+<?php echo esc_attr($chkitems->id);?>).css("background-color","#e7e8ea"); |
| @@ -400,37 +1038,188 @@ | ||
| 400 | 1038 | }) |
| 401 | 1039 | <?php |
| 402 | 1040 | } |
| 403 | 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)){ | |
| 404 | 1131 | ?> |
| 405 | -}); | |
| 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 | +} | |
| 406 | 1149 | |
| 407 | 1150 | function wppm_add_task_comment(){ |
| 408 | - tinymce.remove(); | |
| 409 | - tinymce.init({ | |
| 410 | - selector:'#wppm_task_comment', | |
| 411 | - body_id: 'wppm_task_comment', | |
| 412 | - directionality : '<?php //echo 'rtl'; ?>', | |
| 413 | - menubar: false, | |
| 414 | - statusbar: false, | |
| 415 | - height : '200', | |
| 416 | - width : '100%', | |
| 417 | - plugins: [ | |
| 418 | - 'lists link image directionality paste' | |
| 419 | - ], | |
| 420 | - image_advtab: true, | |
| 421 | - toolbar: 'bold italic underline blockquote | alignleft aligncenter alignright | bullist numlist | rtl | link image', | |
| 422 | - branding: false, | |
| 423 | - autoresize_bottom_margin: 20, | |
| 424 | - browser_spellcheck : true, | |
| 425 | - relative_urls : false, | |
| 426 | - remove_script_host : false, | |
| 427 | - convert_urls : true, | |
| 428 | - paste_as_text: true, | |
| 429 | - setup: function (editor) { | |
| 1151 | + if((wppm_admin.rich_text_editor == 1)){ | |
| 1152 | + tinymce.remove(); | |
| 1153 | + tinymce.init({ | |
| 1154 | + selector:'#wppm_task_comment', | |
| 1155 | + body_id: 'wppm_task_comment', | |
| 1156 | + directionality : '<?php //echo 'rtl'; ?>', | |
| 1157 | + menubar: false, | |
| 1158 | + statusbar: false, | |
| 1159 | + height : '200', | |
| 1160 | + width : '100%', | |
| 1161 | + plugins: [ | |
| 1162 | + 'lists link image directionality paste textcolor' | |
| 1163 | + ], | |
| 1164 | + image_advtab: true, | |
| 1165 | + toolbar:'<?php echo esc_js( $toolbar ); ?>', | |
| 1166 | + branding: false, | |
| 1167 | + autoresize_bottom_margin: 20, | |
| 1168 | + browser_spellcheck : true, | |
| 1169 | + relative_urls : false, | |
| 1170 | + remove_script_host : false, | |
| 1171 | + convert_urls : true, | |
| 1172 | + paste_as_text: true, | |
| 1173 | + setup: function (editor) { | |
| 1174 | + wppmMentionSetup(editor); | |
| 1175 | + } | |
| 1176 | + }); | |
| 1177 | + } else{ | |
| 1178 | + jQuery('#wppm_task_comment').css("width", "100%"); | |
| 1179 | + jQuery('#wppm_task_comment').css("height", "160px"); | |
| 1180 | + jQuery('#wppm_task_comment').css("color", "#000"); | |
| 1181 | + } | |
| 1182 | + jQuery('#wppm_comment_btn').show(); | |
| 1183 | +} | |
| 1184 | + | |
| 1185 | +function wppm_submit_task_comment(id, proj_id){ | |
| 1186 | + jQuery('#wppm_mention_list').remove(); | |
| 1187 | + var dataform = new FormData(jQuery('#wppm_open_task')[0]); | |
| 1188 | + dataform.append('action','wppm_submit_task_comment'); | |
| 1189 | + let comment_body; | |
| 1190 | + if(wppm_admin.rich_text_editor == 1){ | |
| 1191 | + const editor = tinyMCE.get('wppm_task_comment'); | |
| 1192 | + // Remove dropdown from TinyMCE iframe | |
| 1193 | + const dropdown = editor.getDoc().getElementById('wppm_mention_list'); | |
| 1194 | + if (dropdown) { | |
| 1195 | + dropdown.remove(); | |
| 430 | 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 | + } | |
| 431 | 1221 | }); |
| 432 | - jQuery('#wppm_comment_btn').show(); | |
| 433 | 1222 | } |
| 434 | 1223 | |
| 435 | 1224 | function wppm_add_checklist_item(checklist_id){ |
| 436 | 1225 | jQuery('#wppm_add_checklist_label_container_'+checklist_id).show(); |
| @@ -466,9 +1255,10 @@ | ||
| 466 | 1255 | var file_extension = file_name_split[file_name_split.length-1]; |
| 467 | 1256 | file_extension = file_extension.toLowerCase(); |
| 468 | 1257 | if( (jQuery.inArray(file_extension,allowedExtension) > -1)){ |
| 469 | 1258 | flag = true; |
| 470 | - alert("<?php _e('Attached file type not allowed!','taskbuilder')?>"); | |
| 1259 | + alert("<?php echo esc_js(__( 'Attached file type not allowed!', 'taskbuilder' ) ); ?>"); | |
| 1260 | + | |
| 471 | 1261 | }; |
| 472 | 1262 | <?php |
| 473 | 1263 | $max_upload = (int)(ini_get('upload_max_filesize')); ?> |
| 474 | 1264 | var current_filesize=file.size/1000000; |
| @@ -473,9 +1263,9 @@ | ||
| 473 | 1263 | $max_upload = (int)(ini_get('upload_max_filesize')); ?> |
| 474 | 1264 | var current_filesize=file.size/1000000; |
| 475 | 1265 | if(current_filesize > <?php echo esc_attr($max_upload); ?>){ |
| 476 | 1266 | flag = true; |
| 477 | - alert("<?php _e('File size exceed allowed limit!','taskbuilder')?>"); | |
| 1267 | + alert("<?php echo esc_js(__('File size exceed allowed limit!','taskbuilder')); ?>"); | |
| 478 | 1268 | } |
| 479 | 1269 | if (!flag){ |
| 480 | 1270 | var html_str = '<div class="wppm_attachment">'+ |
| 481 | 1271 | '<div class="progress" style="float: none !important; width: unset !important;">'+ |
| @@ -523,5 +1313,226 @@ | ||
| 523 | 1313 | } |
| 524 | 1314 | }); |
| 525 | 1315 | jQuery('#wppm_attachment_upload').trigger('click'); |
| 526 | 1316 | } |
| 527 | -</script> | |
| 1317 | + | |
| 1318 | +function wppmMentionSetup(editor) { | |
| 1319 | + let mentionIndex = -1; | |
| 1320 | + editor.on('keyup', function (e) { | |
| 1321 | + editor.lastMentionRange = editor.selection.getRng(); | |
| 1322 | + let rng = editor.selection.getRng(); | |
| 1323 | + let node = rng.startContainer; | |
| 1324 | + | |
| 1325 | + if (!node || node.nodeType !== 3) return; | |
| 1326 | + | |
| 1327 | + let text = node.textContent; | |
| 1328 | + let cursorPos = rng.startOffset; | |
| 1329 | + let textBeforeCursor = text.substring(0, cursorPos); | |
| 1330 | + | |
| 1331 | + let match = textBeforeCursor.match(/@(\w*)$/); | |
| 1332 | + let dropdown = getMentionDropdown(editor); | |
| 1333 | + | |
| 1334 | + if (match) { | |
| 1335 | + let query = match[1]; | |
| 1336 | + let rect = rng.getBoundingClientRect(); | |
| 1337 | + if (!rect || rect.top === 0) { | |
| 1338 | + rect = editor.selection.getNode().getBoundingClientRect(); | |
| 1339 | + } | |
| 1340 | + let top = rect.bottom + editor.getWin().scrollY; | |
| 1341 | + let left = rect.left + editor.getWin().scrollX; | |
| 1342 | + jQuery.post(wppm_admin.ajax_url, { | |
| 1343 | + action: 'wppm_filter_autocomplete', | |
| 1344 | + term: query, | |
| 1345 | + field : 'task_user_name', | |
| 1346 | + task_id:<?php echo esc_attr($task_id) ?>, | |
| 1347 | + proj_id:<?php echo esc_attr($proj_id) ?> | |
| 1348 | + }, function (res) { | |
| 1349 | + | |
| 1350 | + if (typeof res === "string") res = JSON.parse(res); | |
| 1351 | + if (res.success) res = res.data; | |
| 1352 | + | |
| 1353 | + if (!Array.isArray(res)) return; | |
| 1354 | + | |
| 1355 | + dropdown.empty(); | |
| 1356 | + if( res.length === 0 ){ | |
| 1357 | + dropdown.hide(); | |
| 1358 | + return; | |
| 1359 | + }else{ | |
| 1360 | + res.forEach(user => { | |
| 1361 | + let item = jQuery('<div>') | |
| 1362 | + .addClass('mention-item') | |
| 1363 | + .attr('data-username', user.label) | |
| 1364 | + .attr('data-user-id', user.user_id) | |
| 1365 | + .text(user.label) | |
| 1366 | + .css({ | |
| 1367 | + padding: '8px 12px', | |
| 1368 | + cursor: 'pointer', | |
| 1369 | + fontSize: '14px', | |
| 1370 | + color: '#333', | |
| 1371 | + background: '#fff', | |
| 1372 | + borderBottom: '1px solid #eee' | |
| 1373 | + }); | |
| 1374 | + | |
| 1375 | + item.on('mouseenter', function () { | |
| 1376 | + jQuery(this).css({ | |
| 1377 | + background: '#0073aa', | |
| 1378 | + color: '#fff' | |
| 1379 | + }); | |
| 1380 | + }); | |
| 1381 | + item.on('mouseleave', function () { | |
| 1382 | + if (!jQuery(this).hasClass('active')) { | |
| 1383 | + jQuery(this).css({ | |
| 1384 | + background: '#fff', | |
| 1385 | + color: '#333' | |
| 1386 | + }); | |
| 1387 | + } | |
| 1388 | + }); | |
| 1389 | + dropdown.append(item); | |
| 1390 | + }); | |
| 1391 | + let items = dropdown.find('.mention-item'); | |
| 1392 | + items.removeClass('active').css({ | |
| 1393 | + background: '#fff', | |
| 1394 | + color: '#333' | |
| 1395 | + }); | |
| 1396 | + items.eq(0) | |
| 1397 | + .addClass('active') | |
| 1398 | + .css({ | |
| 1399 | + background: '#0073aa', | |
| 1400 | + color: '#fff' | |
| 1401 | + }); | |
| 1402 | + mentionIndex = 0; | |
| 1403 | + updateActiveItem(items.eq(0), mentionIndex); | |
| 1404 | + dropdown.css({ | |
| 1405 | + position: 'absolute', | |
| 1406 | + display: 'none', | |
| 1407 | + background: '#fff', | |
| 1408 | + border: '1px solid #ddd', | |
| 1409 | + borderRadius: '6px', | |
| 1410 | + padding: '5px 0', | |
| 1411 | + minWidth: '180px', | |
| 1412 | + maxHeight: '220px', | |
| 1413 | + overflowY: 'auto', | |
| 1414 | + boxShadow: '0 4px 10px rgba(0,0,0,.15)', | |
| 1415 | + zIndex: 999999999999999 | |
| 1416 | + }).show(); | |
| 1417 | + } | |
| 1418 | + }); | |
| 1419 | + } else { | |
| 1420 | + dropdown.hide(); | |
| 1421 | + } | |
| 1422 | + }); | |
| 1423 | + editor.on('keydown', function (e) { | |
| 1424 | + let dropdown = getMentionDropdown(editor); | |
| 1425 | + let items = dropdown.find('.mention-item'); | |
| 1426 | + | |
| 1427 | + if (!dropdown.is(':visible') || !items.length) return; | |
| 1428 | + | |
| 1429 | + // DOWN | |
| 1430 | + if (e.key === 'ArrowDown') { | |
| 1431 | + e.preventDefault(); | |
| 1432 | + mentionIndex++; | |
| 1433 | + | |
| 1434 | + if (mentionIndex >= items.length) { | |
| 1435 | + mentionIndex = 0; | |
| 1436 | + } | |
| 1437 | + updateActiveItem(items, mentionIndex); | |
| 1438 | + items.removeClass('active').css({ | |
| 1439 | + background: '#fff', | |
| 1440 | + color: '#333' | |
| 1441 | + }); | |
| 1442 | + | |
| 1443 | + items.eq(mentionIndex) | |
| 1444 | + .addClass('active') | |
| 1445 | + .css({ | |
| 1446 | + background: '#0073aa', | |
| 1447 | + color: '#fff' | |
| 1448 | + }); | |
| 1449 | + } | |
| 1450 | + | |
| 1451 | + // UP | |
| 1452 | + if (e.key === 'ArrowUp') { | |
| 1453 | + e.preventDefault(); | |
| 1454 | + mentionIndex--; | |
| 1455 | + if (mentionIndex < 0) { | |
| 1456 | + mentionIndex = items.length - 1; | |
| 1457 | + } | |
| 1458 | + updateActiveItem(items, mentionIndex); | |
| 1459 | + items.removeClass('active').css({ | |
| 1460 | + background: '#fff', | |
| 1461 | + color: '#333' | |
| 1462 | + }); | |
| 1463 | + | |
| 1464 | + items.eq(mentionIndex) | |
| 1465 | + .addClass('active') | |
| 1466 | + .css({ | |
| 1467 | + background: '#0073aa', | |
| 1468 | + color: '#fff' | |
| 1469 | + }); | |
| 1470 | + } | |
| 1471 | + // ENTER | |
| 1472 | + if (e.key === 'Enter') { | |
| 1473 | + if (mentionIndex >= 0) { | |
| 1474 | + e.preventDefault(); | |
| 1475 | + items.eq(mentionIndex).trigger('click'); | |
| 1476 | + } | |
| 1477 | + } | |
| 1478 | + // ESC | |
| 1479 | + if (e.key === 'Escape') { | |
| 1480 | + dropdown.hide(); | |
| 1481 | + mentionIndex = -1; | |
| 1482 | + } | |
| 1483 | + }); | |
| 1484 | + editor.on('click', function (e) { | |
| 1485 | + let target = jQuery(e.target); | |
| 1486 | + if (target.hasClass('mention-item')) { | |
| 1487 | + let username = target.data('username'); | |
| 1488 | + let userId = target.data('user-id'); | |
| 1489 | + | |
| 1490 | + editor.focus(); | |
| 1491 | + | |
| 1492 | + let rng = editor.lastMentionRange || editor.selection.getRng(); | |
| 1493 | + editor.selection.setRng(rng); | |
| 1494 | + | |
| 1495 | + let node = rng.startContainer; | |
| 1496 | + if (!node || node.nodeType !== 3) return; | |
| 1497 | + | |
| 1498 | + let text = node.textContent; | |
| 1499 | + let cursorPos = rng.startOffset; | |
| 1500 | + | |
| 1501 | + let lastAtIndex = text.substring(0, cursorPos).lastIndexOf('@'); | |
| 1502 | + | |
| 1503 | + if (lastAtIndex !== -1) { | |
| 1504 | + | |
| 1505 | + let range = editor.selection.getRng(); | |
| 1506 | + range.setStart(node, lastAtIndex); | |
| 1507 | + range.setEnd(node, cursorPos); | |
| 1508 | + | |
| 1509 | + editor.selection.setRng(range); | |
| 1510 | + | |
| 1511 | + editor.selection.setContent( | |
| 1512 | + '<span class="wppm-mention" contenteditable="false" data-username="' + username + '" data-user-id="' + userId + '">@' + username + '</span> ' | |
| 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> | |