PluginProbe
LearnPress – WordPress LMS Plugin for Create and Sell Online Courses / 4.1.6.9
LearnPress – WordPress LMS Plugin for Create and Sell Online Courses v4.1.6.9
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 / assets / js / dist / frontend / single-course.js

single-course.js in LearnPress – WordPress LMS Plugin for Create and Sell Online Courses 4.1.6.9, at assets/js/dist/frontend/single-course.js

1,284 lines 43.0 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 /******/ (function() { // webpackBootstrap
2 /******/ var __webpack_modules__ = ({
3
4 /***/ "./assets/src/apps/js/frontend/show-lp-overlay-complete-item.js":
5 /*!**********************************************************************!*\
6 !*** ./assets/src/apps/js/frontend/show-lp-overlay-complete-item.js ***!
7 \**********************************************************************/
8 /***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
9
10 "use strict";
11 __webpack_require__.r(__webpack_exports__);
12 /* harmony import */ var _utils_lp_modal_overlay__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../utils/lp-modal-overlay */ "./assets/src/apps/js/utils/lp-modal-overlay.js");
13
14 const lpModalOverlayCompleteItem = {
15 elBtnFinishCourse: null,
16 elBtnCompleteItem: null,
17
18 init() {
19 if (!_utils_lp_modal_overlay__WEBPACK_IMPORTED_MODULE_0__["default"].init()) {
20 return;
21 }
22
23 if (undefined === lpGlobalSettings || 'yes' !== lpGlobalSettings.option_enable_popup_confirm_finish) {
24 return;
25 }
26
27 this.elBtnFinishCourse = document.querySelectorAll('.lp-btn-finish-course');
28 this.elBtnCompleteItem = document.querySelector('.lp-btn-complete-item');
29
30 if (this.elBtnCompleteItem) {
31 this.elBtnCompleteItem.addEventListener('click', e => {
32 e.preventDefault();
33 const form = e.target.closest('form');
34 _utils_lp_modal_overlay__WEBPACK_IMPORTED_MODULE_0__["default"].elLPOverlay.show();
35 _utils_lp_modal_overlay__WEBPACK_IMPORTED_MODULE_0__["default"].setTitleModal(form.dataset.title);
36 _utils_lp_modal_overlay__WEBPACK_IMPORTED_MODULE_0__["default"].setContentModal('<div class="pd-2em">' + form.dataset.confirm + '</div>');
37
38 _utils_lp_modal_overlay__WEBPACK_IMPORTED_MODULE_0__["default"].callBackYes = () => {
39 form.submit();
40 };
41 });
42 }
43
44 if (this.elBtnFinishCourse) {
45 this.elBtnFinishCourse.forEach(element => element.addEventListener('click', e => {
46 e.preventDefault();
47 const form = e.target.closest('form');
48 _utils_lp_modal_overlay__WEBPACK_IMPORTED_MODULE_0__["default"].elLPOverlay.show();
49 _utils_lp_modal_overlay__WEBPACK_IMPORTED_MODULE_0__["default"].setTitleModal(form.dataset.title);
50 _utils_lp_modal_overlay__WEBPACK_IMPORTED_MODULE_0__["default"].setContentModal('<div class="pd-2em">' + form.dataset.confirm + '</div>');
51
52 _utils_lp_modal_overlay__WEBPACK_IMPORTED_MODULE_0__["default"].callBackYes = () => {
53 form.submit();
54 };
55 }));
56 }
57 }
58
59 };
60 /* harmony default export */ __webpack_exports__["default"] = (lpModalOverlayCompleteItem);
61
62 /***/ }),
63
64 /***/ "./assets/src/apps/js/frontend/single-course/index.js":
65 /*!************************************************************!*\
66 !*** ./assets/src/apps/js/frontend/single-course/index.js ***!
67 \************************************************************/
68 /***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
69
70 "use strict";
71 __webpack_require__.r(__webpack_exports__);
72 /* harmony import */ var _wordpress_element__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @wordpress/element */ "@wordpress/element");
73 /* harmony import */ var _wordpress_element__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_wordpress_element__WEBPACK_IMPORTED_MODULE_0__);
74 /* harmony import */ var _learnpress_quiz__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @learnpress/quiz */ "@learnpress/quiz");
75 /* harmony import */ var _learnpress_quiz__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_learnpress_quiz__WEBPACK_IMPORTED_MODULE_1__);
76 /* harmony import */ var _store__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./store */ "./assets/src/apps/js/frontend/single-course/store/index.js");
77 /* harmony import */ var _store__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_store__WEBPACK_IMPORTED_MODULE_2__);
78 /* harmony import */ var _single_curriculum_components_sidebar__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../single-curriculum/components/sidebar */ "./assets/src/apps/js/frontend/single-curriculum/components/sidebar.js");
79
80
81
82
83 // Use toggle in Curriculum tab.
84
85 class SingleCourse extends _wordpress_element__WEBPACK_IMPORTED_MODULE_0__.Component {
86 render() {
87 return (0,_wordpress_element__WEBPACK_IMPORTED_MODULE_0__.createElement)(_wordpress_element__WEBPACK_IMPORTED_MODULE_0__.Fragment, null);
88 }
89
90 }
91
92 /* harmony default export */ __webpack_exports__["default"] = (SingleCourse);
93
94 function run() {
95 (0,_single_curriculum_components_sidebar__WEBPACK_IMPORTED_MODULE_3__.Sidebar)();
96 }
97
98 document.addEventListener('DOMContentLoaded', () => {
99 run();
100 });
101
102 /***/ }),
103
104 /***/ "./assets/src/apps/js/frontend/single-course/store/index.js":
105 /*!******************************************************************!*\
106 !*** ./assets/src/apps/js/frontend/single-course/store/index.js ***!
107 \******************************************************************/
108 /***/ (function() {
109
110 /**
111 * Created by tu on 9/19/19.
112 */
113
114 /***/ }),
115
116 /***/ "./assets/src/apps/js/frontend/single-curriculum/components/search.js":
117 /*!****************************************************************************!*\
118 !*** ./assets/src/apps/js/frontend/single-curriculum/components/search.js ***!
119 \****************************************************************************/
120 /***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
121
122 "use strict";
123 __webpack_require__.r(__webpack_exports__);
124 /* harmony export */ __webpack_require__.d(__webpack_exports__, {
125 /* harmony export */ "searchCourseContent": function() { return /* binding */ searchCourseContent; }
126 /* harmony export */ });
127 const searchCourseContent = () => {
128 const popup = document.querySelector('#popup-course');
129 const list = document.querySelector('#learn-press-course-curriculum');
130
131 if (popup && list) {
132 const items = list.querySelector('.curriculum-sections');
133 const form = popup.querySelector('.search-course');
134 const search = popup.querySelector('.search-course input[type="text"]');
135
136 if (!search || !items || !form) {
137 return;
138 }
139
140 const sections = items.querySelectorAll('li.section');
141 const dataItems = items.querySelectorAll('li.course-item');
142 const dataSearch = [];
143 dataItems.forEach(item => {
144 const itemID = item.dataset.id;
145 const name = item.querySelector('.item-name');
146 dataSearch.push({
147 id: itemID,
148 name: name ? name.textContent.toLowerCase() : ''
149 });
150 });
151
152 const submit = event => {
153 event.preventDefault();
154 const inputVal = search.value;
155 form.classList.add('searching');
156
157 if (!inputVal) {
158 form.classList.remove('searching');
159 }
160
161 const outputs = [];
162 dataSearch.forEach(i => {
163 if (!inputVal || i.name.match(inputVal.toLowerCase())) {
164 outputs.push(i.id);
165 dataItems.forEach(c => {
166 if (outputs.indexOf(c.dataset.id) !== -1) {
167 c.classList.remove('hide-if-js');
168 } else {
169 c.classList.add('hide-if-js');
170 }
171 });
172 }
173 });
174 sections.forEach(section => {
175 const listItem = section.querySelectorAll('.course-item');
176 const isTrue = [];
177 listItem.forEach(a => {
178 if (outputs.includes(a.dataset.id)) {
179 isTrue.push(a.dataset.id);
180 }
181 });
182
183 if (isTrue.length === 0) {
184 section.classList.add('hide-if-js');
185 } else {
186 section.classList.remove('hide-if-js');
187 }
188 });
189 };
190
191 const clear = form.querySelector('.clear');
192
193 if (clear) {
194 clear.addEventListener('click', e => {
195 e.preventDefault();
196 search.value = '';
197 submit(e);
198 });
199 }
200
201 form.addEventListener('submit', submit);
202 search.addEventListener('keyup', submit);
203 }
204 };
205
206 /***/ }),
207
208 /***/ "./assets/src/apps/js/frontend/single-curriculum/components/sidebar.js":
209 /*!*****************************************************************************!*\
210 !*** ./assets/src/apps/js/frontend/single-curriculum/components/sidebar.js ***!
211 \*****************************************************************************/
212 /***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
213
214 "use strict";
215 __webpack_require__.r(__webpack_exports__);
216 /* harmony export */ __webpack_require__.d(__webpack_exports__, {
217 /* harmony export */ "Sidebar": function() { return /* binding */ Sidebar; }
218 /* harmony export */ });
219 const $ = jQuery;
220 const {
221 throttle
222 } = lodash;
223 const Sidebar = () => {
224 // Tungnx - Show/hide sidebar curriculumn
225 const elSidebarToggle = document.querySelector('#sidebar-toggle'); // For style of theme
226
227 const toggleSidebar = toggle => {
228 $('body').removeClass('lp-sidebar-toggle__open');
229 $('body').removeClass('lp-sidebar-toggle__close');
230
231 if (toggle) {
232 $('body').addClass('lp-sidebar-toggle__close');
233 } else {
234 $('body').addClass('lp-sidebar-toggle__open');
235 }
236 }; // For lp and theme
237
238
239 if (elSidebarToggle) {
240 if ($(window).innerWidth() <= 768) {
241 elSidebarToggle.setAttribute('checked', 'checked');
242 } else if (LP.Cookies.get('sidebar-toggle')) {
243 elSidebarToggle.setAttribute('checked', 'checked');
244 } else {
245 elSidebarToggle.removeAttribute('checked');
246 }
247
248 document.querySelector('#popup-course').addEventListener('click', e => {
249 if (e.target.id === 'sidebar-toggle') {
250 LP.Cookies.set('sidebar-toggle', e.target.checked ? true : false);
251 toggleSidebar(LP.Cookies.get('sidebar-toggle'));
252 }
253 });
254 } // End editor by tungnx
255
256
257 const $curriculum = $('#learn-press-course-curriculum');
258 $curriculum.find('.section-desc').each((i, el) => {
259 const a = $('<span class="show-desc"></span>').on('click', () => {
260 b.toggleClass('c');
261 });
262 const b = $(el).siblings('.section-title').append(a);
263 });
264 $('.section').each(function () {
265 const $section = $(this),
266 $toggle = $section.find('.section-left');
267 $toggle.on('click', function () {
268 const isClose = $section.toggleClass('closed').hasClass('closed');
269 const sections = LP.Cookies.get('closed-section-' + lpGlobalSettings.post_id) || [];
270 const sectionId = parseInt($section.data('section-id'));
271 const at = sections.findIndex(id => {
272 return id == sectionId;
273 });
274
275 if (isClose) {
276 sections.push(parseInt($section.data('section-id')));
277 } else {
278 sections.splice(at, 1);
279 }
280
281 LP.Cookies.remove('closed-section-(.*)');
282 LP.Cookies.set('closed-section-' + lpGlobalSettings.post_id, [...new Set(sections)]);
283 });
284 });
285 };
286
287 /***/ }),
288
289 /***/ "./assets/src/apps/js/frontend/single-curriculum/scrolltoitem.js":
290 /*!***********************************************************************!*\
291 !*** ./assets/src/apps/js/frontend/single-curriculum/scrolltoitem.js ***!
292 \***********************************************************************/
293 /***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
294
295 "use strict";
296 __webpack_require__.r(__webpack_exports__);
297 /* harmony import */ var _utils_lp_modal_overlay__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../utils/lp-modal-overlay */ "./assets/src/apps/js/utils/lp-modal-overlay.js");
298
299 const $ = jQuery;
300 const scrollToItemCurrent = {
301 init() {
302 this.scrollToItemViewing = function () {
303 const elItemViewing = $('.viewing-course-item');
304
305 if (elItemViewing.length) {
306 const elCourseCurriculumn = $('#learn-press-course-curriculum');
307 const heightCourseItemContentHeader = $('#popup-sidebar').outerHeight();
308 const heightSectionTitle = $('.section-title').outerHeight();
309 const heightSectionHeader = $('.section-header').outerHeight();
310 const regex = new RegExp('^viewing-course-item-([0-9].*)');
311 const classList = elItemViewing.attr('class');
312 const classArr = classList.split(/\s+/);
313 let idItem = 0;
314 $.each(classArr, function (i, className) {
315 const compare = regex.exec(className);
316
317 if (compare) {
318 idItem = compare[1];
319 return false;
320 }
321 });
322
323 if (0 === idItem) {
324 return;
325 }
326
327 const elItemCurrent = $('.course-item-' + idItem);
328 const offSetTop = elItemCurrent.offset().top;
329 const offset = elItemCurrent.offset().top - elCourseCurriculumn.offset().top + elCourseCurriculumn.scrollTop();
330 elCourseCurriculumn.animate({
331 scrollTop: LP.Hook.applyFilters('scroll-item-current', offset - heightSectionHeader)
332 }, 800);
333 }
334 };
335
336 this.scrollToItemViewing();
337 }
338
339 };
340 /* harmony default export */ __webpack_exports__["default"] = (scrollToItemCurrent);
341
342 /***/ }),
343
344 /***/ "./assets/src/apps/js/frontend/single-curriculum/skeleton.js":
345 /*!*******************************************************************!*\
346 !*** ./assets/src/apps/js/frontend/single-curriculum/skeleton.js ***!
347 \*******************************************************************/
348 /***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
349
350 "use strict";
351 __webpack_require__.r(__webpack_exports__);
352 /* harmony export */ __webpack_require__.d(__webpack_exports__, {
353 /* harmony export */ "default": function() { return /* binding */ courseCurriculumSkeleton; }
354 /* harmony export */ });
355 /* harmony import */ var _wordpress_url__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @wordpress/url */ "@wordpress/url");
356 /* harmony import */ var _wordpress_url__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_wordpress_url__WEBPACK_IMPORTED_MODULE_0__);
357 /* harmony import */ var _wordpress_api_fetch__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @wordpress/api-fetch */ "@wordpress/api-fetch");
358 /* harmony import */ var _wordpress_api_fetch__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_wordpress_api_fetch__WEBPACK_IMPORTED_MODULE_1__);
359 /* harmony import */ var _scrolltoitem__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./scrolltoitem */ "./assets/src/apps/js/frontend/single-curriculum/scrolltoitem.js");
360 /* harmony import */ var _components_search__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./components/search */ "./assets/src/apps/js/frontend/single-curriculum/components/search.js");
361 // Rest API load content in Tab Curriculum - Nhamdv.
362
363
364
365
366 function courseCurriculumSkeleton() {
367 let courseID = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '';
368
369 const Sekeleton = () => {
370 const elementCurriculum = document.querySelector('.learnpress-course-curriculum');
371
372 if (!elementCurriculum) {
373 return;
374 }
375
376 getResponse(elementCurriculum);
377 };
378
379 const getResponse = async ele => {
380 const skeleton = ele.querySelector('.lp-skeleton-animation');
381 const itemID = ele.dataset.id;
382 const sectionID = ele.dataset.section;
383
384 try {
385 const page = 1;
386 const response = await _wordpress_api_fetch__WEBPACK_IMPORTED_MODULE_1___default()({
387 path: (0,_wordpress_url__WEBPACK_IMPORTED_MODULE_0__.addQueryArgs)('lp/v1/lazy-load/course-curriculum', {
388 courseId: courseID || lpGlobalSettings.post_id || '',
389 page,
390 sectionID: sectionID || ''
391 }),
392 method: 'GET'
393 });
394 const {
395 data,
396 status,
397 message
398 } = response;
399 let section_ids = data.section_ids;
400
401 if (status === 'error') {
402 throw new Error(message || 'Error');
403 }
404
405 let returnData = data.content;
406
407 if (undefined === returnData) {
408 // For old Eduma <= 4.6.0
409 returnData = data;
410 section_ids = response.section_ids;
411 }
412
413 if (sectionID) {
414 if (section_ids && !section_ids.includes(sectionID)) {
415 const response2 = await getResponsive('', page + 1, sectionID);
416
417 if (response2) {
418 const {
419 data2,
420 pages2,
421 page2
422 } = response2;
423 await parseContentItems({
424 ele,
425 returnData,
426 sectionID,
427 itemID,
428 data2,
429 pages2,
430 page2
431 });
432 }
433 } else {
434 await parseContentItems({
435 ele,
436 returnData,
437 sectionID,
438 itemID
439 });
440 }
441 } else {
442 returnData && ele.insertAdjacentHTML('beforeend', returnData);
443 }
444 } catch (error) {
445 ele.insertAdjacentHTML('beforeend', `<div class="lp-ajax-message error" style="display:block">${error.message || 'Error: Query lp/v1/lazy-load/course-curriculum'}</div>`);
446 }
447
448 skeleton && skeleton.remove();
449 (0,_components_search__WEBPACK_IMPORTED_MODULE_3__.searchCourseContent)();
450 };
451
452 const parseContentItems = async _ref => {
453 let {
454 ele,
455 returnData,
456 sectionID,
457 itemID,
458 data2,
459 pages2,
460 page2
461 } = _ref;
462 const parser = new DOMParser();
463 const doc = parser.parseFromString(returnData, 'text/html');
464
465 if (data2) {
466 const sections = doc.querySelector('.curriculum-sections');
467 const loadMoreBtn = doc.querySelector('.curriculum-more__button');
468
469 if (loadMoreBtn) {
470 if (pages2 <= page2) {
471 loadMoreBtn.remove();
472 } else {
473 loadMoreBtn.dataset.page = page2;
474 }
475 }
476
477 sections.insertAdjacentHTML('beforeend', data2);
478 }
479
480 const section = doc.querySelector(`[data-section-id="${sectionID}"]`);
481
482 if (section) {
483 const items = section.querySelectorAll('.course-item');
484 const item_ids = [...items].map(item => item.dataset.id);
485 const sectionContent = section.querySelector('.section-content');
486 const itemLoadMore = section.querySelector('.section-item__loadmore');
487
488 if (itemID && !item_ids.includes(itemID)) {
489 const responseItem = await getResponsiveItem('', 2, sectionID, itemID);
490 const {
491 data3,
492 pages3,
493 paged3,
494 page
495 } = responseItem;
496
497 if (pages3 <= paged3 || pages3 <= page) {
498 itemLoadMore.remove();
499 } else {
500 itemLoadMore.dataset.page = page;
501 }
502
503 if (data3 && sectionContent) {
504 sectionContent.insertAdjacentHTML('beforeend', data3);
505 }
506 }
507 }
508
509 ele.insertAdjacentHTML('beforeend', doc.body.innerHTML);
510 _scrolltoitem__WEBPACK_IMPORTED_MODULE_2__["default"].init();
511 };
512
513 const getResponsiveItem = async (returnData, paged, sectionID, itemID) => {
514 const response = await _wordpress_api_fetch__WEBPACK_IMPORTED_MODULE_1___default()({
515 path: (0,_wordpress_url__WEBPACK_IMPORTED_MODULE_0__.addQueryArgs)('lp/v1/lazy-load/course-curriculum-items', {
516 sectionId: sectionID || '',
517 page: paged
518 }),
519 method: 'GET'
520 });
521 const {
522 data,
523 status,
524 pages,
525 message
526 } = response;
527 const {
528 page
529 } = data;
530 let item_ids;
531
532 if (status === 'success') {
533 let dataTmp = data.content;
534 item_ids = data.item_ids;
535
536 if (undefined === dataTmp) {
537 // For old Eduma <= 4.6.0
538 dataTmp = data;
539 item_ids = response.item_ids;
540 }
541
542 returnData += dataTmp;
543
544 if (sectionID && item_ids && itemID && !item_ids.includes(itemID)) {
545 return getResponsiveItem(returnData, paged + 1, sectionID, itemID);
546 }
547 }
548
549 return {
550 data3: returnData,
551 pages3: pages || data.pages,
552 status3: status,
553 message3: message,
554 page: page || 0
555 };
556 };
557
558 const getResponsive = async (returnData, page, sectionID) => {
559 const response = await _wordpress_api_fetch__WEBPACK_IMPORTED_MODULE_1___default()({
560 path: (0,_wordpress_url__WEBPACK_IMPORTED_MODULE_0__.addQueryArgs)('lp/v1/lazy-load/course-curriculum', {
561 courseId: courseID || lpGlobalSettings.post_id || '',
562 page,
563 sectionID: sectionID || '',
564 loadMore: true
565 }),
566 method: 'GET'
567 });
568 const {
569 data,
570 status,
571 message
572 } = response;
573 let returnDataTmp = data.content;
574 let section_ids = data.section_ids;
575 let pages = data.pages;
576
577 if (undefined === returnDataTmp) {
578 // For old Eduma <= 4.6.0
579 returnDataTmp = data;
580 section_ids = response.section_ids;
581 pages = response.pages;
582 }
583
584 if (status === 'success') {
585 returnData += returnDataTmp;
586
587 if (sectionID && section_ids && section_ids.length > 0 && !section_ids.includes(sectionID)) {
588 return getResponsive(returnData, page + 1, sectionID);
589 }
590 }
591
592 return {
593 data2: returnData,
594 pages2: pages || data.pages,
595 page2: page,
596 status2: status,
597 message2: message
598 };
599 };
600
601 Sekeleton();
602 document.addEventListener('click', e => {
603 const sectionBtns = document.querySelectorAll('.section-item__loadmore');
604 [...sectionBtns].map(async sectionBtn => {
605 if (sectionBtn.contains(e.target)) {
606 const sectionItem = sectionBtn.parentNode;
607 const sectionId = sectionItem.getAttribute('data-section-id');
608 const sectionContent = sectionItem.querySelector('.section-content');
609 const paged = parseInt(sectionBtn.dataset.page);
610 sectionBtn.classList.add('loading');
611
612 try {
613 const response = await getResponsiveItem('', paged + 1, sectionId, '');
614 const {
615 data3,
616 pages3,
617 status3,
618 message3
619 } = response;
620
621 if (status3 === 'error') {
622 throw new Error(message3 || 'Error');
623 }
624
625 if (pages3 <= paged + 1) {
626 sectionBtn.remove();
627 } else {
628 sectionBtn.dataset.page = paged + 1;
629 }
630
631 sectionContent.insertAdjacentHTML('beforeend', data3);
632 } catch (e) {
633 sectionContent.insertAdjacentHTML('beforeend', `<div class="lp-ajax-message error" style="display:block">${e.message || 'Error: Query lp/v1/lazy-load/course-curriculum'}</div>`);
634 }
635
636 sectionBtn.classList.remove('loading');
637 (0,_components_search__WEBPACK_IMPORTED_MODULE_3__.searchCourseContent)();
638 }
639 }); // Load more Sections
640
641 const moreSections = document.querySelectorAll('.curriculum-more__button');
642 [...moreSections].map(async moreSection => {
643 if (moreSection.contains(e.target)) {
644 const paged = parseInt(moreSection.dataset.page);
645 const sections = moreSection.parentNode.parentNode.querySelector('.curriculum-sections');
646
647 if (paged && sections) {
648 moreSection.classList.add('loading');
649
650 try {
651 const response2 = await getResponsive('', paged + 1, '');
652 const {
653 data2,
654 pages2,
655 status2,
656 message2
657 } = response2;
658
659 if (status2 === 'error') {
660 throw new Error(message2 || 'Error');
661 }
662
663 if (pages2 <= paged + 1) {
664 moreSection.remove();
665 } else {
666 moreSection.dataset.page = paged + 1;
667 }
668
669 sections.insertAdjacentHTML('beforeend', data2);
670 } catch (e) {
671 sections.insertAdjacentHTML('beforeend', `<div class="lp-ajax-message error" style="display:block">${e.message || 'Error: Query lp/v1/lazy-load/course-curriculum'}</div>`);
672 }
673
674 moreSection.classList.remove('loading');
675 (0,_components_search__WEBPACK_IMPORTED_MODULE_3__.searchCourseContent)();
676 }
677 }
678 }); // Show/Hide accordion
679
680 if (document.querySelector('.learnpress-course-curriculum')) {
681 const sections = document.querySelectorAll('.section');
682 [...sections].map(section => {
683 if (section.contains(e.target)) {
684 const toggle = section.querySelector('.section-left');
685 toggle.contains(e.target) && section.classList.toggle('closed');
686 }
687 });
688 }
689 });
690 }
691
692 /***/ }),
693
694 /***/ "./assets/src/apps/js/utils/lp-modal-overlay.js":
695 /*!******************************************************!*\
696 !*** ./assets/src/apps/js/utils/lp-modal-overlay.js ***!
697 \******************************************************/
698 /***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
699
700 "use strict";
701 __webpack_require__.r(__webpack_exports__);
702 const $ = jQuery;
703 let elLPOverlay = null;
704 const lpModalOverlay = {
705 elLPOverlay: null,
706 elMainContent: null,
707 elTitle: null,
708 elBtnYes: null,
709 elBtnNo: null,
710 elFooter: null,
711 elCalledModal: null,
712 callBackYes: null,
713 instance: null,
714
715 init() {
716 if (this.instance) {
717 return true;
718 }
719
720 this.elLPOverlay = $('.lp-overlay');
721
722 if (!this.elLPOverlay.length) {
723 return false;
724 }
725
726 elLPOverlay = this.elLPOverlay;
727 this.elMainContent = elLPOverlay.find('.main-content');
728 this.elTitle = elLPOverlay.find('.modal-title');
729 this.elBtnYes = elLPOverlay.find('.btn-yes');
730 this.elBtnNo = elLPOverlay.find('.btn-no');
731 this.elFooter = elLPOverlay.find('.lp-modal-footer');
732 $(document).on('click', '.close, .btn-no', function () {
733 elLPOverlay.hide();
734 });
735 $(document).on('click', '.btn-yes', function (e) {
736 e.preventDefault();
737 e.stopPropagation();
738
739 if ('function' === typeof lpModalOverlay.callBackYes) {
740 lpModalOverlay.callBackYes();
741 }
742 });
743 this.instance = this;
744 return true;
745 },
746
747 setElCalledModal(elCalledModal) {
748 this.elCalledModal = elCalledModal;
749 },
750
751 setContentModal(content, event) {
752 this.elMainContent.html(content);
753
754 if ('function' === typeof event) {
755 event();
756 }
757 },
758
759 setTitleModal(content) {
760 this.elTitle.html(content);
761 }
762
763 };
764 /* harmony default export */ __webpack_exports__["default"] = (lpModalOverlay);
765
766 /***/ }),
767
768 /***/ "@learnpress/quiz":
769 /*!******************************!*\
770 !*** external ["LP","quiz"] ***!
771 \******************************/
772 /***/ (function(module) {
773
774 "use strict";
775 module.exports = window["LP"]["quiz"];
776
777 /***/ }),
778
779 /***/ "@wordpress/api-fetch":
780 /*!**********************************!*\
781 !*** external ["wp","apiFetch"] ***!
782 \**********************************/
783 /***/ (function(module) {
784
785 "use strict";
786 module.exports = window["wp"]["apiFetch"];
787
788 /***/ }),
789
790 /***/ "@wordpress/element":
791 /*!*********************************!*\
792 !*** external ["wp","element"] ***!
793 \*********************************/
794 /***/ (function(module) {
795
796 "use strict";
797 module.exports = window["wp"]["element"];
798
799 /***/ }),
800
801 /***/ "@wordpress/url":
802 /*!*****************************!*\
803 !*** external ["wp","url"] ***!
804 \*****************************/
805 /***/ (function(module) {
806
807 "use strict";
808 module.exports = window["wp"]["url"];
809
810 /***/ })
811
812 /******/ });
813 /************************************************************************/
814 /******/ // The module cache
815 /******/ var __webpack_module_cache__ = {};
816 /******/
817 /******/ // The require function
818 /******/ function __webpack_require__(moduleId) {
819 /******/ // Check if module is in cache
820 /******/ var cachedModule = __webpack_module_cache__[moduleId];
821 /******/ if (cachedModule !== undefined) {
822 /******/ return cachedModule.exports;
823 /******/ }
824 /******/ // Create a new module (and put it into the cache)
825 /******/ var module = __webpack_module_cache__[moduleId] = {
826 /******/ // no module.id needed
827 /******/ // no module.loaded needed
828 /******/ exports: {}
829 /******/ };
830 /******/
831 /******/ // Execute the module function
832 /******/ __webpack_modules__[moduleId](module, module.exports, __webpack_require__);
833 /******/
834 /******/ // Return the exports of the module
835 /******/ return module.exports;
836 /******/ }
837 /******/
838 /************************************************************************/
839 /******/ /* webpack/runtime/compat get default export */
840 /******/ !function() {
841 /******/ // getDefaultExport function for compatibility with non-harmony modules
842 /******/ __webpack_require__.n = function(module) {
843 /******/ var getter = module && module.__esModule ?
844 /******/ function() { return module['default']; } :
845 /******/ function() { return module; };
846 /******/ __webpack_require__.d(getter, { a: getter });
847 /******/ return getter;
848 /******/ };
849 /******/ }();
850 /******/
851 /******/ /* webpack/runtime/define property getters */
852 /******/ !function() {
853 /******/ // define getter functions for harmony exports
854 /******/ __webpack_require__.d = function(exports, definition) {
855 /******/ for(var key in definition) {
856 /******/ if(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {
857 /******/ Object.defineProperty(exports, key, { enumerable: true, get: definition[key] });
858 /******/ }
859 /******/ }
860 /******/ };
861 /******/ }();
862 /******/
863 /******/ /* webpack/runtime/hasOwnProperty shorthand */
864 /******/ !function() {
865 /******/ __webpack_require__.o = function(obj, prop) { return Object.prototype.hasOwnProperty.call(obj, prop); }
866 /******/ }();
867 /******/
868 /******/ /* webpack/runtime/make namespace object */
869 /******/ !function() {
870 /******/ // define __esModule on exports
871 /******/ __webpack_require__.r = function(exports) {
872 /******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) {
873 /******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
874 /******/ }
875 /******/ Object.defineProperty(exports, '__esModule', { value: true });
876 /******/ };
877 /******/ }();
878 /******/
879 /************************************************************************/
880 var __webpack_exports__ = {};
881 // This entry need to be wrapped in an IIFE because it need to be in strict mode.
882 !function() {
883 "use strict";
884 /*!******************************************************!*\
885 !*** ./assets/src/apps/js/frontend/single-course.js ***!
886 \******************************************************/
887 __webpack_require__.r(__webpack_exports__);
888 /* harmony export */ __webpack_require__.d(__webpack_exports__, {
889 /* harmony export */ "enrollCourse": function() { return /* binding */ enrollCourse; },
890 /* harmony export */ "init": function() { return /* binding */ init; },
891 /* harmony export */ "initCourseSidebar": function() { return /* binding */ initCourseSidebar; },
892 /* harmony export */ "initCourseTabs": function() { return /* binding */ initCourseTabs; }
893 /* harmony export */ });
894 /* harmony import */ var _wordpress_element__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @wordpress/element */ "@wordpress/element");
895 /* harmony import */ var _wordpress_element__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_wordpress_element__WEBPACK_IMPORTED_MODULE_0__);
896 /* harmony import */ var _single_course_index__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./single-course/index */ "./assets/src/apps/js/frontend/single-course/index.js");
897 /* harmony import */ var _wordpress_url__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @wordpress/url */ "@wordpress/url");
898 /* harmony import */ var _wordpress_url__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_wordpress_url__WEBPACK_IMPORTED_MODULE_2__);
899 /* harmony import */ var _show_lp_overlay_complete_item__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./show-lp-overlay-complete-item */ "./assets/src/apps/js/frontend/show-lp-overlay-complete-item.js");
900 /* harmony import */ var _utils_lp_modal_overlay__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../utils/lp-modal-overlay */ "./assets/src/apps/js/utils/lp-modal-overlay.js");
901 /* harmony import */ var _single_curriculum_skeleton__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./single-curriculum/skeleton */ "./assets/src/apps/js/frontend/single-curriculum/skeleton.js");
902
903
904
905
906
907
908 /* harmony default export */ __webpack_exports__["default"] = (_single_course_index__WEBPACK_IMPORTED_MODULE_1__["default"]);
909 const init = () => {
910 wp.element.render((0,_wordpress_element__WEBPACK_IMPORTED_MODULE_0__.createElement)(_single_course_index__WEBPACK_IMPORTED_MODULE_1__["default"], null));
911 };
912 const $ = jQuery;
913
914 const initCourseTabs = function () {
915 $('#learn-press-course-tabs').on('change', 'input[name="learn-press-course-tab-radio"]', function (e) {
916 const selectedTab = $('input[name="learn-press-course-tab-radio"]:checked').val();
917 LP.Cookies.set('course-tab', selectedTab);
918 $('label[for="' + $(e.target).attr('id') + '"]').closest('li').addClass('active').siblings().removeClass('active');
919 });
920 };
921
922 const initCourseSidebar = function initCourseSidebar() {
923 const $sidebar = $('.course-summary-sidebar');
924
925 if (!$sidebar.length) {
926 return;
927 }
928
929 const $window = $(window);
930 const $scrollable = $sidebar.children();
931 const offset = $sidebar.offset();
932 let scrollTop = 0;
933 const maxHeight = $sidebar.height();
934 const scrollHeight = $scrollable.height();
935 const options = {
936 offsetTop: 32
937 };
938
939 const onScroll = function () {
940 scrollTop = $window.scrollTop();
941 const top = scrollTop - offset.top + options.offsetTop;
942
943 if (top < 0) {
944 $sidebar.removeClass('slide-top slide-down');
945 $scrollable.css('top', '');
946 return;
947 }
948
949 if (top > maxHeight - scrollHeight) {
950 $sidebar.removeClass('slide-down').addClass('slide-top');
951 $scrollable.css('top', maxHeight - scrollHeight);
952 } else {
953 $sidebar.removeClass('slide-top').addClass('slide-down');
954 $scrollable.css('top', options.offsetTop);
955 }
956 };
957
958 $window.on('scroll.fixed-course-sidebar', onScroll).trigger('scroll.fixed-course-sidebar');
959 }; // Rest API Enroll course - Nhamdv.
960
961
962 const enrollCourse = () => {
963 const formEnrolls = document.querySelectorAll('form.enroll-course');
964
965 if (formEnrolls.length > 0) {
966 formEnrolls.forEach(formEnroll => {
967 const submit = async (id, btnEnroll) => {
968 try {
969 const response = await wp.apiFetch({
970 path: 'lp/v1/courses/enroll-course',
971 method: 'POST',
972 data: {
973 id
974 }
975 });
976 btnEnroll.classList.remove('loading');
977 btnEnroll.disabled = false;
978 const {
979 status,
980 data: {
981 redirect
982 },
983 message
984 } = response;
985
986 if (message && status) {
987 btnEnroll.style.display = 'none';
988 formEnroll.innerHTML += `<div class="lp-enroll-notice ${status}">${message}</div>`;
989
990 if (redirect) {
991 window.location.href = redirect;
992 }
993 }
994 } catch (error) {
995 form.innerHTML += `<div class="lp-enroll-notice error">${error.message && error.message}</div>`;
996 }
997 };
998
999 formEnroll.addEventListener('submit', event => {
1000 event.preventDefault();
1001 const id = formEnroll.querySelector('input[name=enroll-course]').value;
1002 const btnEnroll = formEnroll.querySelector('button.button-enroll-course');
1003 btnEnroll.classList.add('loading');
1004 btnEnroll.disabled = true;
1005 submit(id, btnEnroll);
1006 });
1007 });
1008 } // Reload when press back button in chrome.
1009
1010
1011 if (document.querySelector('.course-detail-info') !== null) {
1012 window.addEventListener('pageshow', event => {
1013 const hasCache = event.persisted || typeof window.performance != 'undefined' && String(window.performance.getEntriesByType('navigation')[0].type) == 'back_forward';
1014
1015 if (hasCache) {
1016 location.reload();
1017 }
1018 });
1019 }
1020 }; // Rest API purchase course - Nhamdv.
1021
1022
1023 const purchaseCourse = () => {
1024 const forms = document.querySelectorAll('form.purchase-course');
1025
1026 if (forms.length > 0) {
1027 forms.forEach(form => {
1028 // Allow Repurchase.
1029 const allowRepurchase = () => {
1030 const continueRepurchases = document.querySelectorAll('.lp_allow_repuchase_select');
1031 continueRepurchases.forEach(repurchase => {
1032 const radios = repurchase.querySelectorAll('[name=_lp_allow_repurchase_type]');
1033
1034 for (let i = 0, length = radios.length; i < length; i++) {
1035 if (radios[i].checked) {
1036 const repurchaseType = radios[i].value;
1037 const id = form.querySelector('input[name=purchase-course]').value;
1038 const btnBuynow = form.querySelector('button.button-purchase-course');
1039 btnBuynow.classList.add('loading');
1040 btnBuynow.disabled = true;
1041 submit(id, btnBuynow, repurchaseType);
1042 break;
1043 }
1044 }
1045 });
1046 };
1047
1048 const submit = async function (id, btn) {
1049 let repurchaseType = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;
1050
1051 try {
1052 const response = await wp.apiFetch({
1053 path: 'lp/v1/courses/purchase-course',
1054 method: 'POST',
1055 data: {
1056 id,
1057 repurchaseType
1058 }
1059 });
1060
1061 if (btn) {
1062 btn.classList.remove('loading');
1063 btn.disabled = false;
1064 }
1065
1066 const {
1067 status,
1068 data: {
1069 redirect,
1070 type,
1071 html,
1072 titlePopup
1073 },
1074 message
1075 } = response;
1076
1077 if (type === 'allow_repurchase' && status === 'success') {
1078 if (!form.querySelector('.lp_allow_repuchase_select')) {
1079 if (!_utils_lp_modal_overlay__WEBPACK_IMPORTED_MODULE_4__["default"].init()) {
1080 return;
1081 }
1082
1083 _utils_lp_modal_overlay__WEBPACK_IMPORTED_MODULE_4__["default"].elLPOverlay.show();
1084 _utils_lp_modal_overlay__WEBPACK_IMPORTED_MODULE_4__["default"].setTitleModal(titlePopup || '');
1085 _utils_lp_modal_overlay__WEBPACK_IMPORTED_MODULE_4__["default"].setContentModal(html);
1086
1087 _utils_lp_modal_overlay__WEBPACK_IMPORTED_MODULE_4__["default"].callBackYes = () => {
1088 _utils_lp_modal_overlay__WEBPACK_IMPORTED_MODULE_4__["default"].elLPOverlay.hide();
1089 allowRepurchase();
1090 };
1091 }
1092 } else if (message && status) {
1093 form.innerHTML += `<div class="lp-enroll-notice ${status}">${message}</div>`;
1094
1095 if ('success' === status && redirect) {
1096 window.location.href = redirect;
1097 }
1098 }
1099 } catch (error) {
1100 form.innerHTML += `<div class="lp-enroll-notice error">${error.message && error.message}</div>`;
1101 }
1102 };
1103
1104 form.addEventListener('submit', event => {
1105 event.preventDefault();
1106 const id = form.querySelector('input[name=purchase-course]').value;
1107 const btn = form.querySelector('button.button-purchase-course');
1108 btn.classList.add('loading');
1109 btn.disabled = true;
1110 submit(id, btn);
1111 });
1112 });
1113 }
1114 };
1115
1116 const retakeCourse = () => {
1117 const elFormRetakeCourses = document.querySelectorAll('.lp-form-retake-course');
1118
1119 if (!elFormRetakeCourses.length) {
1120 return;
1121 }
1122
1123 elFormRetakeCourses.forEach(elFormRetakeCourse => {
1124 const elButtonRetakeCourses = elFormRetakeCourse.querySelector('.button-retake-course');
1125 const elCourseId = elFormRetakeCourse.querySelector('[name=retake-course]').value;
1126 const elAjaxMessage = elFormRetakeCourse.querySelector('.lp-ajax-message');
1127
1128 const submit = elButtonRetakeCourse => {
1129 wp.apiFetch({
1130 path: '/lp/v1/courses/retake-course',
1131 method: 'POST',
1132 data: {
1133 id: elCourseId
1134 }
1135 }).then(res => {
1136 const {
1137 status,
1138 message,
1139 data
1140 } = res;
1141 elAjaxMessage.innerHTML = message;
1142
1143 if (undefined != status && status === 'success') {
1144 elButtonRetakeCourse.style.display = 'none';
1145 setTimeout(() => {
1146 window.location.replace(data.url_redirect);
1147 }, 1000);
1148 } else {
1149 elAjaxMessage.classList.add('error');
1150 }
1151 }).catch(err => {
1152 elAjaxMessage.classList.add('error');
1153 elAjaxMessage.innerHTML = 'error: ' + err.message;
1154 }).then(() => {
1155 elButtonRetakeCourse.classList.remove('loading');
1156 elButtonRetakeCourse.disabled = false;
1157 elAjaxMessage.style.display = 'block';
1158 });
1159 };
1160
1161 elFormRetakeCourse.addEventListener('submit', e => {
1162 e.preventDefault();
1163 });
1164 elButtonRetakeCourses.addEventListener('click', e => {
1165 e.preventDefault();
1166 elButtonRetakeCourses.classList.add('loading');
1167 elButtonRetakeCourses.disabled = true;
1168 submit(elButtonRetakeCourses);
1169 });
1170 });
1171 }; // Rest API load content course progress - Nhamdv.
1172
1173
1174 const courseProgress = () => {
1175 const elements = document.querySelectorAll('.lp-course-progress-wrapper');
1176
1177 if (!elements.length) {
1178 return;
1179 }
1180
1181 if ('IntersectionObserver' in window) {
1182 const eleObserver = new IntersectionObserver((entries, observer) => {
1183 entries.forEach(entry => {
1184 if (entry.isIntersecting) {
1185 const ele = entry.target;
1186 setTimeout(function () {
1187 getResponse(ele);
1188 }, 600);
1189 eleObserver.unobserve(ele);
1190 }
1191 });
1192 });
1193 [...elements].map(ele => eleObserver.observe(ele));
1194 }
1195
1196 const getResponse = async ele => {
1197 const response = await wp.apiFetch({
1198 path: 'lp/v1/lazy-load/course-progress',
1199 method: 'POST',
1200 data: {
1201 courseId: lpGlobalSettings.post_id || '',
1202 userId: lpGlobalSettings.user_id || ''
1203 }
1204 });
1205 const {
1206 data
1207 } = response;
1208 ele.innerHTML = data;
1209 };
1210 };
1211
1212 const accordionExtraTab = () => {
1213 const elements = document.querySelectorAll('.course-extra-box');
1214 [...elements].map(ele => {
1215 const title = ele.querySelector('.course-extra-box__title');
1216 title.addEventListener('click', () => {
1217 const panel = title.nextElementSibling;
1218 const eleActive = document.querySelector('.course-extra-box.active');
1219
1220 if (eleActive && !ele.classList.contains('active')) {
1221 eleActive.classList.remove('active');
1222 eleActive.querySelector('.course-extra-box__content').style.display = 'none';
1223 }
1224
1225 if (!ele.classList.contains('active')) {
1226 ele.classList.add('active');
1227 panel.style.display = 'block';
1228 } else {
1229 ele.classList.remove('active');
1230 panel.style.display = 'none';
1231 }
1232 });
1233 });
1234 };
1235
1236 const courseContinue = () => {
1237 const formContinue = document.querySelector('form.continue-course');
1238
1239 if (formContinue != null) {
1240 const getResponse = async ele => {
1241 const response = await wp.apiFetch({
1242 path: 'lp/v1/courses/continue-course',
1243 method: 'POST',
1244 data: {
1245 courseId: lpGlobalSettings.post_id || '',
1246 userId: lpGlobalSettings.user_id || ''
1247 }
1248 });
1249 return response;
1250 };
1251
1252 getResponse(formContinue).then(function (result) {
1253 if (result.status === 'success') {
1254 formContinue.style.display = 'block';
1255 formContinue.action = result.data;
1256 }
1257 });
1258 }
1259 };
1260
1261
1262 $(window).on('load', () => {
1263 const $popup = $('#popup-course');
1264 let timerClearScroll;
1265 const $curriculum = $('#learn-press-course-curriculum');
1266 accordionExtraTab();
1267 initCourseTabs();
1268 initCourseSidebar();
1269 enrollCourse();
1270 purchaseCourse();
1271 retakeCourse();
1272 courseProgress();
1273 courseContinue();
1274 _show_lp_overlay_complete_item__WEBPACK_IMPORTED_MODULE_3__["default"].init();
1275 (0,_single_curriculum_skeleton__WEBPACK_IMPORTED_MODULE_5__["default"])();
1276 }); // Add callback for Thimkits
1277
1278 LP.Hook.addAction('lp_course_curriculum_skeleton', function (id) {
1279 (0,_single_curriculum_skeleton__WEBPACK_IMPORTED_MODULE_5__["default"])(id);
1280 });
1281 }();
1282 /******/ })()
1283 ;
1284 //# sourceMappingURL=single-course.js.map