PluginProbe
LearnPress – WordPress LMS Plugin for Create and Sell Online Courses / 4.4.6
LearnPress – WordPress LMS Plugin for Create and Sell Online Courses v4.4.6
4.4.8 4.4.7 4.4.6 4.4.5 4.4.4 4.4.3 4.4.2 4.4.1 4.4.0 4.3.9.1 4.3.9 4.3.8 4.3.7 4.1.6.9 4.1.6.9.1 4.1.6.9.2 4.1.6.9.3 4.1.6.9.4 4.1.7 4.1.7.1 4.1.7.2 4.1.7.3 4.1.7.3.1 4.1.7.3.2 4.2.0 All 139 releases
learnpress / inc / admin / class-lp-admin-assets.php

class-lp-admin-assets.php in LearnPress – WordPress LMS Plugin for Create and Sell Online Courses 4.4.6, at inc/admin/class-lp-admin-assets.php

846 lines 30.2 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2
3 use LearnPress\Helpers\Config;
4 use LearnPress\Helpers\Template;
5 use LearnPress\Models\CourseModel;
6 use LearnPress\Statistics\PeriodResolver;
7
8 /**
9 * Class LP_Admin_Assets
10 *
11 * Manage admin assets
12 */
13 class LP_Admin_Assets extends LP_Abstract_Assets {
14 protected static $_instance;
15
16 /**
17 * LP_Admin_Assets constructor.
18 */
19 protected function __construct() {
20 add_action( 'admin_footer', array( $this, 'add_elements_global' ) );
21 add_action( 'admin_print_scripts', array( $this, 'load_scripts_styles_on_head' ), - 1 );
22 parent::__construct();
23 }
24
25 /**
26 * Add javascript to head
27 * Add style to head
28 *
29 * @return void
30 * @version 1.0.0
31 * @since 4.2.5.6
32 */
33 public function load_scripts_styles_on_head() {
34 LP_Helper::print_inline_script_tag( 'lpDataAdmin', $this->localize_data_global(), array( 'id' => 'lpDataAdmin' ) );
35 LP_Helper::print_inline_script_tag( 'lpData', $this->localize_data_global(), array( 'id' => 'lpData' ) );
36 }
37
38 /**
39 * Localize data for all page backend.
40 *
41 * @return array
42 * @since 4.2.5.6
43 * @version 1.0.2
44 */
45 public function localize_data_global(): array {
46 $screen = function_exists( 'get_current_screen' ) ? get_current_screen() : null;
47
48 ob_start();
49 Template::instance()->get_admin_template( 'search-author-field.php' );
50 $html_search_author_field = ob_get_clean();
51
52 return apply_filters(
53 'learn-press/admin/localize-data-global',
54 array(
55 'site_url' => site_url(),
56 'user_id' => get_current_user_id(),
57 'is_admin' => current_user_can( ADMIN_ROLE ),
58 'theme' => get_stylesheet(),
59 'lp_version' => LP()->version,
60 'lp_rest_url' => get_rest_url(),
61 'lp_rest_load_ajax' => get_rest_url( null, 'lp/v1/load_content_via_ajax/' ), // @deprecated 4.3.0
62 'lpAjaxUrl' => LP_Settings::url_handle_lp_ajax(),
63 'nonce' => wp_create_nonce( 'wp_rest' ),
64 'courses_url' => learn_press_get_page_link( 'courses' ),
65 'urlParams' => lp_archive_skeleton_get_args(),
66 'i18n' => array(
67 'select_page' => esc_html__( 'Select page', 'learnpress' ),
68 'yes' => esc_html__( 'Yes' ),
69 'cancel' => esc_html__( 'Cancel' ),
70 'generate_with_ai' => esc_html__( 'Generate with AI', 'learnpress' ),
71 'confirm_close_ai' => esc_html__( 'Are you sure you want to close? Generate data will stop.', 'learnpress' ),
72 ),
73 'current_screen' => $screen ? $screen->id : '',
74 'show_search_author_field' => empty( $html_search_author_field ) ? 0 : $html_search_author_field,
75 'toast' => array(
76 'gravity' => 'bottom',
77 'position' => 'center',
78 'duration' => 3000,
79 'close' => 1,
80 'stopOnFocus' => 1,
81 'classPrefix' => 'lp-toast',
82 ),
83 'single_instructor_id' => learn_press_get_page_id( 'single_instructor' ),
84 'lpAi' => array(
85 'config' => Config::instance()->get( 'open-ai-modal', 'settings' ),
86 'modelImage' => LP_Settings::get_option( 'open_ai_image_model_type', 'gpt-image-1' ),
87 ),
88 'enable_open_ai' => LP_Settings::get_option( 'enable_open_ai', 'no' ) === 'yes'
89 && ! empty( LP_Settings::get_option( 'open_ai_secret_key', '' ) ),
90 )
91 );
92 }
93
94 /**
95 * Get localize script
96 *
97 * @return array
98 */
99 protected function _get_script_data(): array {
100 $current_screen = get_current_screen();
101
102 return array(
103 'learn-press-global' => learn_press_global_script_params(),
104 /*
105 'learn-press-meta-box-order' => apply_filters(
106 'learn-press/meta-box-order/script-data',
107 array(
108 'i18n_error' => esc_html__( 'Oops! Error.', 'learnpress' ),
109 'i18n_guest' => esc_html__( 'Guest', 'learnpress' ),
110 )
111 ),*/
112 /*
113 'learn-press-update' => apply_filters(
114 'learn-press/upgrade/script-data',
115 array(
116 'i18n_confirm' => esc_html__(
117 'Before taking this action, we strongly recommend you backup your site first before proceeding. If you encounter any problems, please do not hesitate to contact our support team. Are you sure to proceed with the update protocol?',
118 'learnpress'
119 ),
120 )
121 ),*/
122 'lp-admin' => apply_filters(
123 'learn-press/admin/script-data',
124 array(
125 'ajax' => admin_url( 'admin-ajax.php' ),
126 'questionTypes' => learn_press_question_types(),
127 'supportAnswerOptions' => learn_press_get_question_support_answer_options(),
128 'screen' => $current_screen,
129 )
130 ),
131 // Statistics dashboard config → JS global lpAdminStatisticSettings.
132 // REST root + nonce come from lpDataAdmin (already on every admin page).
133 'lp-admin-statistic' => apply_filters(
134 'learn-press/admin/statistics/script-data',
135 array(
136 'restNamespace' => 'lp/v1/statistics',
137 'adminUrl' => admin_url(),
138 // decode: JS renders via textContent, entities would show literally.
139 'currencySymbol' => html_entity_decode( learn_press_get_currency_symbol() ),
140 'completionTarget' => (int) apply_filters( 'learn-press/statistics/completion-target', 70 ),
141 // Completion badge bands: >= green is green, >= yellow is yellow, below is red.
142 'completionBadge' => apply_filters(
143 'learn-press/statistics/completion-badge-thresholds',
144 array(
145 'green' => 60,
146 'yellow' => 40,
147 )
148 ),
149 // Date-range dropdown: per-preset resolved labels ( the server is the
150 // single source of calendar logic — JS never re-derives windows ).
151 'dateRange' => array(
152 'presets' => self::statistics_date_range_presets(),
153 'startOfWeek' => (int) get_option( 'start_of_week', 1 ),
154 'dateFormat' => (string) get_option( 'date_format', 'F j, Y' ),
155 ),
156 'i18n' => array(
157 'loadError' => esc_html__( 'Failed to load statistics data.', 'learnpress' ),
158 'noData' => esc_html__( 'No data for this period.', 'learnpress' ),
159 // Date-range dropdown.
160 'presets' => esc_html__( 'Presets', 'learnpress' ),
161 'custom' => esc_html__( 'Custom', 'learnpress' ),
162 'compareTo' => esc_html__( 'Compare to', 'learnpress' ),
163 'previousPeriod' => esc_html__( 'Previous period', 'learnpress' ),
164 'previousYear' => esc_html__( 'Previous year', 'learnpress' ),
165 'update' => esc_html__( 'Update', 'learnpress' ),
166 'from' => esc_html__( 'From', 'learnpress' ),
167 'to' => esc_html__( 'To', 'learnpress' ),
168 'selectDateRange' => esc_html__( 'Select a date range', 'learnpress' ),
169 'itemsCount' => esc_html__( '%d items', 'learnpress' ),
170 'cappedNotice' => esc_html__( 'Showing the first %d rows. Narrow the period or filters to see the rest.', 'learnpress' ),
171 'vsPrevPeriod' => esc_html__( 'vs previous period', 'learnpress' ),
172 'revenue' => esc_html__( 'Revenue', 'learnpress' ),
173 'enrollments' => esc_html__( 'Enrollments', 'learnpress' ),
174 'aov' => esc_html__( 'Avg. order value: %s', 'learnpress' ),
175 'belowTarget' => esc_html__( '%d below completion target', 'learnpress' ),
176 'failRate' => esc_html__( '%s%% of all orders', 'learnpress' ),
177 'course' => esc_html__( 'Course', 'learnpress' ),
178 'orders' => esc_html__( 'Orders', 'learnpress' ),
179 'aovShort' => esc_html__( 'AOV', 'learnpress' ),
180 'status' => esc_html__( 'Status', 'learnpress' ),
181 'enrolled' => esc_html__( 'Enrolled', 'learnpress' ),
182 'completion' => esc_html__( 'Completion', 'learnpress' ),
183 'instructor' => esc_html__( 'Instructor', 'learnpress' ),
184 'courses' => esc_html__( 'Courses', 'learnpress' ),
185 'topCourses' => esc_html__( 'Top courses', 'learnpress' ),
186 'topSoldCourses' => esc_html__( 'Top sold courses', 'learnpress' ),
187 'healthy' => esc_html__( 'Healthy', 'learnpress' ),
188 'watchCompletion' => esc_html__( 'Watch completion', 'learnpress' ),
189 'highFailedQuizzes' => esc_html__( 'High failed quizzes', 'learnpress' ),
190 'needsFulfillmentReview' => esc_html__( 'Needs fulfillment review', 'learnpress' ),
191 'awaitingPayment' => esc_html__( 'Awaiting payment', 'learnpress' ),
192 'exceptionRate' => esc_html__( '%s%% of all orders', 'learnpress' ),
193 'orderId' => esc_html__( 'Order ID', 'learnpress' ),
194 'student' => esc_html__( 'Student', 'learnpress' ),
195 'issue' => esc_html__( 'Issue', 'learnpress' ),
196 'date' => esc_html__( 'Date', 'learnpress' ),
197 'severity' => esc_html__( 'Severity', 'learnpress' ),
198 'high' => esc_html__( 'High', 'learnpress' ),
199 'medium' => esc_html__( 'Medium', 'learnpress' ),
200 'low' => esc_html__( 'Low', 'learnpress' ),
201 'orderExceptions' => esc_html__( 'Recent order exceptions', 'learnpress' ),
202 'noOrderExceptions' => esc_html__( 'No failed or cancelled orders in this period.', 'learnpress' ),
203 'addedThisPeriod' => esc_html__( '%d added this period', 'learnpress' ),
204 'needsInstructorAction' => esc_html__( 'Needs instructor action', 'learnpress' ),
205 'scheduledReleases' => esc_html__( 'Scheduled releases', 'learnpress' ),
206 'targetPercent' => esc_html__( 'Target: %s%%', 'learnpress' ),
207 'publishedCourses' => esc_html__( 'Published courses', 'learnpress' ),
208 'noCoursePerformance' => esc_html__( 'No course performance data in this period.', 'learnpress' ),
209 'coursePerformance' => esc_html__( 'Course performance', 'learnpress' ),
210 'lessons' => esc_html__( 'Lessons', 'learnpress' ),
211 'quizzes' => esc_html__( 'Quizzes', 'learnpress' ),
212 'assignments' => esc_html__( 'Assignments', 'learnpress' ),
213 'published' => esc_html__( 'Published', 'learnpress' ),
214 'pending' => esc_html__( 'Pending', 'learnpress' ),
215 'future' => esc_html__( 'Future', 'learnpress' ),
216 'drafts' => esc_html__( 'Drafts', 'learnpress' ),
217 'total' => esc_html__( 'Total', 'learnpress' ),
218 'content' => esc_html__( 'Content', 'learnpress' ),
219 'newThisPeriod' => esc_html__( '+%d this period', 'learnpress' ),
220 'activeInPeriod' => esc_html__( '%d active in this period', 'learnpress' ),
221 'activeThisPeriod' => esc_html__( 'active this period', 'learnpress' ),
222 'afterEnrollment' => esc_html__( 'After enrollment', 'learnpress' ),
223 'currentLearners' => esc_html__( 'Current learners', 'learnpress' ),
224 'completionRateSub' => esc_html__( '%s%% completion rate', 'learnpress' ),
225 'registeredUsers' => esc_html__( 'Registered users', 'learnpress' ),
226 'topStudents' => esc_html__( 'Top students', 'learnpress' ),
227 'topCoursesByStudents' => esc_html__( 'Top courses by students', 'learnpress' ),
228 'avgScore' => esc_html__( 'Quiz pass rate', 'learnpress' ),
229 'lastActive' => esc_html__( 'Last active', 'learnpress' ),
230 'startedLabel' => esc_html__( 'Started', 'learnpress' ),
231 'completedLabel' => esc_html__( 'Completed', 'learnpress' ),
232 'activeLast7dShort' => esc_html__( 'Active 7d', 'learnpress' ),
233 'statusActive' => esc_html__( 'Active', 'learnpress' ),
234 'statusAtRisk' => esc_html__( 'At risk', 'learnpress' ),
235 'statusIdle' => esc_html__( 'Idle', 'learnpress' ),
236 // Instructors tab.
237 'ofNetSales' => esc_html__( '%s%% of net sales', 'learnpress' ),
238 'ofTotalInstructors' => esc_html__( '%d total', 'learnpress' ),
239 'students' => esc_html__( 'Students', 'learnpress' ),
240 'sold' => esc_html__( 'Sold', 'learnpress' ),
241 'risk' => esc_html__( 'Risk', 'learnpress' ),
242 'actionRequired' => esc_html__( 'Action required', 'learnpress' ),
243 'riskHigh' => esc_html__( 'High', 'learnpress' ),
244 'riskMedium' => esc_html__( 'Medium', 'learnpress' ),
245 'riskHealthy' => esc_html__( 'Healthy', 'learnpress' ),
246 'instructorPerformance' => esc_html__( 'Instructor performance', 'learnpress' ),
247 'instructorReport' => esc_html__( 'Instructor report', 'learnpress' ),
248 'noInstructorData' => esc_html__( 'No instructor data in this period.', 'learnpress' ),
249 'instructorReportEmpty' => esc_html__( 'This instructor has no courses yet.', 'learnpress' ),
250 'watchlistActions' => array(
251 'review_quiz_difficulty' => esc_html__( 'Review quiz difficulty', 'learnpress' ),
252 'build_curriculum' => esc_html__( 'Build the curriculum', 'learnpress' ),
253 'add_practice_content' => esc_html__( 'Add practice content', 'learnpress' ),
254 'monitor' => esc_html__( 'Monitor', 'learnpress' ),
255 ),
256 ),
257 )
258 ),
259 // @deprecated tag 'learn-press-admin-course-editor' 4.4.2 - no any enqueue js for that.
260 // 'learn-press-admin-course-editor' => $this->get_course_data_for_editor_vue(),
261 );
262 }
263
264 /**
265 * Preset entries for the statistics date-range dropdown.
266 *
267 * UI presets in display order. Labels are resolved server-side so JS never
268 * re-implements calendar logic.
269 *
270 * @return array[] [ { value, name, rangeLabel } ]
271 * @since 4.4.2
272 */
273 private static function statistics_date_range_presets(): array {
274 $presets = array();
275
276 foreach ( PeriodResolver::UI_PRESETS as $preset ) {
277 $presets[] = array(
278 'value' => $preset,
279 'name' => PeriodResolver::preset_name( $preset ),
280 'rangeLabel' => PeriodResolver::range_label_for( PeriodResolver::resolve( $preset ) ),
281 );
282 }
283
284 return $presets;
285 }
286
287 /**
288 * Get default scripts in admin.
289 *
290 * @return mixed
291 */
292 protected function _get_scripts(): array {
293 $lp_admin_js = new LP_Asset_Key(
294 $this->url( 'js/dist/admin/admin' . self::$_min_assets . '.js' ),
295 array( 'wp-i18n', 'lp-utils' ),
296 array(),
297 0,
298 0,
299 '',
300 array( 'strategy' => 'async' )
301 );
302 $lp_admin_js->exclude_screen(
303 array(
304 'plugin-install',
305 'learnpress_page_learn-press-statistics',
306 'learnpress_page_learn-press-addons',
307 )
308 );
309
310 $scripts = apply_filters(
311 'learn-press/admin-default-scripts',
312 array(
313 'lp-load-ajax' => new LP_Asset_Key(
314 self::url( 'js/dist/loadAJAX' . self::$_min_assets . '.js' ),
315 array(),
316 array(),
317 0,
318 0,
319 '',
320 array( 'strategy' => 'async' )
321 ),
322 // need build if change source vue
323 //'vue-libs' => new LP_Asset_Key( $this->url( 'js/vendor/vue/vue_libs.js' ) ),
324 //'select2' => new LP_Asset_Key( $this->url( 'src/js/vendor/select2.full.min.js' ) ),
325 'jquery-tipsy' => new LP_Asset_Key( $this->url( 'src/js/vendor/jquery/jquery-tipsy.js' ) ),
326 'html2pdf' => new LP_Asset_Key( $this->url( 'src/js/vendor/html2pdf.bundle.min.js' ) ),
327 'lp-utils' => new LP_Asset_Key(
328 $this->url( 'js/dist/utils' . self::$_min_assets . '.js' ),
329 array(),
330 array(),
331 1
332 ),
333 /*
334 'jquery-ui-timepicker-addon' => new LP_Asset_Key(
335 $this->url( 'src/js/vendor/jquery/jquery-ui-timepicker-addon.js' ),
336 array( 'jquery-ui-datepicker' )
337 ),*/
338 'lp-addons' => new LP_Asset_Key(
339 $this->url( 'js/dist/admin/addons' . self::$_min_assets . '.js' ),
340 array(),
341 array( 'learnpress_page_learn-press-addons' ),
342 0,
343 0,
344 '',
345 array( 'strategy' => 'async' )
346 ),
347 // 'advanced-list' => new LP_Asset_Key( $this->url( self::$_folder_source . 'js/admin/share/advanced-list' . self::$_min_assets . '.js' ) ),
348 'learn-press-global' => new LP_Asset_Key(
349 $this->url( self::$_folder_source . 'js/global' . self::$_min_assets . '.js' ),
350 array( 'jquery', 'underscore', 'utils', 'jquery-ui-sortable' )
351 ),
352 'lp-admin' => $lp_admin_js,
353 'lp-admin-mcp-api-keys' => new LP_Asset_Key(
354 $this->url( 'js/dist/admin/mcp-api-keys.js' ),
355 [ 'lp-load-ajax' ],
356 [ 'learnpress_page_learn-press-settings' ],
357 0,
358 1,
359 '',
360 array( 'strategy' => 'defer' )
361 ),
362 'lp-admin-webhooks' => new LP_Asset_Key(
363 $this->url( 'js/dist/admin/webhooks.js' ),
364 [ 'lp-load-ajax', 'lp-admin' ],
365 [ 'learnpress_page_learn-press-settings' ],
366 0,
367 1,
368 '',
369 [ 'strategy' => 'defer' ]
370 ),
371 'lp-admin-learnpress' => new LP_Asset_Key(
372 $this->url( 'js/dist/admin/learnpress' . self::$_min_assets . '.js' ),
373 array(
374 'learn-press-global',
375 'wp-color-picker',
376 'jquery-tipsy',
377 'wp-api-fetch',
378 // 'jquery-ui-timepicker-addon',
379 // 'select2'
380 ),
381 array(
382 LP_LESSON_CPT,
383 LP_QUIZ_CPT,
384 LP_COURSE_CPT,
385 // LP_ORDER_CPT,
386 'learnpress_page_learn-press-settings',
387 ),
388 0,
389 1,
390 '',
391 array( 'strategy' => 'defer' )
392 ),
393 'lp-duplicate-post' => new LP_Asset_Key(
394 $this->url( self::$_folder_source . 'js/admin/lp-duplicate-post' . self::$_min_assets . '.js' ),
395 array( 'jquery' ),
396 array(
397 'edit-' . LP_COURSE_CPT,
398 'edit-' . LP_LESSON_CPT,
399 'edit-' . LP_QUESTION_CPT,
400 'edit-' . LP_QUIZ_CPT,
401 ),
402 0,
403 1
404 ),
405 /*
406 'learn-press-admin-course-editor' => new LP_Asset_Key(
407 $this->url( 'js/dist/admin/editor/course' . self::$_min_assets . '.js' ),
408 array( 'vue-libs', 'lp-utils' ),
409 array( LP_COURSE_CPT ),
410 0,
411 0
412 ),*/
413 'lp-admin-courses' => new LP_Asset_Key(
414 $this->url( 'dist/js/admin/admin-courses' . self::$_min_assets . '.js' ),
415 array( 'lp-load-ajax', 'wp-i18n' ),
416 array( 'edit-' . LP_COURSE_CPT ),
417 0,
418 0,
419 '',
420 array( 'strategy' => 'async' )
421 ),
422 'lp-edit-course' => new LP_Asset_Key(
423 $this->url( 'dist/js/admin/edit-course' . self::$_min_assets . '.js' ),
424 array( 'lp-load-ajax' ),
425 array(),
426 1,
427 0,
428 '',
429 array( 'strategy' => 'async' )
430 ),
431 'lp-edit-quiz' => new LP_Asset_Key(
432 $this->url( 'dist/js/admin/edit-quiz' . self::$_min_assets . '.js' ),
433 array( 'lp-load-ajax' ),
434 array(),
435 1,
436 0,
437 '',
438 array( 'strategy' => 'async' )
439 ),
440 'lp-edit-question' => new LP_Asset_Key(
441 $this->url( 'dist/js/admin/edit-question' . self::$_min_assets . '.js' ),
442 array( 'lp-load-ajax' ),
443 array(),
444 1,
445 0,
446 '',
447 array( 'strategy' => 'async' )
448 ),
449 /*
450 'learn-press-admin-quiz-editor' => new LP_Asset_Key(
451 $this->url( 'js/dist/admin/editor/quiz' . self::$_min_assets . '.js' ),
452 array( 'vue-libs', 'lp-utils' ),
453 array( LP_QUIZ_CPT ),
454 0,
455 0
456 ),*/
457 /*
458 'learn-press-admin-question-editor' => new LP_Asset_Key(
459 $this->url( 'js/dist/admin/editor/question' . self::$_min_assets . '.js' ),
460 array( 'vue-libs', 'lodash', 'lp-utils' ),
461 array( LP_QUESTION_CPT ),
462 0,
463 0
464 ),*/
465 /*
466 'learn-press-meta-box-order' => new LP_Asset_Key(
467 $this->url( self::$_folder_source . 'js/admin/partial/meta-box-order' . self::$_min_assets . '.js' ),
468 array(
469 'vue-libs',
470 'advanced-list',
471 //'lp-modal-search-courses',
472 //'lp-modal-search-users',
473 ),
474 array( LP_ORDER_CPT ),
475 0,
476 1
477 ),*/
478 'lp-admin-order' => new LP_Asset_Key(
479 $this->url( 'js/dist/admin/admin-order' . self::$_min_assets . '.js' ),
480 array( 'html2pdf', 'lp-load-ajax' ),
481 array( LP_ORDER_CPT ),
482 0,
483 0,
484 '',
485 array( 'strategy' => 'defer' )
486 ),
487 'lp-admin-orders' => new LP_Asset_Key(
488 $this->url( 'js/dist/admin/admin-orders' . self::$_min_assets . '.js' ),
489 array(),
490 array( 'edit-' . LP_ORDER_CPT ),
491 0,
492 0,
493 '',
494 array( 'strategy' => 'async' )
495 ),
496
497 /*
498 'learn-press-sync-data' => new LP_Asset_Key(
499 $this->url( 'js/dist/admin/pages/sync-data' . self::$_min_assets . '.js' ),
500 array(),
501 array( 'learnpress_page_learn-press-tools' ),
502 0,
503 1
504 ),*/
505 /*
506 'lp-setup' => new LP_Asset_Key(
507 $this->url( 'js/dist/admin/pages/setup' . self::$_min_assets . '.js' ),
508 array( 'jquery', 'dropdown-pages' ),
509 array( 'lp-page-setup' ),
510 0,
511 1
512 ),*/
513 /*
514 'learn-press-statistic' => new LP_Asset_Key(
515 $this->url( 'js/dist/admin/pages/statistic' . self::$_min_assets . '.js' ),
516 array( 'jquery', 'jquery-ui-datepicker', 'chart' ),
517 array( 'learnpress_page_learn-press-statistics' ),
518 0,
519 1
520 ),*/
521 /*
522 'lp-modal-search-courses' => new LP_Asset_Key(
523 $this->url( self::$_folder_source . 'js/admin/share/modal-search-courses' . self::$_min_assets . '.js' ),
524 array(
525 'vue-libs',
526 'jquery',
527 ),
528 array( LP_ORDER_CPT ),
529 1,
530 1
531 ),*/
532 /*
533 'lp-modal-search-users' => new LP_Asset_Key(
534 $this->url( self::$_folder_source . 'js/admin/share/modal-search-users' . self::$_min_assets . '.js' ),
535 array( 'jquery' ),
536 array( LP_ORDER_CPT ),
537 1,
538 1
539 ),*/
540 'lp-tools-course-tab' => new LP_Asset_Key(
541 $this->url( 'js/dist/admin/pages/tools' . self::$_min_assets . '.js' ),
542 [],
543 array( 'learnpress_page_learn-press-tools' ),
544 0,
545 1,
546 '',
547 array( 'strategy' => 'defer' )
548 ),
549 /*
550 'lp-dashboard' => new LP_Asset_Key(
551 self::url( 'js/dist/admin/pages/dashboard' . self::$_min_assets . '.js' ),
552 [],
553 array( 'dashboard' ),
554 0,
555 1
556 ),*/
557 'lp-widgets-admin' => new LP_Asset_Key(
558 self::url( 'js/dist/admin/pages/widgets' . self::$_min_assets . '.js' ),
559 array(
560 'wp-url',
561 'wp-api-fetch',
562 'lodash',
563 //'select2',
564 ),
565 array( 'widgets', 'elementor' ),
566 0,
567 1
568 ),
569 'lp-admin-notices' => new LP_Asset_Key(
570 self::url( 'js/dist/admin/admin-notices' . self::$_min_assets . '.js' ),
571 array(),
572 array(),
573 1,
574 0,
575 '',
576 array( 'strategy' => 'async' )
577 ),
578 'lp-material' => new LP_Asset_Key(
579 $this->url( 'js/dist/admin/course-material' . self::$_min_assets . '.js' ),
580 array(),
581 array(
582 LP_COURSE_CPT,
583 LP_LESSON_CPT,
584 ),
585 0,
586 1
587 ),
588 'lp-list-students-enrolled' => new LP_Asset_Key(
589 $this->url( 'dist/js/admin/list-students-enrolled' . self::$_min_assets . '.js' ),
590 array( 'lp-load-ajax' ),
591 array( 'learnpress_page_learn-press-students-enrolled' ),
592 0,
593 0,
594 '',
595 array( 'strategy' => 'async' )
596 ),
597 'lp-admin-tools' => new LP_Asset_Key(
598 $this->url( 'js/dist/admin/admin-tools' . self::$_min_assets . '.js' ),
599 array(),
600 array( 'learnpress_page_learn-press-tools' ),
601 0,
602 1,
603 '',
604 array( 'strategy' => 'defer' )
605 ),
606 'lp-admin-statistic' => new LP_Asset_Key(
607 $this->url( 'js/dist/admin/admin-statistic' . self::$_min_assets . '.js' ),
608 array( 'lp-load-ajax' ),
609 array( 'learnpress_page_learn-press-statistics' ),
610 0,
611 0,
612 '',
613 array( 'strategy' => 'defer' )
614 ),
615 )
616 );
617
618 /*
619 $screen = function_exists( 'get_current_screen' ) ? get_current_screen() : null;
620 if ( $screen && $screen->id === 'site-editor' ) {
621 $scripts['editor-check'] = new LP_Asset_Key(
622 self::url( 'js/dist/gutenberg/editor-check' . self::$_min_assets . '.js' ),
623 array(
624 'wp-data',
625 'wp-edit-post',
626 'wp-editor',
627 ),
628 [],
629 0,
630 0,
631 '1.0.0',
632 [ 'strategy' => 'defer' ]
633 );
634 }*/
635
636 return $scripts;
637 }
638
639 /**
640 * Get default styles in admin.
641 *
642 * @return mixed
643 */
644 protected function _get_styles(): array {
645 $is_rtl = is_rtl() ? '-rtl' : '';
646
647 return apply_filters(
648 'learn-press/admin-default-styles',
649 array(
650 /*'select2' => new LP_Asset_Key(
651 $this->url( 'src/css/vendor/select2.min.css' )
652 ),*/
653 /*
654 'font-awesome' => new LP_Asset_Key(
655 $this->url( 'src/css/vendor/font-awesome-5.min.css' )
656 ),*/
657 /*
658 'jquery-ui' => new LP_Asset_Key(
659 $this->url( 'src/css/vendor/jquery-ui/jquery-ui.min.css' )
660 ),
661 'jquery-ui-timepicker' => new LP_Asset_Key(
662 $this->url( 'src/css/vendor/jquery-ui-timepicker-addon.css' )
663 ),*/
664 'jquery-tipsy' => new LP_Asset_Key(
665 $this->url( 'src/css/vendor/jquery.tipsy.css' )
666 ),
667 'learn-press-admin' => new LP_Asset_Key(
668 $this->url( 'css/admin/admin' . $is_rtl . self::$_min_assets . '.css' ),
669 array(
670 'wp-color-picker',
671 'wp-components',
672 // 'select2',
673 // 'jquery-ui',
674 // 'jquery-ui-timepicker',
675 // 'font-awesome',
676 'jquery-tipsy',
677 ),
678 array(),
679 0
680 ),
681 'lp-help-center' => new LP_Asset_Key(
682 $this->url( 'css/admin/help-center' . $is_rtl . self::$_min_assets . '.css' ),
683 array(),
684 array( 'learnpress_page_learn-press-help-center' ),
685 0
686 ),
687 'lp-edit-curriculum' => new LP_Asset_Key(
688 $this->url( 'css/edit-curriculum' . $is_rtl . self::$_min_assets . '.css' ),
689 array(),
690 array(),
691 1
692 ),
693 'lp-edit-quiz' => new LP_Asset_Key(
694 $this->url( 'css/edit-quiz' . $is_rtl . self::$_min_assets . '.css' ),
695 array(),
696 array(),
697 1
698 ),
699 'lp-edit-question' => new LP_Asset_Key(
700 $this->url( 'css/edit-question' . $is_rtl . self::$_min_assets . '.css' ),
701 array(),
702 array(),
703 1
704 ),
705 'learn-press-statistic' => new LP_Asset_Key(
706 LP_CSS_URL . 'admin/statistic' . $is_rtl . self::$_min_assets . '.css',
707 array(),
708 array( 'learners_page_learn-press-statistics' ),
709 0
710 ),
711 'lp-tom-select' => new LP_Asset_Key(
712 $this->url( 'src/css/vendor/tom-select.min.css' ),
713 array(),
714 array(),
715 0
716 ),
717 )
718 );
719 }
720
721 /**
722 * Register and enqueue needed js and styles
723 */
724 public function load_scripts() {
725 $screen_id = LP_Admin::instance()->get_screen_id();
726
727 if ( empty( $screen_id ) ) {
728 return;
729 }
730
731 // wp_enqueue_media(); //Todo: tungnx need check why call for that using.
732 $this->handle_js( $screen_id );
733 $this->handle_style( $screen_id );
734
735 do_action( 'learn-press/admin/after-enqueue-scripts' );
736 }
737
738 /**
739 * Show overlay
740 */
741 public function add_elements_global() {
742 echo '<div class="lp-overlay">';
743 apply_filters( 'learnpress/admin/modal-dialog', learn_press_get_template( 'global/lp-modal-overlay' ) );
744 echo '</div>';
745
746 apply_filters( 'learnpress/admin/steps', learn_press_get_template( 'global/lp-group-step' ) );
747
748 // Added notify message when action done.
749 Template::instance()->get_admin_template( 'global/notify-action.php' );
750 }
751
752 /**
753 * Get course data for Vue Editor Course use.
754 *
755 * @return array|mixed|null
756 * @deprecated 4.4.2 - no any enqueue js for that.
757 */
758 /*
759 public function get_course_data_for_editor_vue() {
760 global $post, $pagenow;
761
762 if ( empty( $post ) || ( get_post_type() !== LP_COURSE_CPT ) || ! in_array(
763 $pagenow,
764 array(
765 'post.php',
766 'post-new.php',
767 )
768 ) ) {
769 return array();
770 }
771
772 $course = CourseModel::find( $post->ID, true );
773 if ( $course ) {
774 $course_section_items = $course->get_section_items();
775 } else { // Code old if not found course on the table learnpress_courses.
776 $course = learn_press_get_course( $post->ID );
777 $course_section_items = $course->get_curriculum_raw();
778 }
779 $hidden_sections = get_post_meta( $post->ID, '_admin_hidden_sections', true );
780
781 return apply_filters(
782 'learn-press/admin-localize-course-editor',
783 array(
784 'root' => array(
785 'course_id' => $post->ID,
786 'auto_draft' => get_post_status( $post->ID ) == 'auto-draft',
787 'ajax' => admin_url( 'index.php' ),
788 'disable_curriculum' => false,
789 'action' => 'admin_course_editor',
790 'nonce' => wp_create_nonce( 'learnpress_update_curriculum' ),
791 ),
792 'chooseItems' => array(
793 'types' => learn_press_course_get_support_item_types(),
794 'open' => false,
795 'addedItems' => array(),
796 'items' => array(),
797 ),
798 'i18n' => array(
799 'item' => __( 'item', 'learnpress' ),
800 'new_section_item' => __( 'Create a new', 'learnpress' ),
801 'back' => __( 'Back', 'learnpress' ),
802 'selected_items' => __( 'Selected items', 'learnpress' ),
803 'confirm_remove_item' => __( 'Do you want to remove the "{{ITEM_NAME}}" item from the course?', 'learnpress' ),
804 'confirm_trash_item' => __( 'Do you want to move the "{{ITEM_NAME}}" item to the trash?', 'learnpress' ),
805 'item_labels' => array(
806 'singular' => __( 'Item', 'learnpress' ),
807 'plural' => __( 'Items', 'learnpress' ),
808 ),
809 'notice_sale_price' => __( 'The course sale price must be less than the regular price', 'learnpress' ),
810 'notice_price' => __( 'The course price must be greater than the sale price', 'learnpress' ),
811 'notice_sale_start_date' => __( 'The sale start date must be before the sale end date', 'learnpress' ),
812 'notice_sale_end_date' => __( 'The sale end date must be after the sale start date', 'learnpress' ),
813 'notice_invalid_date' => __( 'Invalid date', 'learnpress' ),
814 ),
815 'sections' => array(
816 'sections' => $course_section_items,
817 'hidden_sections' => ! empty( $hidden_sections ) ? $hidden_sections : array(),
818 'urlEdit' => admin_url( 'post.php?action=edit&post=' ),
819 ),
820 )
821 );
822 }*/
823
824 public static function instance() {
825 if ( ! is_admin() ) {
826 return null;
827 }
828
829 if ( ! self::$_instance ) {
830 self::$_instance = new self();
831 }
832
833 return self::$_instance;
834 }
835 }
836
837 /**
838 * Shortcut function to get instance of LP_Admin_Assets
839 *
840 * @return LP_Admin_Assets|null
841 * Addon Certificate, Import/Export is using.
842 */
843 function learn_press_admin_assets() {
844 return LP_Admin_Assets::instance();
845 }
846