PluginProbe
Tutor LMS – eLearning and online course solution / 3.7.2
Tutor LMS – eLearning and online course solution v3.7.2
4.0.7 4.0.6 4.0.5 4.0.4 4.0.3 4.0.2 4.0.1 4.0.0 3.9.15 3.9.14 3.9.13 3.9.12 3.9.11 trunk 1.0.0 1.0.0-alpha 1.0.1 1.0.2 1.0.3 1.0.4 1.0.5 1.0.6 1.0.7 1.0.8 1.0.9 All 191 releases
tutor / views / pages / instructors.php
instructors.php
507 lines 19.7 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2 /**
3 * Instructors List Template.
4 *
5 * @package Tutor\Views
6 * @subpackage Tutor\Instructor
7 * @author Themeum <support@themeum.com>
8 * @link https://themeum.com
9 * @since 2.0.0
10 */
11
12 if ( ! defined( 'ABSPATH' ) ) {
13 exit;
14 }
15
16 use TUTOR\Input;
17 use TUTOR\Instructors_List;
18 use Tutor\Models\CourseModel;
19
20 $allowed_subpage = array();
21
22 if ( Input::has( 'sub_page' ) ) {
23 $sub_page = Input::get( 'sub_page' );
24 if ( in_array( $sub_page, $allowed, true ) ) {
25 include_once tutor()->path . "views/pages/{$sub_page}.php";
26 return;
27 }
28 }
29
30 $instructors = tutor_lms()->instructor_list;
31
32 /**
33 * Short able params
34 */
35 $user_id = Input::get( 'user_id', '' );
36 $course_id = Input::get( 'course-id', '' );
37 $data_order = Input::get( 'order', 'DESC' );
38 $date = Input::get( 'date', '' );
39 $search_term = Input::get( 'search', '' );
40
41 /**
42 * Determine active tab
43 */
44 $active_tab = Input::get( 'data', 'all' );
45
46 /**
47 * Pagination data
48 */
49 $selected_page = Input::get( 'paged', 1, Input::TYPE_INT );
50 $per_page_data = tutor_utils()->get_option( 'pagination_per_page' );
51 $offset = ( $per_page_data * $selected_page ) - $per_page_data;
52
53 // Available status for instructor.
54 $available_status = array(
55 'pending' => array( __( 'Pending', 'tutor' ), 'select-warning' ),
56 'approved' => array( __( 'Approved', 'tutor' ), 'select-success' ),
57 'blocked' => array( __( 'Blocked', 'tutor' ), 'select-danger' ),
58 );
59
60 $instructor_status = array( 'approved', 'pending', 'blocked' );
61 if ( 'pending' === $active_tab ) {
62 $instructor_status = array( 'pending' );
63 $available_status['reject'] = array( __( 'Reject', 'tutor' ), 'select-danger' );
64
65 } elseif ( 'blocked' === $active_tab ) {
66 $instructor_status = array( 'blocked' );
67 } elseif ( 'approved' === $active_tab ) {
68 $instructor_status = array( 'approved' );
69 }
70
71 $instructors_list = $instructors::get_instructors( $instructor_status, $offset, $per_page_data, $search_term, $course_id, $date, $data_order );
72 $total = $instructors::count_total_instructors( $instructor_status, $search_term, $course_id, $date );
73
74 /**
75 * Navbar data to make nav menu
76 */
77 $url = get_pagenum_link();
78 $add_insructor_url = $url . '&sub_page=add_new_instructor';
79 $navbar_data = array(
80 'page_title' => $instructors->page_title,
81 'add_button' => true,
82 'button_title' => __( 'Add New', 'tutor' ),
83 'button_url' => $add_insructor_url,
84 'modal_target' => 'tutor-instructor-add-new',
85 );
86
87 $filters = array(
88 'bulk_action' => $instructors->bulk_action,
89 'bulk_actions' => $instructors->prpare_bulk_actions(),
90 'ajax_action' => 'tutor_instructor_bulk_action',
91 'filters' => array(
92 array(
93 'label' => __( 'Courses', 'tutor' ),
94 'field_type' => 'select',
95 'field_name' => 'course-id',
96 'options' => CourseModel::get_course_dropdown_options(),
97 'searchable' => true,
98 'value' => Input::get( 'course-id', '' ),
99 ),
100 array(
101 'label' => __( 'Status', 'tutor' ),
102 'field_type' => 'select',
103 'field_name' => 'data',
104 'options' => $instructors->tabs_key_value( $search_term, $course_id, $date ),
105 'searchable' => false,
106 'value' => Input::get( 'data', '' ),
107 ),
108 array(
109 'label' => __( 'Date', 'tutor' ),
110 'field_type' => 'date',
111 'field_name' => 'date',
112 'show_label' => true,
113 'value' => Input::get( 'date', '' ),
114 ),
115 ),
116 );
117
118 ?>
119
120 <div class="tutor-admin-wrap">
121 <?php
122 /**
123 * Load Templates with data.
124 */
125 $navbar_template = tutor()->path . 'views/elements/list-navbar.php';
126 $filters_template = tutor()->path . 'views/elements/list-filters.php';
127 tutor_load_template_from_custom_path( $navbar_template, $navbar_data );
128 tutor_load_template_from_custom_path( $filters_template, $filters );
129 ?>
130 <div class="tutor-admin-container tutor-admin-container-lg tutor-mt-16">
131 <?php if ( is_array( $instructors_list ) && count( $instructors_list ) ) : ?>
132 <div class="tutor-table-responsive tutor-dashboard-list-table">
133 <table class="tutor-table tutor-table-middle table-instructors tutor-table-with-checkbox">
134 <thead>
135 <tr>
136 <th width="5%">
137 <div class="tutor-d-flex">
138 <input type="checkbox" id="tutor-bulk-checkbox-all" class="tutor-form-check-input" />
139 </div>
140 </th>
141 <th class="tutor-table-rows-sorting" width="25%">
142 <?php esc_html_e( 'Name', 'tutor' ); ?>
143 <span class="tutor-icon-ordering-a-z a-to-z-sort-icon"></span>
144 </th>
145 <th class="tutor-table-rows-sorting" width="30%">
146 <?php esc_html_e( 'Email', 'tutor' ); ?>
147 <span class="tutor-icon-ordering-a-z a-to-z-sort-icon"></span>
148 </th>
149 <th class="tutor-table-rows-sorting" width="5%">
150 <?php esc_html_e( 'Total Courses', 'tutor' ); ?>
151 <span class="tutor-icon-order-down up-down-icon"></span>
152 </th>
153 <th class="tutor-table-rows-sorting" width="5%">
154 <?php esc_html_e( 'Commission Rate', 'tutor' ); ?>
155 </th>
156
157 <?php do_action( 'tutor_after_instructor_list_commission_column' ); ?>
158
159 <th class="tutor-table-rows-sorting" width="10%">
160 <?php esc_html_e( 'Status', 'tutor' ); ?>
161 <span class="tutor-icon-order-down up-down-icon"></span>
162 </th>
163 <th></th>
164 </tr>
165 </thead>
166 <tbody>
167 <?php
168 foreach ( $instructors_list as $list ) :
169 $alert = ( 'pending' === $list->status ? 'warning' : ( 'approved' === $list->status ? 'success' : ( 'blocked' === $list->status ? 'danger' : 'default' ) ) );
170 $user_data = get_userdata( $list->ID );
171 ?>
172 <tr>
173 <td>
174 <div class="td-checkbox tutor-d-flex ">
175 <input id="tutor-admin-list-<?php echo esc_attr( $list->ID ); ?>" type="checkbox" class="tutor-form-check-input tutor-bulk-checkbox" name="tutor-bulk-checkbox-all" value="<?php echo esc_attr( $list->ID ); ?>" />
176 </div>
177 </td>
178 <td>
179 <div class="tutor-d-flex tutor-align-center tutor-gap-1">
180 <?php
181 echo wp_kses(
182 tutor_utils()->get_tutor_avatar( $list->ID ),
183 tutor_utils()->allowed_avatar_tags()
184 );
185 ?>
186 <?php echo esc_html( tutils()->get_user_name( $user_data ) ); ?>
187 <a href="<?php echo esc_url( tutor_utils()->profile_url( $list->ID, true ) ); ?>" class="tutor-iconic-btn" target="_blank">
188 <span class="tutor-icon-external-link"></span>
189 </a>
190 </div>
191 </td>
192 <td data-th="<?php esc_html_e( 'Email', 'tutor' ); ?>">
193 <div class="tutor-d-flex tutor-align-center" style="gap: 5px;">
194 <span class="tutor-fs-7"><?php echo esc_html( $list->user_email ); ?></span>
195 <?php do_action( 'tutor_show_email_verified_badge', $list->ID ); ?>
196 </div>
197 </td>
198 </td>
199 <td data-th="<?php esc_html_e( 'Total Course', 'tutor' ); ?>">
200 <span class="tutor-color-black tutor-fs-7">
201 <?php echo esc_html( $instructors->column_total_course( $list, 'total_course' ) ); ?>
202 </span>
203 </td>
204 <td data-th="<?php esc_html_e( 'Commission Rate', 'tutor' ); ?>">
205 <span class="tutor-color-black tutor-fs-7">
206 <?php
207 $commision_string = tutor_utils()->get_option( 'earning_instructor_commission' ) . '%';
208 echo apply_filters( 'tutor_pro_instructor_commission_string', $commision_string, $list->ID ); //phpcs:ignore
209 ?>
210 </span>
211 </td>
212
213 <?php do_action( 'tutor_after_instructor_list_commission_column_data', $list->ID ); ?>
214
215 <td data-th="<?php esc_html_e( 'Status', 'tutor' ); ?>">
216 <span style="display:block; width:0; height:0; overflow:hidden;">
217 <?php
218 // Render for frontend sorting.
219 echo esc_html( $available_status[ $list->status ][0] );
220 ?>
221 </span>
222 <div class="tutor-form-select-with-icon <?php echo esc_html( $available_status[ $list->status ][1] ); ?>">
223 <select class="tutor-table-row-status-update" data-bulk-ids="<?php echo esc_attr( $list->ID ); ?>" data-status_key="bulk-action" data-action="tutor_instructor_bulk_action">
224 <?php foreach ( $available_status as $key => $status_name ) : ?>
225 <option data-status_class="<?php echo esc_attr( $available_status[ $key ][1] ); ?>" value="<?php echo esc_attr( $key ); ?>" data-status="<?php echo esc_attr( $key ); ?>" <?php selected( $list->status, $key ); ?>>
226 <?php echo esc_html( $available_status[ $key ][0] ); ?>
227 </option>
228 <?php endforeach; ?>
229 </select>
230 <i class="icon1 tutor-icon-eye-bold"></i>
231 <i class="icon2 tutor-icon-angle-down"></i>
232 </div>
233 </td>
234 <td data-th="<?php esc_html_e( 'Status', 'tutor' ); ?>">
235 <?php
236 ob_start();
237 $profile_url = add_query_arg( 'user_id', $list->ID, self_admin_url( 'user-edit.php' ) );
238 ?>
239 <a href="<?php echo esc_url( $profile_url ); ?>"
240 class="tutor-btn tutor-btn-outline-primary tutor-btn-sm">
241 <?php esc_html_e( 'Edit', 'tutor' ); ?>
242 </a>
243 <?php
244 $edit_button = apply_filters( 'tutor_instructor_list_edit_button', ob_get_clean(), $user_data );
245 //phpcs:ignore -- already escaped.
246 echo $edit_button;
247 ?>
248 </td>
249 </tr>
250 <?php endforeach; ?>
251 </tbody>
252 </table>
253 </div>
254 <?php else : ?>
255 <?php tutils()->render_list_empty_state(); ?>
256 <?php endif; ?>
257
258 <div class="tutor-admin-page-pagination-wrapper tutor-mt-32">
259 <?php
260 /**
261 * Prepare pagination data & load template
262 */
263 if ( $total > $per_page_data ) {
264 $pagination_data = array(
265 'total_items' => $total,
266 'per_page' => $per_page_data,
267 'paged' => $selected_page,
268 );
269 $pagination_template = tutor()->path . 'views/elements/pagination.php';
270 tutor_load_template_from_custom_path( $pagination_template, $pagination_data );
271 }
272 ?>
273 </div>
274 </div>
275 </div>
276
277 <div id="tutor-instructor-add-new" class="tutor-modal tutor-modal-scrollable">
278 <div class="tutor-modal-overlay"></div>
279 <div class="tutor-modal-window">
280 <form id="tutor-new-instructor-form" class="tutor-modal-content" autocomplete="off" method="post">
281 <div class="tutor-modal-header">
282 <div class="tutor-modal-title">
283 <?php esc_html_e( 'Add New Instructor', 'tutor' ); ?>
284 </div>
285 <button class="tutor-iconic-btn tutor-modal-close" data-tutor-modal-close>
286 <span class="tutor-icon-times" area-hidden="true"></span>
287 </button>
288 </div>
289
290 <div class="tutor-modal-body">
291 <?php tutor_nonce_field(); ?>
292 <?php do_action( 'tutor_add_new_instructor_form_fields_before' ); ?>
293 <div class="tutor-rows">
294 <div class="tutor-col">
295 <label class="tutor-form-label">
296 <?php esc_html_e( 'First Name', 'tutor' ); ?>
297 </label>
298 <div class="tutor-mb-16">
299 <input type="text" name="first_name" class="tutor-form-control tutor-mb-12" placeholder="<?php esc_attr_e( 'Enter First Name', 'tutor' ); ?>" title="<?php esc_attr_e( 'Only alphanumeric & space are allowed', 'tutor' ); ?>" required/>
300 </div>
301 </div>
302 <div class="tutor-col">
303 <label class="tutor-form-label">
304 <?php esc_html_e( 'Last Name', 'tutor' ); ?>
305 </label>
306 <div class="tutor-mb-16">
307 <input type="text" name="last_name" class="tutor-form-control tutor-mb-12" placeholder="<?php esc_attr_e( 'Enter Last Name', 'tutor' ); ?>" title="<?php esc_attr_e( 'Only alphanumeric & space are allowed', 'tutor' ); ?>" required/>
308 </div>
309 </div>
310 </div>
311 <div class="tutor-row">
312 <div class="tutor-col">
313 <label class="tutor-form-label">
314 <?php esc_html_e( 'Username', 'tutor' ); ?>
315 </label>
316 <div class="tutor-mb-16">
317 <input type="text" name="user_login" class="tutor-form-control tutor-mb-12" autocomplete="off" placeholder="<?php esc_attr_e( 'Enter Username', 'tutor' ); ?>" pattern="^[a-zA-Z0-9_]*$" title="<?php esc_attr_e( 'Only alphanumeric and underscore are allowed', 'tutor' ); ?>" required/>
318 </div>
319 </div>
320 <div class="tutor-col">
321 <label class="tutor-form-label">
322 <?php esc_html_e( 'Phone Number', 'tutor' ); ?>
323 <span class="tutor-fs-7 tutor-fw-medium tutor-color-muted">
324 <?php esc_html_e( '(Optional)', 'tutor' ); ?>
325 </span>
326 </label>
327 <div class="tutor-mb-16">
328 <input type="text" name="phone_number" class="tutor-form-control tutor-mb-12" placeholder="<?php esc_attr_e( 'Enter Phone Number', 'tutor' ); ?>" minlength="8" maxlength="16" pattern="[0-9]+" title="<?php esc_attr_e( 'Only number is allowed', 'tutor' ); ?>"/>
329 </div>
330 </div>
331 </div>
332
333 <div class="tutor-row">
334 <div class="tutor-col">
335 <label class="tutor-form-label">
336 <?php esc_html_e( 'Email Address', 'tutor' ); ?>
337 </label>
338 <div class="tutor-mb-16">
339 <input type="email" name="email" class="tutor-form-control tutor-mb-12" autocomplete="off" placeholder="<?php esc_attr_e( 'Enter Your Email', 'tutor' ); ?>" required/>
340 </div>
341 </div>
342 </div>
343
344 <div class="tutor-row">
345 <div class="tutor-col">
346 <label class="tutor-form-label">
347 <?php esc_html_e( 'Password', 'tutor' ); ?>
348 </label>
349 <div class="tutor-form-wrap tutor-mb-16">
350 <span class="tutor-icon-eye-line tutor-form-icon tutor-form-icon-reverse tutor-password-reveal"></span>
351 <input type="password" name="password" id="tutor-instructor-pass" class="tutor-form-control" minlength="8" placeholder="*******" autocomplete="new-password" required/>
352 </div>
353 </div>
354 <div class="tutor-col">
355 <label class="tutor-form-label">
356 <?php esc_html_e( 'Retype Password', 'tutor' ); ?>
357 </label>
358 <div class="tutor-form-wrap tutor-mb-16">
359 <span class="tutor-icon-eye-line tutor-form-icon tutor-form-icon-reverse tutor-password-reveal"></span>
360 <input type="password" name="password_confirmation" class="tutor-form-control" placeholder="*******" autocomplete="off" pattern="" title="<?php esc_attr_e( 'Your passwords should match each other. Please recheck.', 'tutor' ); ?>" onfocus="this.setAttribute('pattern', document.getElementById('tutor-instructor-pass').value)" required/>
361 </div>
362 </div>
363 </div>
364
365 <?php do_action( 'tutor_add_new_instructor_form_fields_after' ); ?>
366
367 <div class="tutor-row">
368 <div class="tutor-col">
369 <label class="tutor-form-label">
370 <?php esc_html_e( 'Bio', 'tutor' ); ?>
371 <span class="tutor-fs-7 tutor-fw-medium tutor-color-muted">
372 <?php esc_html_e( '(Optional)', 'tutor' ); ?>
373 </span>
374 </label>
375 <div class="tutor-mb-16">
376 <?php wp_editor( '', 'tutor_profile_bio', tutor_utils()->get_profile_bio_editor_config( 'tutor_profile_bio' ) ); ?>
377 </div>
378 </div>
379 </div>
380 <div class="tutor-row" id="tutor-new-instructor-form-response"></div>
381 </div>
382
383 <div class="tutor-modal-footer">
384 <button class="tutor-btn tutor-btn-outline-primary" data-tutor-modal-close>
385 <?php esc_html_e( 'Cancel', 'tutor' ); ?>
386 </button>
387
388 <button type="submit" class="tutor-btn tutor-btn-primary" name="tutor_register_instructor_btn" data-tutor-modal-submit>
389 <?php esc_html_e( 'Add Instructor', 'tutor' ); ?>
390 </button>
391 </div>
392 </form>
393 </div>
394 </div>
395 <?php
396 /**
397 * Instructor Approve, Reject popup
398 * that will be shown based on get params
399 *
400 * @since v2.0.0
401 */
402 $instructor_id = Input::get( 'instructor', '' );
403 $prompt_action = Input::get( 'action', '' );
404 $instructor_data = get_userdata( $instructor_id );
405
406 if ( $instructor_data && ( 'approved' === $prompt_action || 'blocked' === $prompt_action ) ) :
407 ?>
408 <?php $instructor_status = tutor_utils()->instructor_status( $instructor_data->ID, false ); ?>
409 <div id="tutor-ins-approval-1" class="tutor-modal tutor-modal-ins-approval tutor-is-active">
410 <div class="tutor-modal-overlay"></div>
411 <div class="tutor-modal-window tutor-modal-window-sm">
412 <div class="tutor-modal-content tutor-modal-content-white">
413 <button class="tutor-iconic-btn tutor-modal-close-o" data-tutor-modal-close>
414 <span class="tutor-icon-times" area-hidden="true"></span>
415 </button>
416 <div class="tutor-modal-body tutor-text-center">
417 <div class="tutor-py-lg-64">
418 <?php if ( $instructor_data ) : ?>
419 <div class="tutor-fs-4 tutor-fw-medium tutor-color-black tutor-mb-8">
420 <?php esc_html_e( 'A New Instructor Just Signed Up', 'tutor' ); ?>
421 </div>
422 <div class="tutor-fs-6 tutor-color-muted">
423 <?php esc_html_e( 'You can either accept or reject the application. The applicant will be notified via email either way.', 'tutor' ); ?>
424 </div>
425
426 <div class="tutor-modal-ins-meta tutor-mt-44">
427 <div class="tutor-d-inline-block tutor-avatar tutor-mb-20">
428 <?php echo get_avatar( $instructor_data->ID ); ?>
429 </div>
430
431 <div class="tutor-fs-4 tutor-fw-medium tutor-color-black tutor-mb-12">
432 <?php
433 echo esc_html(
434 ( '' !== $instructor_data->display_name ?
435 $instructor_data->display_name : ( '' !== $instructor_data->user_nicename ?
436 $instructor_data->user_nicename : '' ) )
437 );
438 ?>
439 </div>
440
441 <div class="tutor-fs-6 tutor-color-secondary tutor-mb-8">
442 <?php esc_html_e( 'Username:', 'tutor' ); ?>
443 <span class="tutor-color-black">
444 <?php echo esc_html( $instructor_data->user_login ); ?>
445 </span>
446 </div>
447
448 <div class="tutor-fs-6 tutor-color-secondary">
449 <?php esc_html_e( 'Email:', 'tutor' ); ?>
450 <span class="tutor-color-black">
451 <?php echo esc_html( $instructor_data->user_email ); ?>
452 </span>
453 </div>
454 </div>
455
456 <div class="tutor-mt-48 tutor-mb-24">
457 <?php if ( 'approved' === $prompt_action || 'blocked' === $prompt_action ) : ?>
458 <?php if ( 'pending' === $instructor_status ) : ?>
459 <a class="instructor-action tutor-btn tutor-btn-primary tutor-btn-block" data-action="approve" data-instructor-id="<?php echo esc_attr( $instructor_data->ID ); ?>">
460 <?php esc_html_e( 'Approve the Instructor', 'tutor' ); ?>
461 </a>
462 <a class="instructor-action tutor-btn tutor-btn-ghost tutor-mt-16" data-action="blocked" data-instructor-id="<?php echo esc_attr( $instructor_data->ID ); ?>">
463 <?php esc_html_e( 'Reject the Application', 'tutor' ); ?>
464 </a>
465 <?php elseif ( 'approved' === $instructor_status ) : ?>
466 <a class="instructor-action tutor-btn tutor-btn-primary tutor-btn-block" data-action="blocked" data-instructor-id="<?php echo esc_attr( $instructor_data->ID ); ?>">
467 <?php esc_html_e( 'Reject the Application', 'tutor' ); ?>
468 </a>
469 <?php elseif ( 'blocked' === $instructor_status ) : ?>
470 <a class="instructor-action tutor-btn tutor-btn-primary tutor-btn-block" data-action="approve" data-instructor-id="<?php echo esc_attr( $instructor_data->ID ); ?>">
471 <?php esc_html_e( 'Approve the Instructor', 'tutor' ); ?>
472 </a>
473 <?php endif; ?>
474 <?php else : ?>
475 <div class="tutor-alert tutor-danger tutor-justify-center">
476 <div class="tutor-alert-text">
477 <span class="tutor-alert-icon tutor-fs-4 tutor-icon-circle-times-line tutor-mr-12"></span>
478 <span>
479 <?php esc_html_e( 'Attempted invalid action', 'tutor' ); ?>
480 </span>
481 </div>
482 </div>
483 <?php endif; ?>
484 </div>
485 <?php else : ?>
486 <div class="tutor-alert tutor-danger tutor-justify-center">
487 <div class="tutor-alert-text">
488 <span class="tutor-alert-icon tutor-fs-4 tutor-icon-circle-times-line tutor-mr-12"></span>
489 <span>
490 <?php esc_html_e( 'Invalid instructor', 'tutor' ); ?>
491 </span>
492 </div>
493 </div>
494 <?php endif; ?>
495 </div>
496 </div>
497 </div>
498 </div>
499 </div>
500 <?php endif; ?>
501
502 <style>
503 .table-instructors .woocommerce-Price-amount{
504 font-size: 0.875rem;
505 }
506 </style>
507