PluginProbe ʕ •ᴥ•ʔ
Tutor LMS – eLearning and online course solution / 3.8.3
Tutor LMS – eLearning and online course solution v3.8.3
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 1.1.0 1.1.1 1.2.0 1.2.1 1.2.11 1.2.12 1.2.13 1.2.20 1.3.0 1.3.1 1.3.2 1.3.3 1.3.4 1.3.5 1.3.6 1.3.7 1.3.8 1.3.9 1.4.0 1.4.1 1.4.2 1.4.3 1.4.4 1.4.5 1.4.6 1.4.7 1.4.8 1.4.9 1.5.0 1.5.1 1.5.2 1.5.3 1.5.4 1.5.5 1.5.6 1.5.7 1.5.8 1.5.9 1.6.0 1.6.1 1.6.2 1.6.3 1.6.4 1.6.5 1.6.6 1.6.7 1.6.8 1.6.9 1.7.0 1.7.1 1.7.2 1.7.3 1.7.4 1.7.5 1.7.6 1.7.7 1.7.8 1.7.9 1.8.0 1.8.1 1.8.10 1.8.2 1.8.3 1.8.4 1.8.5 1.8.6 1.8.7 1.8.8 1.8.9 1.9.0 1.9.1 1.9.10 1.9.11 1.9.12 1.9.13 1.9.14 1.9.15 1.9.16 1.9.2 1.9.3 1.9.4 1.9.5 1.9.6 1.9.7 1.9.8 1.9.9 2.0.0 2.0.1 2.0.10 2.0.2 2.0.3 2.0.4 2.0.5 2.0.6 2.0.7 2.0.8 2.0.9 2.1.0 2.1.1 2.1.10 2.1.2 2.1.3 2.1.4 2.1.5 2.1.6 2.1.7 2.1.8 2.1.9 2.2.0 2.2.1 2.2.2 2.2.3 2.2.4 2.3.0 2.4.0 2.5.0 2.6.0 2.6.1 2.6.2 2.7.0 2.7.1 2.7.2 2.7.3 2.7.4 2.7.5 2.7.6 2.7.7 3.0.0 3.0.1 3.0.2 3.1.0 3.2.0 3.2.1 3.2.2 3.2.3 3.3.0 3.3.1 3.4.0 3.4.1 3.4.2 3.5.0 3.6.0 3.6.1 3.6.2 3.6.3 3.6.4 3.7.0 3.7.1 3.7.2 3.7.3 3.7.4 3.8.0 3.8.1 3.8.2 3.8.3 3.9.0 3.9.1 3.9.10 3.9.2 3.9.3 3.9.4 3.9.5 3.9.6 3.9.7 3.9.8 3.9.9
tutor / classes / Assets.php
tutor / classes Last commit date
Addons.php 11 months ago Admin.php 9 months ago Ajax.php 9 months ago Announcements.php 1 year ago Assets.php 10 months ago Backend_Page_Trait.php 1 year ago BaseController.php 1 year ago Config.php 11 months ago Container.php 11 months ago Course.php 9 months ago Course_Embed.php 3 years ago Course_Filter.php 1 year ago Course_List.php 10 months ago Course_Settings_Tabs.php 1 year ago Course_Widget.php 1 year ago Custom_Validation.php 3 years ago Dashboard.php 1 year ago Earnings.php 9 months ago FormHandler.php 2 years ago Frontend.php 1 year ago Gutenberg.php 1 year ago Icon.php 9 months ago Input.php 1 year ago Instructor.php 1 year ago Instructors_List.php 11 months ago Lesson.php 10 months ago Options_V2.php 9 months ago Permalink.php 2 years ago Post_types.php 1 year ago Private_Course_Access.php 1 year ago Q_And_A.php 10 months ago Question_Answers_List.php 11 months ago Quiz.php 9 months ago QuizBuilder.php 11 months ago Quiz_Attempts_List.php 9 months ago RestAPI.php 2 years ago Reviews.php 9 months ago Rewrite_Rules.php 2 years ago Shortcode.php 9 months ago Singleton.php 1 year ago Student.php 1 year ago Students_List.php 1 year ago Taxonomies.php 1 year ago Template.php 9 months ago Theme_Compatibility.php 3 years ago Tools.php 1 year ago Tools_V2.php 1 year ago Tutor.php 9 months ago TutorEDD.php 1 year ago Tutor_Base.php 2 years ago Tutor_Setup.php 1 year ago Upgrader.php 9 months ago User.php 1 year ago Utils.php 9 months ago Video_Stream.php 3 years ago WhatsNew.php 9 months ago Withdraw.php 1 year ago Withdraw_Requests_List.php 11 months ago WooCommerce.php 9 months ago
Assets.php
743 lines
1 <?php
2 /**
3 * Manage Assets
4 *
5 * @package Tutor
6 * @author Themeum <support@themeum.com>
7 * @link https://themeum.com
8 * @since 1.0.0
9 */
10
11 namespace TUTOR;
12
13 use Tutor\Ecommerce\CouponController;
14 use Tutor\Ecommerce\OptionKeys;
15 use Tutor\Ecommerce\OrderController;
16 use Tutor\Ecommerce\Settings;
17 use Tutor\Models\CourseModel;
18
19 if ( ! defined( 'ABSPATH' ) ) {
20 exit;
21 }
22
23 /**
24 * Assets class
25 *
26 * @since 1.0.0
27 */
28 class Assets {
29
30
31 /**
32 * Constructor
33 *
34 * @since 1.0.0
35 *
36 * @since 3.0.0 register hook param added
37 *
38 * @param bool $register_hooks param added to enable or disable registering hooks.
39 *
40 * @return void
41 */
42 public function __construct( $register_hooks = true ) {
43 if ( ! $register_hooks ) {
44 return;
45 }
46
47 /**
48 * Common scripts loading
49 */
50 add_action( 'admin_enqueue_scripts', array( $this, 'common_scripts' ) );
51 add_action( 'wp_enqueue_scripts', array( $this, 'common_scripts' ) );
52 /**
53 * Front and backend script enqueue
54 */
55 add_action( 'admin_enqueue_scripts', array( $this, 'admin_scripts' ) );
56 add_action( 'wp_enqueue_scripts', array( $this, 'frontend_scripts' ) );
57
58 add_action( 'admin_enqueue_scripts', array( $this, 'load_meta_data' ) );
59 add_action( 'wp_enqueue_scripts', array( $this, 'load_meta_data' ) );
60
61 /**
62 * Text domain loading
63 */
64 add_action( 'admin_enqueue_scripts', array( $this, 'tutor_script_text_domain' ), 100 );
65 add_action( 'wp_enqueue_scripts', array( $this, 'tutor_script_text_domain' ), 100 );
66 add_filter( 'tutor_localize_data', array( $this, 'modify_localize_data' ) );
67
68 /**
69 * Register translatable function to load
70 * Handled script with text domain attached to
71 *
72 * @since 1.9.0
73 */
74 add_action( 'admin_head', array( $this, 'tutor_add_mce_button' ) );
75 add_filter( 'get_the_generator_html', array( $this, 'tutor_generator_tag' ), 10, 2 );
76 add_filter( 'get_the_generator_xhtml', array( $this, 'tutor_generator_tag' ), 10, 2 );
77
78 /**
79 * Add translation support for external tinyMCE button
80 *
81 * @since 1.9.7
82 */
83 add_filter( 'mce_external_languages', array( $this, 'tutor_tinymce_translate' ) );
84
85 /**
86 * Identifier class to body tag
87 *
88 * @since v1.9.9
89 */
90 add_filter( 'body_class', array( $this, 'add_identifier_class_to_body' ) );
91 add_filter( 'admin_body_class', array( $this, 'add_identifier_class_to_body' ) );
92
93 /**
94 * Add edit with front end builder button on Gutenberg editor
95 *
96 * @since v2.0.5
97 */
98 add_action( 'enqueue_block_editor_assets', __CLASS__ . '::add_frontend_editor_button' );
99 }
100
101 /**
102 * Load default localized data
103 *
104 * @since 1.0.0
105 * @return array
106 */
107 public function get_default_localized_data() {
108 $home_url = get_home_url();
109 $parsed = parse_url( $home_url );
110
111 $base_path = ( is_array( $parsed ) && isset( $parsed['path'] ) ) ? $parsed['path'] : '/';
112 $base_path = rtrim( $base_path, '/' ) . '/';
113
114 $post_id = get_the_ID();
115 $post_type = get_post_type( $post_id );
116
117 $current_page = tutor_utils()->get_current_page_slug();
118
119 /**
120 * Only required current user data.
121 *
122 * @since 2.6.2
123 */
124 $current_user = array();
125 $userdata = get_userdata( get_current_user_id() );
126
127 if ( $userdata ) {
128 $current_user = array(
129 'roles' => array_values( $userdata->roles ),
130 'data' => array(
131 'id' => $userdata->ID,
132 'display_name' => $userdata->display_name,
133 ),
134 );
135 }
136
137 $tutor_currency = array(
138 'symbol' => Settings::get_currency_symbol_by_code( tutor_utils()->get_option( OptionKeys::CURRENCY_CODE, 'USD' ) ),
139 'currency' => tutor_utils()->get_option( OptionKeys::CURRENCY_CODE ),
140 'position' => tutor_utils()->get_option( OptionKeys::CURRENCY_POSITION, 'left' ),
141 'thousand_separator' => tutor_utils()->get_option( OptionKeys::THOUSAND_SEPARATOR, ',' ),
142 'decimal_separator' => tutor_utils()->get_option( OptionKeys::DECIMAL_SEPARATOR, '.' ),
143 'no_of_decimal' => tutor_utils()->get_option( OptionKeys::NUMBER_OF_DECIMALS, '2' ),
144 );
145
146 /**
147 * Get only required options.
148 *
149 * @since 3.0.0
150 */
151 $required_options = array(
152 'monetize_by',
153 );
154
155 $tutor_settings = Options_V2::get_only( $required_options );
156
157 return array(
158 'ajaxurl' => admin_url( 'admin-ajax.php' ),
159 'home_url' => rtrim( get_home_url(), '/' ),
160 'site_url' => rtrim( get_site_url(), '/' ),
161 'site_title' => get_bloginfo( 'title' ),
162 'base_path' => tutor()->basepath,
163 'tutor_url' => tutor()->url,
164 'tutor_pro_url' => function_exists( 'tutor_pro' ) ? tutor_pro()->url : null,
165 'nonce_key' => tutor()->nonce,
166 tutor()->nonce => wp_create_nonce( tutor()->nonce_action ),
167 'loading_icon_url' => get_admin_url() . 'images/wpspin_light.gif',
168 'placeholder_img_src' => tutor_placeholder_img_src(),
169 'enable_lesson_classic_editor' => get_tutor_option( 'enable_lesson_classic_editor' ),
170 'tutor_frontend_dashboard_url' => tutor_utils()->get_tutor_dashboard_page_permalink(),
171 'wp_date_format' => tutor_js_date_format_against_wp(),
172 'start_of_week' => get_option( 'start_of_week', 1 ),
173 'is_admin' => is_admin(),
174 'is_admin_bar_showing' => is_admin_bar_showing(),
175 'addons_data' => tutor_utils()->prepare_free_addons_data(),
176 'current_user' => $current_user,
177 'content_change_event' => 'tutor_content_changed_event',
178 'is_tutor_course_edit' => isset( $_GET['action'] ) && 'edit' === $_GET['action'] && tutor()->course_post_type === get_post_type( get_the_ID() ) ? true : false,
179 'assignment_max_file_allowed' => 'tutor_assignments' === $post_type ? (int) tutor_utils()->get_assignment_option( $post_id, 'upload_files_limit' ) : 0,
180 'current_page' => $current_page,
181 'quiz_answer_display_time' => 1000 * (int) tutor_utils()->get_option( 'quiz_answer_display_time' ),
182 'is_ssl' => is_ssl(),
183 'course_list_page_url' => admin_url( 'admin.php?page=tutor' ),
184 'course_post_type' => tutor()->course_post_type,
185 'tutor_currency' => $tutor_currency,
186 'local' => get_locale(),
187 'settings' => $tutor_settings,
188 'max_upload_size' => size_format( wp_max_upload_size() ),
189 );
190 }
191
192 /**
193 * Enqueue scripts for admin
194 *
195 * @since 1.0.0
196 * @since 3.0.0 Order details & coupon scripts added.
197 *
198 * @return void
199 */
200 public function admin_scripts() {
201 wp_enqueue_style( 'tutor-select2', tutor()->url . 'assets/lib/select2/select2.min.css', array(), TUTOR_VERSION );
202 wp_enqueue_style( 'tutor-admin', tutor()->url . 'assets/css/tutor-admin.min.css', array(), TUTOR_VERSION );
203 /**
204 * Scripts
205 */
206 wp_enqueue_media();
207
208 wp_enqueue_script( 'wp-color-picker' );
209 wp_enqueue_style( 'wp-color-picker' );
210
211 wp_enqueue_script( 'jquery-ui-slider' );
212 wp_enqueue_script( 'jquery-ui-datepicker' );
213
214 wp_enqueue_script( 'tutor-select2', tutor()->url . 'assets/lib/select2/select2.full.min.js', array( 'jquery' ), TUTOR_VERSION, true );
215 wp_enqueue_script( 'tutor-admin', tutor()->url . 'assets/js/tutor-admin.js', array( 'jquery', 'tutor-script', 'wp-color-picker', 'wp-i18n', 'wp-data' ), TUTOR_VERSION, true );
216
217 // Tutor order detail & coupon scripts.
218 $page = Input::get( 'page', '' );
219 $action = Input::get( 'action' );
220 $sub_page = Input::get( 'sub_page' );
221
222 $allowed_actions = array( 'add_new', 'edit' );
223
224 if ( tutor_utils()->is_monetize_by_tutor() ) {
225 if ( OrderController::PAGE_SLUG === $page && 'edit' === $action ) {
226 wp_enqueue_script( 'tutor-order-details', tutor()->url . 'assets/js/tutor-order-details.js', array( 'wp-i18n', 'wp-element' ), TUTOR_VERSION, true );
227 }
228
229 if ( CouponController::PAGE_SLUG === $page && in_array( $action, $allowed_actions, true ) ) {
230 wp_enqueue_script( 'tutor-coupon', tutor()->url . 'assets/js/tutor-coupon.js', array( 'wp-date', 'wp-i18n', 'wp-element' ), TUTOR_VERSION, true );
231 }
232
233 // @since 3.0.0 add tax react app on the settings page.
234 if ( 'tutor_settings' === $page && ! Input::has( 'edit' ) ) {
235 wp_enqueue_editor();
236 wp_enqueue_script( 'tutor-tax-settings', tutor()->url . 'assets/js/tutor-tax-settings.js', array( 'wp-i18n', 'wp-element' ), TUTOR_VERSION, true );
237 wp_enqueue_script( 'tutor-payment-settings', tutor()->url . 'assets/js/tutor-payment-settings.js', array( 'wp-i18n', 'wp-element' ), TUTOR_VERSION, true );
238 }
239 }
240
241 if ( 'tutor-tools' === $page && 'import_export' === $sub_page ) {
242 wp_enqueue_script( 'tutor-import-export', tutor()->url . 'assets/js/tutor-import-export.js', array( 'wp-i18n', 'wp-element' ), TUTOR_VERSION, true );
243 }
244
245 if ( 'tutor-addons' === $page ) {
246 wp_enqueue_script( 'tutor-coupon', tutor()->url . 'assets/js/tutor-addon-list.js', array( 'wp-i18n', 'wp-element' ), TUTOR_VERSION, true );
247 }
248
249 if ( 'tutor-themes' === $page ) {
250 wp_enqueue_style( 'tutor-template-import', tutor()->url . 'assets/css/tutor-template-import.min.css', array(), TUTOR_VERSION, 'all' );
251 wp_enqueue_script( 'tutor-template-import-js', tutor()->url . 'assets/js/tutor-template-import-script.js', array( 'wp-i18n' ), TUTOR_VERSION, true );
252 }
253 }
254
255 /**
256 * Load frontend scripts
257 *
258 * @since 1.0.0
259 * @return void
260 */
261 public function frontend_scripts() {
262 global $post, $wp_query;
263
264 /**
265 * We checked wp_enqueue_editor() in condition because it conflicting with Divi Builder
266 * condition updated @since v.1.7.4
267 *
268 * @since 2.7.0 is_user_logged_in() check added to remove duplicate H1 tag on each single post.
269 */
270 if ( is_single() && is_user_logged_in() ) {
271 if ( function_exists( 'et_pb_is_pagebuilder_used' ) ) {
272 $is_page_builder_used = et_pb_is_pagebuilder_used( get_the_ID() );
273 if ( ! $is_page_builder_used ) {
274 wp_enqueue_editor();
275 }
276 } else {
277 wp_enqueue_editor();
278 }
279 }
280
281 /**
282 * Initializing quicktags script to use in wp_editor();
283 */
284 wp_enqueue_script( 'quicktags' );
285
286 $tutor_dashboard_page_id = (int) tutor_utils()->get_option( 'tutor_dashboard_page_id' );
287 if ( get_the_ID() === $tutor_dashboard_page_id ) {
288 wp_enqueue_media();
289 }
290
291 /**
292 * Enabling Sorting, draggable, droppable...
293 */
294 wp_enqueue_script( 'jquery-ui-sortable' );
295 wp_enqueue_script('jquery-touch-punch', ['jquery-ui-sortable']); //phpcs:ignore
296
297 // Plyr.
298 if ( is_single_course( true ) ) {
299 wp_enqueue_style( 'tutor-plyr', tutor()->url . 'assets/lib/plyr/plyr.css', array(), TUTOR_VERSION );
300 wp_enqueue_script( 'tutor-plyr', tutor()->url . 'assets/lib/plyr/plyr.polyfilled.min.js', array( 'jquery' ), TUTOR_VERSION, true );
301 }
302
303 // Social Share.
304 wp_enqueue_script( 'tutor-social-share', tutor()->url . 'assets/lib/SocialShare/SocialShare.min.js', array( 'jquery' ), TUTOR_VERSION, true );
305
306 /**
307 * Chart Data
308 */
309 if ( ! empty( $wp_query->query_vars['tutor_dashboard_page'] ) ) {
310 wp_enqueue_script( 'jquery-ui-slider' );
311
312 wp_enqueue_style( 'tutor-select2', tutor()->url . 'assets/lib/select2/select2.min.css', array(), TUTOR_VERSION );
313 wp_enqueue_script( 'tutor-select2', tutor()->url . 'assets/lib/select2/select2.full.min.js', array( 'jquery' ), TUTOR_VERSION, true );
314
315 if ( 'earning' === $wp_query->query_vars['tutor_dashboard_page'] ) {
316 wp_enqueue_script( 'tutor-front-chart-js', tutor()->url . 'assets/lib/Chart.bundle.min.js', array(), TUTOR_VERSION );
317 wp_enqueue_script( 'jquery-ui-datepicker' );
318 }
319 }
320 /**
321 * Dependency wp-i18n added for translate js file
322 *
323 * @since 1.9.0
324 */
325 wp_enqueue_style( 'tutor-frontend', tutor()->url . 'assets/css/tutor-front.min.css', array(), TUTOR_VERSION );
326 wp_enqueue_script( 'tutor-frontend', tutor()->url . 'assets/js/tutor-front.js', array( 'jquery', 'wp-i18n', 'wp-date' ), TUTOR_VERSION, true );
327
328 /**
329 * Load frontend dashboard style
330 *
331 * @since v1.9.8
332 */
333 $should_load_dashboard_styles = apply_filters( 'tutor_should_load_dashboard_styles', tutor_utils()->is_tutor_frontend_dashboard() );
334 if ( $should_load_dashboard_styles ) {
335 wp_enqueue_style( 'tutor-frontend-dashboard-css', tutor()->url . 'assets/css/tutor-frontend-dashboard.min.css', array(), TUTOR_VERSION );
336 }
337
338 // Load date picker for announcement at frontend.
339 wp_enqueue_script( 'jquery-ui-datepicker' );
340 $css = '.mce-notification.mce-notification-error{display: none !important;}';
341 wp_add_inline_style( 'tutor-frontend', $css );
342 }
343
344 /**
345 * Modify localize data
346 *
347 * @since 1.0.0
348 *
349 * @param array $localize_data localize data.
350 * @return array
351 */
352 public function modify_localize_data( $localize_data ) {
353 global $post;
354
355 if ( is_admin() ) {
356 $taxonomy = Input::get( 'taxonomy' );
357 if ( CourseModel::COURSE_CATEGORY === $taxonomy || CourseModel::COURSE_TAG === $taxonomy ) {
358 $localize_data['open_tutor_admin_menu'] = true;
359 }
360
361 if ( 'en_US' !== $localize_data['local'] ) {
362 $page = Input::get( 'page', '' );
363 $action = Input::get( 'action' );
364 $allowed_actions = array( 'add_new', 'edit' );
365 if ( CouponController::PAGE_SLUG === $page && in_array( $action, $allowed_actions, true ) ) {
366 $localize_data['coupon_main_content_locales'] = tutils()->get_script_locale_data( 'tutor-coupon-main-content', $localize_data['local'] );
367 }
368 }
369 } else {
370
371 // Assign quiz option.
372 if ( ! empty( $post->post_type ) && 'tutor_quiz' === $post->post_type ) {
373 $single_quiz_options = (array) tutor_utils()->get_quiz_option( $post->ID );
374 $saved_quiz_options = array(
375 'quiz_when_time_expires' => tutor_utils()->get_option( 'quiz_when_time_expires' ),
376 );
377
378 $quiz_options = array_merge( $single_quiz_options, $saved_quiz_options );
379
380 $previous_attempts = tutor_utils()->quiz_attempts();
381
382 if ( $previous_attempts && count( $previous_attempts ) ) {
383 $quiz_options['quiz_auto_start'] = 0;
384 }
385
386 $localize_data['quiz_options'] = $quiz_options;
387 }
388
389 // Including player assets if video exists.
390 if ( tutor_utils()->has_video_in_single() ) {
391 $localize_data['post_id'] = get_the_ID();
392 $localize_data['best_watch_time'] = 0;
393
394 $best_watch_time = tutor_utils()->get_lesson_reading_info( get_the_ID(), 0, 'video_best_watched_time' );
395 if ( $best_watch_time > 0 ) {
396 $localize_data['best_watch_time'] = $best_watch_time;
397 }
398 }
399 }
400
401 return $localize_data;
402 }
403
404 /**
405 * Load common scripts for frontend and backend
406 *
407 * @since 1.0.0
408 * @return void
409 */
410 public function common_scripts() {
411
412 /**
413 * Load TinyMCE for tutor settings page if tutor pro is not available.
414 *
415 * @since v2.0.8
416 */
417 $baseurl = includes_url( 'js/tinymce' );
418 $current_page = Input::get( 'page' );
419
420 // If it is settings page & tutor pro not activated.
421 if ( 'tutor_settings' === $current_page && ! wp_script_is( 'wp-tinymce-root' ) ) {
422 wp_enqueue_script( 'tutor-tiny', $baseurl . '/tinymce.min.js', array( 'jquery' ), TUTOR_VERSION, true );
423 }
424 wp_enqueue_style( 'tutor-icon', tutor()->url . 'assets/css/tutor-icon.min.css', array(), TUTOR_VERSION );
425
426 // Common css library.
427 if ( is_rtl() ) {
428 wp_enqueue_style( 'tutor', tutor()->url . 'assets/css/tutor-rtl.min.css', array(), TUTOR_VERSION );
429 } else {
430 wp_enqueue_style( 'tutor', tutor()->url . 'assets/css/tutor.min.css', array(), TUTOR_VERSION );
431 }
432
433 /**
434 * Load tutor common scripts both backend and frontend
435 *
436 * @since v2.0.0
437 */
438 wp_enqueue_script( 'tutor-script', tutor()->url . 'assets/js/tutor.js', array( 'jquery', 'wp-i18n', 'wp-element' ), TUTOR_VERSION, true );
439
440 /**
441 * Enqueue datetime countdown scripts & styles
442 *
443 * Add filter to enqueue countdown scripts & styles
444 * don't return false if it is true to prevent conflict
445 * with other filters
446 *
447 * @since v2.1.0
448 */
449 $should_enqueue = apply_filters( 'tutor_should_enqueue_countdown_scripts', false );
450 if ( $should_enqueue ) {
451 wp_enqueue_script( 'tutor-moment', tutor()->url . 'assets/lib/countdown/moment.min.js', array(), TUTOR_VERSION, true );
452
453 wp_enqueue_script( 'tutor-moment-timezone', tutor()->url . 'assets/lib/countdown/moment-timezone-with-data.min.js', array(), TUTOR_VERSION, true );
454
455 wp_enqueue_script( 'tutor-jquery-countdown', tutor()->url . 'assets/lib/countdown/jquery.countdown.min.js', array( 'jquery' ), TUTOR_VERSION, true );
456
457 wp_enqueue_script( 'tutor-countdown', tutor()->url . 'assets/lib/countdown/tutor-countdown.min.js', array( 'jquery' ), TUTOR_VERSION, true );
458
459 wp_enqueue_style( 'tutor-countdown', tutor()->url . 'assets/lib/countdown/tutor-countdown.min.css', '', TUTOR_VERSION );
460 }
461 }
462
463 /**
464 * Load meta data
465 *
466 * @since 1.0.0
467 * @return void
468 */
469 public function load_meta_data() {
470 // Localize scripts.
471 $localize_data = apply_filters( 'tutor_localize_data', $this->get_default_localized_data() );
472 wp_localize_script( 'tutor-frontend', '_tutorobject', $localize_data );
473 wp_localize_script( 'tutor-admin', '_tutorobject', $localize_data );
474 wp_localize_script( 'tutor-script', '_tutorobject', $localize_data );
475 wp_localize_script( 'tutor-order-details', '_tutorobject', $localize_data );
476 wp_localize_script( 'tutor-tax-settings', '_tutorobject', $localize_data );
477 wp_localize_script( 'tutor-coupon', '_tutorobject', $localize_data );
478 wp_localize_script( 'tutor-course-builder', '_tutorobject', $localize_data );
479
480 // Inline styles.
481 wp_add_inline_style( 'tutor-frontend', $this->load_color_palette() );
482 wp_add_inline_style( 'tutor-admin', $this->load_color_palette() );
483 }
484
485 /**
486 * Load color palette
487 *
488 * @since 1.0.0
489 * @return string
490 */
491 private function load_color_palette() {
492 $colors = array(
493 'tutor_primary_color' => '--tutor-color-primary',
494 'tutor_primary_hover_color' => '--tutor-color-primary-hover',
495 'tutor_text_color' => '--tutor-body-color',
496 'tutor_border_color' => '--tutor-border-color',
497 'tutor_gray_color' => '--tutor-color-gray',
498 );
499
500 // Admin colors.
501 $admin_colors = array();
502 if ( is_admin() ) {
503 $admin_colors = array(
504 '--tutor-color-primary' => '#3E64DE',
505 '--tutor-color-primary-hover' => '#3A5CCC',
506 '--tutor-body-color' => '#212327',
507 '--tutor-border-color' => '#CDCFD5',
508 '--tutor-color-gray' => '#CDCFD5',
509 );
510 }
511
512 $fallback_colors = array(
513 'tutor_primary_color' => '#3E64DE',
514 'tutor_primary_hover_color' => '#3A5CCC',
515 'tutor_text_color' => '#212327',
516 'tutor_border_color' => '#E3E5EB',
517 'tutor_gray_color' => '#CDCFD5',
518 );
519
520 $color_string = '';
521 foreach ( $colors as $key => $property ) {
522 $fallback_color = isset( $fallback_colors[ $key ] ) ? $fallback_colors[ $key ] : '#212327';
523 $color = tutor_utils()->get_option( $key, $fallback_color );
524 $color_rgb = tutor_utils()->hex2rgb( $color );
525
526 if ( is_admin() && isset( $admin_colors[ $property ] ) ) {
527 $color = $admin_colors[ $property ];
528 $color_rgb = tutor_utils()->hex2rgb( $admin_colors[ $property ] );
529 }
530
531 if ( $color ) {
532 $color_string .= $property . ':' . $color . ';';
533 }
534
535 if ( $color_rgb ) {
536 $color_string .= $property . '-rgb:' . $color_rgb . ';';
537 }
538 }
539
540 return ':root{' . $color_string . '}';
541 }
542
543 /**
544 * Add Tinymce button for placing shortcode
545 *
546 * @since 1.0.0
547 * @return void|null
548 */
549 public function tutor_add_mce_button() {
550 // Check user permissions.
551 if ( ! current_user_can( 'edit_posts' ) && ! current_user_can( 'edit_pages' ) ) {
552 return;
553 }
554 // Check if WYSIWYG is enabled.
555 if ( 'true' == get_user_option( 'rich_editing' ) ) {
556 add_filter( 'mce_external_plugins', array( $this, 'tutor_add_tinymce_js' ) );
557 add_filter( 'mce_buttons', array( $this, 'tutor_register_mce_button' ) );
558 }
559 }
560
561 /**
562 * Add tinymce button
563 *
564 * @since 1.0.0
565 *
566 * @param array $plugin_array plugin array.
567 * @return array
568 */
569 public function tutor_add_tinymce_js( $plugin_array ) {
570 $plugin_array['tutor_button'] = tutor()->url . 'assets/lib/mce-button.js';
571 return $plugin_array;
572 }
573
574 /**
575 * Register new button in the editor
576 *
577 * @since 1.0.0
578 *
579 * @param array $buttons buttons.
580 * @return array
581 */
582 public function tutor_register_mce_button( $buttons ) {
583 array_push( $buttons, 'tutor_button' );
584 return $buttons;
585 }
586
587 /**
588 * Output generator tag to aid debugging.
589 *
590 * @since 1.0.0
591 *
592 * @param string $gen Generator.
593 * @param string $type Type.
594 *
595 * @return string
596 */
597 public function tutor_generator_tag( $gen, $type ) {
598 switch ( $type ) {
599 case 'html':
600 $gen .= "\n" . '<meta name="generator" content="TutorLMS ' . TUTOR_VERSION . '">';
601 break;
602 case 'xhtml':
603 $gen .= "\n" . '<meta name="generator" content="TutorLMS ' . TUTOR_VERSION . '" />';
604 break;
605 }
606 return $gen;
607 }
608
609 /**
610 * Load text domain handled script after all enqueue_scripts
611 * registered functions
612 *
613 * @since 1.9.0
614 * @return void
615 */
616 public function tutor_script_text_domain() {
617 wp_set_script_translations( 'tutor-script', 'tutor', tutor()->path . 'languages/' );
618 wp_set_script_translations( 'tutor-frontend', 'tutor', tutor()->path . 'languages/' );
619 wp_set_script_translations( 'tutor-admin', 'tutor', tutor()->path . 'languages/' );
620 wp_set_script_translations( 'tutor-gutenberg', 'tutor', tutor()->path . 'languages/' );
621 wp_set_script_translations( 'tutor-order-details', 'tutor', tutor()->path . 'languages/' );
622 wp_set_script_translations( 'tutor-coupon', 'tutor', tutor()->path . 'languages/' );
623 wp_set_script_translations( 'tutor-tax-settings', 'tutor', tutor()->path . 'languages/' );
624 wp_set_script_translations( 'tutor-payment-settings', 'tutor', tutor()->path . 'languages/' );
625 wp_set_script_translations( 'tutor-addon-list', 'tutor', tutor()->path . 'languages/' );
626 wp_set_script_translations( 'tutor-import-export', 'tutor', tutor()->path . 'languages/' );
627 wp_set_script_translations( 'tutor-template-import-js', 'tutor', tutor()->path . 'languages/' );
628 }
629
630 /**
631 * Add translation support for external tinyMCE button
632 *
633 * @since 1.9.7
634 * @return array
635 */
636 public function tutor_tinymce_translate() {
637 $locales['tutor_button'] = tutor()->path . 'includes/tinymce_translate.php';
638 return $locales;
639 }
640
641 /**
642 * Add an identifier class to body
643 *
644 * @since 1.0.0
645 *
646 * @param mixed $classes classes.
647 * @return mixed
648 */
649 public function add_identifier_class_to_body( $classes ) {
650 $course_builder_screen = tutor_utils()->get_course_builder_screen();
651 $to_add = array( 'tutor-lms' );
652
653 // Add backend course editor identifier class to body.
654 if ( $course_builder_screen ) {
655 $to_add[] = is_admin() ? 'tutor-backend' : 'tutor-frontend';
656 $to_add[] = ' tutor-screen-course-builder tutor-screen-course-builder-' . $course_builder_screen . ' ';
657 }
658
659 // Add frontend course builder identifier class.
660 if ( ! $course_builder_screen && tutor_utils()->is_tutor_frontend_dashboard() ) {
661 $to_add[] = 'tutor-screen-frontend-dashboard';
662 }
663
664 if ( is_post_type_archive( tutor()->course_post_type ) ) {
665 $to_add[] = 'tutor-frontend';
666 }
667
668 if ( tutor_utils()->is_tutor_frontend_dashboard() ) {
669 $to_add[] = 'tutor-frontend';
670 }
671
672 if ( is_single() ) {
673 global $post;
674
675 $post_types = array(
676 tutor()->course_post_type,
677 tutor()->lesson_post_type,
678 tutor()->quiz_post_type,
679 tutor()->assignment_post_type,
680 tutor()->zoom_post_type,
681 tutor()->meet_post_type,
682 );
683
684 if ( isset( $post->post_type ) && in_array( $post->post_type, $post_types, true ) ) {
685 $to_add[] = 'tutor-frontend';
686 }
687 }
688
689 if ( is_admin() ) {
690 $screen = function_exists( 'get_current_screen' ) ? get_current_screen() : null;
691 $base = ( $screen && is_object( $screen ) && property_exists( $screen, 'base' ) ) ? $screen->base : '';
692 $index = strpos( $base, 'tutor' );
693
694 if ( 0 === $index || $index > 0 ) {
695 $to_add[] = 'tutor-backend';
696
697 $page = Input::get( 'page' );
698 if ( 'tutor_settings' === $page ) {
699 $to_add[] = 'tutor-screen-backend-settings ';
700 }
701 if ( ! empty( $page ) ) {
702 $to_add[] = 'tutor-backend-' . $page;
703 }
704 }
705 }
706
707 // Remove duplicate classes if any.
708 $to_add = array_unique( $to_add );
709
710 if ( is_array( $classes ) ) {
711 $classes = array_merge( $classes, $to_add );
712 } else {
713 $classes .= implode( ' ', $to_add );
714 }
715
716 return $classes;
717 }
718
719 /**
720 * Enqueue script for adding edit with frontend course builder button
721 * on the Gutenberg editor
722 *
723 * @since 2.0.5
724 * @return void
725 */
726 public static function add_frontend_editor_button() {
727 $wp_screen = get_current_screen();
728
729 if ( is_a( $wp_screen, 'WP_Screen' ) && tutor()->course_post_type === $wp_screen->post_type ) {
730 wp_enqueue_script( 'tutor-gutenberg', tutor()->url . 'assets/js/tutor-gutenberg.js', array(), TUTOR_VERSION, true );
731 $data = array(
732 'frontend_dashboard_url' => esc_url( trailingslashit( tutor_utils()->tutor_dashboard_url( 'create-course' ) ) ) . '?course_id=' . get_the_ID(),
733 );
734
735 wp_add_inline_script(
736 'tutor-gutenberg',
737 'const tutorInlineData =' . json_encode( $data ),
738 'before'
739 );
740 }
741 }
742 }
743