PluginProbe
LearnPress – WordPress LMS Plugin for Create and Sell Online Courses / 4.4.5
LearnPress – WordPress LMS Plugin for Create and Sell Online Courses v4.4.5
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.5, at inc/admin/class-lp-admin-assets.php

857 lines 30.3 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 array(
543 'jquery',
544 'wp-element',
545 'wp-compose',
546 'wp-components',
547 'wp-data',
548 'wp-hooks',
549 'wp-api-fetch',
550 'lodash',
551 'vue-libs',
552
553 ),
554 array( 'learnpress_page_learn-press-tools' ),
555 0,
556 1,
557 '',
558 array( 'strategy' => 'defer' )
559 ),
560 /*
561 'lp-dashboard' => new LP_Asset_Key(
562 self::url( 'js/dist/admin/pages/dashboard' . self::$_min_assets . '.js' ),
563 [],
564 array( 'dashboard' ),
565 0,
566 1
567 ),*/
568 'lp-widgets-admin' => new LP_Asset_Key(
569 self::url( 'js/dist/admin/pages/widgets' . self::$_min_assets . '.js' ),
570 array(
571 'wp-url',
572 'wp-api-fetch',
573 'lodash',
574 //'select2',
575 ),
576 array( 'widgets', 'elementor' ),
577 0,
578 1
579 ),
580 'lp-admin-notices' => new LP_Asset_Key(
581 self::url( 'js/dist/admin/admin-notices' . self::$_min_assets . '.js' ),
582 array(),
583 array(),
584 1,
585 0,
586 '',
587 array( 'strategy' => 'async' )
588 ),
589 'lp-material' => new LP_Asset_Key(
590 $this->url( 'js/dist/admin/course-material' . self::$_min_assets . '.js' ),
591 array(),
592 array(
593 LP_COURSE_CPT,
594 LP_LESSON_CPT,
595 ),
596 0,
597 1
598 ),
599 'lp-list-students-enrolled' => new LP_Asset_Key(
600 $this->url( 'dist/js/admin/list-students-enrolled' . self::$_min_assets . '.js' ),
601 array( 'lp-load-ajax' ),
602 array( 'learnpress_page_learn-press-students-enrolled' ),
603 0,
604 0,
605 '',
606 array( 'strategy' => 'async' )
607 ),
608 'lp-admin-tools' => new LP_Asset_Key(
609 $this->url( 'js/dist/admin/admin-tools' . self::$_min_assets . '.js' ),
610 array(),
611 array( 'learnpress_page_learn-press-tools' ),
612 0,
613 1,
614 '',
615 array( 'strategy' => 'defer' )
616 ),
617 'lp-admin-statistic' => new LP_Asset_Key(
618 $this->url( 'js/dist/admin/admin-statistic' . self::$_min_assets . '.js' ),
619 array( 'lp-load-ajax' ),
620 array( 'learnpress_page_learn-press-statistics' ),
621 0,
622 0,
623 '',
624 array( 'strategy' => 'defer' )
625 ),
626 )
627 );
628
629 /*
630 $screen = function_exists( 'get_current_screen' ) ? get_current_screen() : null;
631 if ( $screen && $screen->id === 'site-editor' ) {
632 $scripts['editor-check'] = new LP_Asset_Key(
633 self::url( 'js/dist/gutenberg/editor-check' . self::$_min_assets . '.js' ),
634 array(
635 'wp-data',
636 'wp-edit-post',
637 'wp-editor',
638 ),
639 [],
640 0,
641 0,
642 '1.0.0',
643 [ 'strategy' => 'defer' ]
644 );
645 }*/
646
647 return $scripts;
648 }
649
650 /**
651 * Get default styles in admin.
652 *
653 * @return mixed
654 */
655 protected function _get_styles(): array {
656 $is_rtl = is_rtl() ? '-rtl' : '';
657
658 return apply_filters(
659 'learn-press/admin-default-styles',
660 array(
661 /*'select2' => new LP_Asset_Key(
662 $this->url( 'src/css/vendor/select2.min.css' )
663 ),*/
664 /*
665 'font-awesome' => new LP_Asset_Key(
666 $this->url( 'src/css/vendor/font-awesome-5.min.css' )
667 ),*/
668 /*
669 'jquery-ui' => new LP_Asset_Key(
670 $this->url( 'src/css/vendor/jquery-ui/jquery-ui.min.css' )
671 ),
672 'jquery-ui-timepicker' => new LP_Asset_Key(
673 $this->url( 'src/css/vendor/jquery-ui-timepicker-addon.css' )
674 ),*/
675 'jquery-tipsy' => new LP_Asset_Key(
676 $this->url( 'src/css/vendor/jquery.tipsy.css' )
677 ),
678 'learn-press-admin' => new LP_Asset_Key(
679 $this->url( 'css/admin/admin' . $is_rtl . self::$_min_assets . '.css' ),
680 array(
681 'wp-color-picker',
682 'wp-components',
683 // 'select2',
684 // 'jquery-ui',
685 // 'jquery-ui-timepicker',
686 // 'font-awesome',
687 'jquery-tipsy',
688 ),
689 array(),
690 0
691 ),
692 'lp-help-center' => new LP_Asset_Key(
693 $this->url( 'css/admin/help-center' . $is_rtl . self::$_min_assets . '.css' ),
694 array(),
695 array( 'learnpress_page_learn-press-help-center' ),
696 0
697 ),
698 'lp-edit-curriculum' => new LP_Asset_Key(
699 $this->url( 'css/edit-curriculum' . $is_rtl . self::$_min_assets . '.css' ),
700 array(),
701 array(),
702 1
703 ),
704 'lp-edit-quiz' => new LP_Asset_Key(
705 $this->url( 'css/edit-quiz' . $is_rtl . self::$_min_assets . '.css' ),
706 array(),
707 array(),
708 1
709 ),
710 'lp-edit-question' => new LP_Asset_Key(
711 $this->url( 'css/edit-question' . $is_rtl . self::$_min_assets . '.css' ),
712 array(),
713 array(),
714 1
715 ),
716 'learn-press-statistic' => new LP_Asset_Key(
717 LP_CSS_URL . 'admin/statistic' . $is_rtl . self::$_min_assets . '.css',
718 array(),
719 array( 'learners_page_learn-press-statistics' ),
720 0
721 ),
722 'lp-tom-select' => new LP_Asset_Key(
723 $this->url( 'src/css/vendor/tom-select.min.css' ),
724 array(),
725 array(),
726 0
727 ),
728 )
729 );
730 }
731
732 /**
733 * Register and enqueue needed js and styles
734 */
735 public function load_scripts() {
736 $screen_id = LP_Admin::instance()->get_screen_id();
737
738 if ( empty( $screen_id ) ) {
739 return;
740 }
741
742 // wp_enqueue_media(); //Todo: tungnx need check why call for that using.
743 $this->handle_js( $screen_id );
744 $this->handle_style( $screen_id );
745
746 do_action( 'learn-press/admin/after-enqueue-scripts' );
747 }
748
749 /**
750 * Show overlay
751 */
752 public function add_elements_global() {
753 echo '<div class="lp-overlay">';
754 apply_filters( 'learnpress/admin/modal-dialog', learn_press_get_template( 'global/lp-modal-overlay' ) );
755 echo '</div>';
756
757 apply_filters( 'learnpress/admin/steps', learn_press_get_template( 'global/lp-group-step' ) );
758
759 // Added notify message when action done.
760 Template::instance()->get_admin_template( 'global/notify-action.php' );
761 }
762
763 /**
764 * Get course data for Vue Editor Course use.
765 *
766 * @return array|mixed|null
767 * @deprecated 4.4.2 - no any enqueue js for that.
768 */
769 /*
770 public function get_course_data_for_editor_vue() {
771 global $post, $pagenow;
772
773 if ( empty( $post ) || ( get_post_type() !== LP_COURSE_CPT ) || ! in_array(
774 $pagenow,
775 array(
776 'post.php',
777 'post-new.php',
778 )
779 ) ) {
780 return array();
781 }
782
783 $course = CourseModel::find( $post->ID, true );
784 if ( $course ) {
785 $course_section_items = $course->get_section_items();
786 } else { // Code old if not found course on the table learnpress_courses.
787 $course = learn_press_get_course( $post->ID );
788 $course_section_items = $course->get_curriculum_raw();
789 }
790 $hidden_sections = get_post_meta( $post->ID, '_admin_hidden_sections', true );
791
792 return apply_filters(
793 'learn-press/admin-localize-course-editor',
794 array(
795 'root' => array(
796 'course_id' => $post->ID,
797 'auto_draft' => get_post_status( $post->ID ) == 'auto-draft',
798 'ajax' => admin_url( 'index.php' ),
799 'disable_curriculum' => false,
800 'action' => 'admin_course_editor',
801 'nonce' => wp_create_nonce( 'learnpress_update_curriculum' ),
802 ),
803 'chooseItems' => array(
804 'types' => learn_press_course_get_support_item_types(),
805 'open' => false,
806 'addedItems' => array(),
807 'items' => array(),
808 ),
809 'i18n' => array(
810 'item' => __( 'item', 'learnpress' ),
811 'new_section_item' => __( 'Create a new', 'learnpress' ),
812 'back' => __( 'Back', 'learnpress' ),
813 'selected_items' => __( 'Selected items', 'learnpress' ),
814 'confirm_remove_item' => __( 'Do you want to remove the "{{ITEM_NAME}}" item from the course?', 'learnpress' ),
815 'confirm_trash_item' => __( 'Do you want to move the "{{ITEM_NAME}}" item to the trash?', 'learnpress' ),
816 'item_labels' => array(
817 'singular' => __( 'Item', 'learnpress' ),
818 'plural' => __( 'Items', 'learnpress' ),
819 ),
820 'notice_sale_price' => __( 'The course sale price must be less than the regular price', 'learnpress' ),
821 'notice_price' => __( 'The course price must be greater than the sale price', 'learnpress' ),
822 'notice_sale_start_date' => __( 'The sale start date must be before the sale end date', 'learnpress' ),
823 'notice_sale_end_date' => __( 'The sale end date must be after the sale start date', 'learnpress' ),
824 'notice_invalid_date' => __( 'Invalid date', 'learnpress' ),
825 ),
826 'sections' => array(
827 'sections' => $course_section_items,
828 'hidden_sections' => ! empty( $hidden_sections ) ? $hidden_sections : array(),
829 'urlEdit' => admin_url( 'post.php?action=edit&post=' ),
830 ),
831 )
832 );
833 }*/
834
835 public static function instance() {
836 if ( ! is_admin() ) {
837 return null;
838 }
839
840 if ( ! self::$_instance ) {
841 self::$_instance = new self();
842 }
843
844 return self::$_instance;
845 }
846 }
847
848 /**
849 * Shortcut function to get instance of LP_Admin_Assets
850 *
851 * @return LP_Admin_Assets|null
852 * Addon Certificate, Import/Export is using.
853 */
854 function learn_press_admin_assets() {
855 return LP_Admin_Assets::instance();
856 }
857