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
← All changes | inc/admin/class-lp-admin-assets.php +617 -135 4.1.7.14.4.8 View file →
@@ -1,11 +1,16 @@
1 1 <?php
2 +
3 +use LearnPress\Helpers\Config;
4 +use LearnPress\Helpers\Template;
5 +use LearnPress\Models\CourseModel;
6 +use LearnPress\Statistics\PeriodResolver;
7 +
2 8 /**
3 9 * Class LP_Admin_Assets
4 10 *
5 11 * Manage admin assets
6 12 */
7 -
8 13 class LP_Admin_Assets extends LP_Abstract_Assets {
9 14 protected static $_instance;
10 15
11 16 /**
@@ -11,13 +16,83 @@
11 16 /**
12 17 * LP_Admin_Assets constructor.
13 18 */
14 19 protected function __construct() {
15 - add_action( 'admin_footer', array( $this, 'show_overlay' ) );
20 + add_action( 'admin_footer', array( $this, 'add_elements_global' ) );
21 + add_action( 'admin_print_scripts', array( $this, 'load_scripts_styles_on_head' ), - 1 );
16 22 parent::__construct();
17 23 }
18 24
19 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 + /**
20 95 * Get localize script
21 96 *
22 97 * @return array
23 98 */
@@ -24,26 +99,28 @@
24 99 protected function _get_script_data(): array {
25 100 $current_screen = get_current_screen();
26 101
27 102 return array(
28 - 'learn-press-global' => learn_press_global_script_params(),
29 - 'learn-press-meta-box-order' => apply_filters(
103 + 'learn-press-global' => learn_press_global_script_params(),
104 + /*
105 + 'learn-press-meta-box-order' => apply_filters(
30 106 'learn-press/meta-box-order/script-data',
31 107 array(
32 - 'i18n_error' => esc_html__( 'Ooops! Error.', 'learnpress' ),
108 + 'i18n_error' => esc_html__( 'Oops! Error.', 'learnpress' ),
33 109 'i18n_guest' => esc_html__( 'Guest', 'learnpress' ),
34 110 )
35 - ),
36 - 'learn-press-update' => apply_filters(
111 + ),*/
112 + /*
113 + 'learn-press-update' => apply_filters(
37 114 'learn-press/upgrade/script-data',
38 115 array(
39 116 'i18n_confirm' => esc_html__(
40 - 'Before taking this action, we strongly recommend you should backup your site first before proceeding. Should any issues come at hand, do not hesitate to contact our Support team. Are you sure to proceed the update protocol?',
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?',
41 118 'learnpress'
42 119 ),
43 120 )
44 - ),
45 - 'lp-admin' => apply_filters(
121 + ),*/
122 + 'lp-admin' => apply_filters(
46 123 'learn-press/admin/script-data',
47 124 array(
48 125 'ajax' => admin_url( 'admin-ajax.php' ),
49 126 'questionTypes' => learn_press_question_types(),
@@ -50,12 +127,165 @@
50 127 'supportAnswerOptions' => learn_press_get_question_support_answer_options(),
51 128 'screen' => $current_screen,
52 129 )
53 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(),
54 261 );
55 262 }
56 263
57 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 + /**
58 288 * Get default scripts in admin.
59 289 *
60 290 * @return mixed
61 291 */
@@ -60,66 +290,108 @@
60 290 * @return mixed
61 291 */
62 292 protected function _get_scripts(): array {
63 293 $lp_admin_js = new LP_Asset_Key(
64 - $this->url( self::$_folder_source . 'js/admin/admin' . self::$_min_assets . '.js' ),
65 - array( 'learn-press-global', 'lp-utils', 'wp-color-picker', 'jspdf', 'vue-libs', 'wp-i18n' ),
294 + $this->url( 'js/dist/admin/admin' . self::$_min_assets . '.js' ),
295 + array( 'wp-i18n', 'lp-utils' ),
66 296 array(),
67 297 0,
68 - 1
298 + 0,
299 + '',
300 + array( 'strategy' => 'async' )
69 301 );
70 - $lp_admin_js->exclude_screen( array( 'plugin-install' ) );
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 + );
71 309
72 310 $scripts = apply_filters(
73 311 'learn-press/admin-default-scripts',
74 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 + ),
75 322 // need build if change source vue
76 - 'vue-libs' => new LP_Asset_Key( $this->url( 'js/vendor/vue/vue_libs.js' ) ),
77 - 'select2' => new LP_Asset_Key( $this->url( 'src/js/vendor/select2.full.min.js' ) ),
78 - 'jquery-tipsy' => new LP_Asset_Key( $this->url( 'src/js/vendor/jquery/jquery-tipsy.js' ) ),
79 - 'jspdf' => new LP_Asset_Key( $this->url( 'src/js/vendor/jspdf.min.js' ) ),
80 - 'chart' => new LP_Asset_Key( $this->url( 'src/js/vendor/chart.min.js' ) ),
81 - 'dropdown-pages' => new LP_Asset_Key( $this->url( self::$_folder_source . 'js/admin/share/dropdown-pages' . self::$_min_assets . '.js' ) ),
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 + /*
82 334 'jquery-ui-timepicker-addon' => new LP_Asset_Key(
83 335 $this->url( 'src/js/vendor/jquery/jquery-ui-timepicker-addon.js' ),
84 336 array( 'jquery-ui-datepicker' )
85 - ),
86 - 'themes-addons' => new LP_Asset_Key(
87 - $this->url( 'js/dist/admin/pages/themes-addons' . self::$_min_assets . '.js' ),
88 - array( 'jquery' ),
337 + ),*/
338 + 'lp-addons' => new LP_Asset_Key(
339 + $this->url( 'js/dist/admin/addons' . self::$_min_assets . '.js' ),
340 + array(),
89 341 array( 'learnpress_page_learn-press-addons' ),
90 342 0,
91 - 1
343 + 0,
344 + '',
345 + array( 'strategy' => 'async' )
92 346 ),
93 - 'advanced-list' => new LP_Asset_Key( $this->url( self::$_folder_source . 'js/admin/share/advanced-list' . self::$_min_assets . '.js' ) ),
94 - 'learn-press-global' => new LP_Asset_Key(
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(
95 349 $this->url( self::$_folder_source . 'js/global' . self::$_min_assets . '.js' ),
96 - array( 'jquery', 'underscore', 'utils', 'jquery-ui-sortable', 'select2' ),
97 - array( 'learnpress' )
350 + array( 'jquery', 'underscore', 'utils', 'jquery-ui-sortable' )
98 351 ),
99 - 'lp-utils' => new LP_Asset_Key(
100 - $this->url( 'js/dist/utils' . self::$_min_assets . '.js' ),
101 - array(),
102 - array(),
103 - 1
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' )
104 361 ),
105 - 'lp-admin' => $lp_admin_js,
106 - 'lp-admin-learnpress' => new LP_Asset_Key(
107 - $this->url( self::$_folder_source . 'js/admin/learnpress' . self::$_min_assets . '.js' ),
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' ),
108 373 array(
109 374 'learn-press-global',
110 - 'lp-utils',
111 375 'wp-color-picker',
112 376 'jquery-tipsy',
113 - 'dropdown-pages',
114 377 'wp-api-fetch',
115 - 'jquery-ui-timepicker-addon',
378 + // 'jquery-ui-timepicker-addon',
379 + // 'select2'
116 380 ),
117 - array( LP_LESSON_CPT, LP_QUIZ_CPT, LP_COURSE_CPT, LP_ORDER_CPT, 'learnpress_page_learn-press-settings' ),
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 + ),
118 388 0,
119 - 1
389 + 1,
390 + '',
391 + array( 'strategy' => 'defer' )
120 392 ),
121 - 'lp-duplicate-post' => new LP_Asset_Key(
393 + 'lp-duplicate-post' => new LP_Asset_Key(
122 394 $this->url( self::$_folder_source . 'js/admin/lp-duplicate-post' . self::$_min_assets . '.js' ),
123 395 array( 'jquery' ),
124 396 array(
125 397 'edit-' . LP_COURSE_CPT,
@@ -129,41 +401,101 @@
129 401 ),
130 402 0,
131 403 1
132 404 ),
405 + /*
133 406 'learn-press-admin-course-editor' => new LP_Asset_Key(
134 407 $this->url( 'js/dist/admin/editor/course' . self::$_min_assets . '.js' ),
135 - array( 'vue-libs' ),
408 + array( 'vue-libs', 'lp-utils' ),
136 409 array( LP_COURSE_CPT ),
137 410 0,
138 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' )
139 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 + /*
140 450 'learn-press-admin-quiz-editor' => new LP_Asset_Key(
141 451 $this->url( 'js/dist/admin/editor/quiz' . self::$_min_assets . '.js' ),
142 - array( 'vue-libs' ),
452 + array( 'vue-libs', 'lp-utils' ),
143 453 array( LP_QUIZ_CPT ),
144 454 0,
145 455 0
146 - ),
456 + ),*/
457 + /*
147 458 'learn-press-admin-question-editor' => new LP_Asset_Key(
148 459 $this->url( 'js/dist/admin/editor/question' . self::$_min_assets . '.js' ),
149 - array( 'vue-libs', 'lodash' ),
460 + array( 'vue-libs', 'lodash', 'lp-utils' ),
150 461 array( LP_QUESTION_CPT ),
151 462 0,
152 463 0
153 - ),
464 + ),*/
465 + /*
154 466 'learn-press-meta-box-order' => new LP_Asset_Key(
155 467 $this->url( self::$_folder_source . 'js/admin/partial/meta-box-order' . self::$_min_assets . '.js' ),
156 468 array(
157 469 'vue-libs',
158 470 'advanced-list',
159 - 'lp-modal-search-courses',
160 - 'lp-modal-search-users',
471 + //'lp-modal-search-courses',
472 + //'lp-modal-search-users',
161 473 ),
162 474 array( LP_ORDER_CPT ),
163 475 0,
164 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' )
165 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 + /*
166 498 'learn-press-sync-data' => new LP_Asset_Key(
167 499 $this->url( 'js/dist/admin/pages/sync-data' . self::$_min_assets . '.js' ),
168 500 array(),
169 501 array( 'learnpress_page_learn-press-tools' ),
@@ -168,16 +500,17 @@
168 500 array(),
169 501 array( 'learnpress_page_learn-press-tools' ),
170 502 0,
171 503 1
172 - ),
173 - 'lp-setup' => new LP_Asset_Key(
174 - $this->url( 'js/dist/admin/pages/setup' . self::$_min_assets . '.js' ),
175 - array( 'jquery', 'lp-utils', 'dropdown-pages' ),
504 + ),*/
505 + 'lp-setup-wizard' => new LP_Asset_Key(
506 + $this->url( 'dist/js/admin/setup-wizard' . self::$_min_assets . '.js' ),
507 + [],
176 508 array( 'lp-page-setup' ),
177 509 0,
178 510 1
179 511 ),
512 + /*
180 513 'learn-press-statistic' => new LP_Asset_Key(
181 514 $this->url( 'js/dist/admin/pages/statistic' . self::$_min_assets . '.js' ),
182 515 array( 'jquery', 'jquery-ui-datepicker', 'chart' ),
183 516 array( 'learnpress_page_learn-press-statistics' ),
@@ -182,25 +515,10 @@
182 515 array( 'jquery', 'jquery-ui-datepicker', 'chart' ),
183 516 array( 'learnpress_page_learn-press-statistics' ),
184 517 0,
185 518 1
186 - ),
187 - 'lp-advertisement' => new LP_Asset_Key(
188 - $this->url( self::$_folder_source . 'js/admin/share/advertisement' . self::$_min_assets . '.js' ),
189 - array(),
190 - array(
191 - 'edit-' . LP_COURSE_CPT,
192 - 'edit-' . LP_QUESTION_CPT,
193 - 'edit-' . LP_LESSON_CPT,
194 - 'edit-' . LP_ORDER_CPT,
195 - 'edit-' . LP_QUIZ_CPT,
196 - 'learnpress_page_learn-press-settings',
197 - 'learnpress_page_learn-press-tools',
198 - 'learnpress_page_learn-press-statistics',
199 - ),
200 - 0,
201 - 1
202 - ),
519 + ),*/
520 + /*
203 521 'lp-modal-search-courses' => new LP_Asset_Key(
204 522 $this->url( self::$_folder_source . 'js/admin/share/modal-search-courses' . self::$_min_assets . '.js' ),
205 523 array(
206 524 'vue-libs',
@@ -208,23 +526,10 @@
208 526 ),
209 527 array( LP_ORDER_CPT ),
210 528 1,
211 529 1
212 - ),
213 - 'lp-admin-tabs' => new LP_Asset_Key(
214 - $this->url( self::$_folder_source . 'js/admin/share/admin-tabs' . self::$_min_assets . '.js' ),
215 - array( 'jquery' ),
216 - array( LP_COURSE_CPT ),
217 - 0,
218 - 1
219 - ),
220 - 'lp-admin-notice' => new LP_Asset_Key(
221 - $this->url( self::$_folder_source . 'js/admin/share/admin-notice' . self::$_min_assets . '.js' ),
222 - array( 'jquery' ),
223 - array(),
224 - 0,
225 - 1
226 - ),
530 + ),*/
531 + /*
227 532 'lp-modal-search-users' => new LP_Asset_Key(
228 533 $this->url( self::$_folder_source . 'js/admin/share/modal-search-users' . self::$_min_assets . '.js' ),
229 534 array( 'jquery' ),
230 535 array( LP_ORDER_CPT ),
@@ -229,56 +534,114 @@
229 534 array( 'jquery' ),
230 535 array( LP_ORDER_CPT ),
231 536 1,
232 537 1
233 - ),
234 - 'lp-tools-course-tab' => new LP_Asset_Key(
538 + ),*/
539 + 'lp-tools-course-tab' => new LP_Asset_Key(
235 540 $this->url( 'js/dist/admin/pages/tools' . self::$_min_assets . '.js' ),
236 - array(
237 - 'jquery',
238 - 'wp-element',
239 - 'wp-compose',
240 - 'wp-components',
241 - 'wp-data',
242 - 'wp-hooks',
243 - 'wp-api-fetch',
244 - 'lodash',
245 - 'vue-libs',
246 -
247 - ),
541 + [],
248 542 array( 'learnpress_page_learn-press-tools' ),
249 543 0,
250 - 1
544 + 1,
545 + '',
546 + array( 'strategy' => 'defer' )
251 547 ),
252 - 'lp-dashboard' => new LP_Asset_Key(
548 + /*
549 + 'lp-dashboard' => new LP_Asset_Key(
253 550 self::url( 'js/dist/admin/pages/dashboard' . self::$_min_assets . '.js' ),
254 - array(
255 - 'jquery',
256 - 'wp-element',
257 - 'wp-compose',
258 - 'wp-data',
259 - 'wp-hooks',
260 - 'wp-api-fetch',
261 - 'lodash',
262 - ),
551 + [],
263 552 array( 'dashboard' ),
264 553 0,
265 554 1
266 - ),
267 - 'lp-widgets-admin' => new LP_Asset_Key(
555 + ),*/
556 + 'lp-widgets-admin' => new LP_Asset_Key(
268 557 self::url( 'js/dist/admin/pages/widgets' . self::$_min_assets . '.js' ),
269 558 array(
270 559 'wp-url',
271 560 'wp-api-fetch',
272 561 'lodash',
562 + //'select2',
273 563 ),
274 564 array( 'widgets', 'elementor' ),
275 565 0,
276 566 1
277 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 + ),
278 623 )
279 624 );
280 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 +
281 644 return $scripts;
282 645 }
283 646
284 647 /**
@@ -291,35 +654,88 @@
291 654
292 655 return apply_filters(
293 656 'learn-press/admin-default-styles',
294 657 array(
295 - 'select2' => new LP_Asset_Key(
658 + /*'select2' => new LP_Asset_Key(
296 659 $this->url( 'src/css/vendor/select2.min.css' )
297 - ),
660 + ),*/
661 + /*
298 662 'font-awesome' => new LP_Asset_Key(
299 663 $this->url( 'src/css/vendor/font-awesome-5.min.css' )
300 - ),
664 + ),*/
665 + /*
301 666 'jquery-ui' => new LP_Asset_Key(
302 667 $this->url( 'src/css/vendor/jquery-ui/jquery-ui.min.css' )
303 668 ),
304 669 'jquery-ui-timepicker' => new LP_Asset_Key(
305 670 $this->url( 'src/css/vendor/jquery-ui-timepicker-addon.css' )
306 - ),
671 + ),*/
307 672 'jquery-tipsy' => new LP_Asset_Key(
308 673 $this->url( 'src/css/vendor/jquery.tipsy.css' )
309 674 ),
310 675 'learn-press-admin' => new LP_Asset_Key(
311 676 $this->url( 'css/admin/admin' . $is_rtl . self::$_min_assets . '.css' ),
312 - array( 'wp-color-picker', 'wp-components', 'select2', 'jquery-ui', 'jquery-ui-timepicker', 'font-awesome', 'jquery-tipsy' ),
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 + ),
313 686 array(),
314 687 0
315 688 ),
316 - 'learn-press-statistic' => new LP_Asset_Key(
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(
317 721 LP_CSS_URL . 'admin/statistic' . $is_rtl . self::$_min_assets . '.css',
318 722 array(),
319 723 array( 'learners_page_learn-press-statistics' ),
320 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
321 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 + ),
322 738 )
323 739 );
324 740 }
325 741
@@ -329,14 +745,13 @@
329 745 public function load_scripts() {
330 746 $screen_id = LP_Admin::instance()->get_screen_id();
331 747
332 748 if ( empty( $screen_id ) ) {
333 - return;
749 + $screen_id = '';
334 750 }
335 - wp_enqueue_media();
336 751
752 + // wp_enqueue_media(); //Todo: tungnx need check why call for that using.
337 753 $this->handle_js( $screen_id );
338 -
339 754 $this->handle_style( $screen_id );
340 755
341 756 do_action( 'learn-press/admin/after-enqueue-scripts' );
342 757 }
@@ -341,28 +756,96 @@
341 756 do_action( 'learn-press/admin/after-enqueue-scripts' );
342 757 }
343 758
344 759 /**
345 - * Register and enqueue a custom stylesheet in the WordPress admin.
346 - *
347 - * @author
348 - */
349 - public function wpdocs_enqueue_custom_admin_style() {
350 - wp_register_style( 'custom_wp_admin_css', get_template_directory_uri() . '/admin-style.css', false, '1.0.0' );
351 - wp_enqueue_style( 'custom_wp_admin_css' );
352 - }
353 -
354 - /**
355 760 * Show overlay
356 761 */
357 - public function show_overlay() {
762 + public function add_elements_global() {
358 763 echo '<div class="lp-overlay">';
359 764 apply_filters( 'learnpress/admin/modal-dialog', learn_press_get_template( 'global/lp-modal-overlay' ) );
360 765 echo '</div>';
361 766
362 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' );
363 771 }
364 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 + */
365 848 public static function instance() {
366 849 if ( ! is_admin() ) {
367 850 return null;
368 851 }
@@ -378,10 +861,9 @@
378 861 /**
379 862 * Shortcut function to get instance of LP_Admin_Assets
380 863 *
381 864 * @return LP_Admin_Assets|null
865 + * Addon Certificate, Import/Export is using.
382 866 */
383 867 function learn_press_admin_assets() {
384 868 return LP_Admin_Assets::instance();
385 869 }
386 -
387 -learn_press_admin_assets();