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

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