PluginProbe
LearnPress – WordPress LMS Plugin for Create and Sell Online Courses / 4.4.1
LearnPress – WordPress LMS Plugin for Create and Sell Online Courses v4.4.1
4.4.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 All 140 releases
learnpress / assets / js / dist / frontend / courses-v2.js

courses-v2.js in LearnPress – WordPress LMS Plugin for Create and Sell Online Courses 4.4.1, at assets/js/dist/frontend/courses-v2.js

811 lines 25.2 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 /******/ (() => { // webpackBootstrap
2 /******/ "use strict";
3 /******/ var __webpack_modules__ = ({
4
5 /***/ "./assets/src/js/api.js"
6 /*!******************************!*\
7 !*** ./assets/src/js/api.js ***!
8 \******************************/
9 (__unused_webpack_module, __webpack_exports__, __webpack_require__) {
10
11 __webpack_require__.r(__webpack_exports__);
12 /* harmony export */ __webpack_require__.d(__webpack_exports__, {
13 /* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__)
14 /* harmony export */ });
15 /**
16 * List API on backend
17 *
18 * @since 4.2.6
19 * @version 1.0.2
20 */
21
22 const lplistAPI = {};
23 let lp_rest_url;
24 if ('undefined' !== typeof lpDataAdmin) {
25 lp_rest_url = lpDataAdmin.lp_rest_url;
26 lplistAPI.admin = {
27 apiAdminNotice: lp_rest_url + 'lp/v1/admin/tools/admin-notices',
28 apiAddons: lp_rest_url + 'lp/v1/addon/all',
29 apiAddonAction: lp_rest_url + 'lp/v1/addon/action-n',
30 apiAddonsPurchase: lp_rest_url + 'lp/v1/addon/info-addons-purchase',
31 apiSearchCourses: lp_rest_url + 'lp/v1/admin/tools/search-course',
32 apiSearchUsers: lp_rest_url + 'lp/v1/admin/tools/search-user',
33 apiAssignUserCourse: lp_rest_url + 'lp/v1/admin/tools/assign-user-course',
34 apiUnAssignUserCourse: lp_rest_url + 'lp/v1/admin/tools/unassign-user-course'
35 };
36 }
37 if ('undefined' !== typeof lpData) {
38 lp_rest_url = lpData.lp_rest_url;
39 lplistAPI.frontend = {
40 apiWidgets: lp_rest_url + 'lp/v1/widgets/api',
41 apiCourses: lp_rest_url + 'lp/v1/courses/archive-course',
42 // Deprecated API, don't load from v4.3.7
43 apiAJAX: lp_rest_url + 'lp/v1/load_content_via_ajax/',
44 // Deprecated since 4.3.0
45 apiProfileCoverImage: lp_rest_url + 'lp/v1/profile/cover-image'
46 };
47 }
48 if (lp_rest_url) {
49 lplistAPI.apiCourses = lp_rest_url + 'lp/v1/courses/';
50 lplistAPI.apiEditCoursesArchiveBlock = lp_rest_url + 'lp/v1/courses/edit-archive-block';
51 lplistAPI.apiCoursesSuggest = lp_rest_url + 'lp/v1/courses/courses-suggest';
52 }
53 /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (lplistAPI);
54
55 /***/ },
56
57 /***/ "./assets/src/js/utils.js"
58 /*!********************************!*\
59 !*** ./assets/src/js/utils.js ***!
60 \********************************/
61 (__unused_webpack_module, __webpack_exports__, __webpack_require__) {
62
63 __webpack_require__.r(__webpack_exports__);
64 /* harmony export */ __webpack_require__.d(__webpack_exports__, {
65 /* harmony export */ debounce: () => (/* binding */ debounce),
66 /* harmony export */ eventHandlers: () => (/* binding */ eventHandlers),
67 /* harmony export */ getDataOfForm: () => (/* binding */ getDataOfForm),
68 /* harmony export */ getFieldKeysOfForm: () => (/* binding */ getFieldKeysOfForm),
69 /* harmony export */ listenElementCreated: () => (/* binding */ listenElementCreated),
70 /* harmony export */ listenElementViewed: () => (/* binding */ listenElementViewed),
71 /* harmony export */ lpAddQueryArgs: () => (/* binding */ lpAddQueryArgs),
72 /* harmony export */ lpAjaxParseJsonOld: () => (/* binding */ lpAjaxParseJsonOld),
73 /* harmony export */ lpClassName: () => (/* binding */ lpClassName),
74 /* harmony export */ lpFetchAPI: () => (/* binding */ lpFetchAPI),
75 /* harmony export */ lpGetCurrentURLNoParam: () => (/* binding */ lpGetCurrentURLNoParam),
76 /* harmony export */ lpOnElementReady: () => (/* binding */ lpOnElementReady),
77 /* harmony export */ lpSetLoadingEl: () => (/* binding */ lpSetLoadingEl),
78 /* harmony export */ lpShowHideEl: () => (/* binding */ lpShowHideEl),
79 /* harmony export */ mergeDataWithDatForm: () => (/* binding */ mergeDataWithDatForm),
80 /* harmony export */ toggleCollapse: () => (/* binding */ toggleCollapse)
81 /* harmony export */ });
82 /**
83 * Utils functions
84 *
85 * @param url
86 * @param data
87 * @param functions
88 * @since 4.2.5.1
89 * @version 1.0.6
90 */
91 const lpClassName = {
92 hidden: 'lp-hidden',
93 loading: 'loading',
94 elCollapse: 'lp-collapse',
95 elSectionToggle: '.lp-section-toggle',
96 elTriggerToggle: '.lp-trigger-toggle'
97 };
98 const lpFetchAPI = (url, data = {}, functions = {}) => {
99 if ('function' === typeof functions.before) {
100 functions.before();
101 }
102 fetch(url, {
103 method: 'GET',
104 ...data
105 }).then(response => response.json()).then(response => {
106 if ('function' === typeof functions.success) {
107 functions.success(response);
108 }
109 }).catch(err => {
110 if ('function' === typeof functions.error) {
111 functions.error(err);
112 }
113 }).finally(() => {
114 if ('function' === typeof functions.completed) {
115 functions.completed();
116 }
117 });
118 };
119
120 /**
121 * Get current URL without params.
122 *
123 * @since 4.2.5.1
124 */
125 const lpGetCurrentURLNoParam = () => {
126 let currentUrl = window.location.href;
127 const hasParams = currentUrl.includes('?');
128 if (hasParams) {
129 currentUrl = currentUrl.split('?')[0];
130 }
131 return currentUrl;
132 };
133 const lpAddQueryArgs = (endpoint, args) => {
134 const url = new URL(endpoint);
135 Object.keys(args).forEach(arg => {
136 url.searchParams.set(arg, args[arg]);
137 });
138 return url;
139 };
140
141 /**
142 * Listen element viewed.
143 *
144 * @param el
145 * @param callback
146 * @since 4.2.5.8
147 */
148 const listenElementViewed = (el, callback) => {
149 const observerSeeItem = new IntersectionObserver(function (entries) {
150 for (const entry of entries) {
151 if (entry.isIntersecting) {
152 callback(entry);
153 }
154 }
155 });
156 observerSeeItem.observe(el);
157 };
158
159 /**
160 * Listen element created.
161 *
162 * @param callback
163 * @since 4.2.5.8
164 */
165 const listenElementCreated = callback => {
166 const observerCreateItem = new MutationObserver(function (mutations) {
167 mutations.forEach(function (mutation) {
168 if (mutation.addedNodes) {
169 mutation.addedNodes.forEach(function (node) {
170 if (node.nodeType === 1) {
171 callback(node);
172 }
173 });
174 }
175 });
176 });
177 observerCreateItem.observe(document, {
178 childList: true,
179 subtree: true
180 });
181 // End.
182 };
183
184 /**
185 * Listen element created.
186 *
187 * @param selector
188 * @param callback
189 * @since 4.2.7.1
190 */
191 const lpOnElementReady = (selector, callback) => {
192 const element = document.querySelector(selector);
193 if (element) {
194 callback(element);
195 return;
196 }
197 const observer = new MutationObserver((mutations, obs) => {
198 const element = document.querySelector(selector);
199 if (element) {
200 obs.disconnect();
201 callback(element);
202 }
203 });
204 observer.observe(document.documentElement, {
205 childList: true,
206 subtree: true
207 });
208 };
209
210 // Parse JSON from string with content include LP_AJAX_START.
211 const lpAjaxParseJsonOld = data => {
212 if (typeof data !== 'string') {
213 return data;
214 }
215 const m = String.raw({
216 raw: data
217 }).match(/<-- LP_AJAX_START -->(.*)<-- LP_AJAX_END -->/s);
218 try {
219 if (m) {
220 data = JSON.parse(m[1].replace(/(?:\r\n|\r|\n)/g, ''));
221 } else {
222 data = JSON.parse(data);
223 }
224 } catch (e) {
225 data = {};
226 }
227 return data;
228 };
229
230 // status 0: hide, 1: show
231 const lpShowHideEl = (el, status = 0) => {
232 if (!el) {
233 return;
234 }
235 if (!status) {
236 el.classList.add(lpClassName.hidden);
237 } else {
238 el.classList.remove(lpClassName.hidden);
239 }
240 };
241
242 // status 0: hide, 1: show
243 const lpSetLoadingEl = (el, status) => {
244 if (!el) {
245 return;
246 }
247 if (!status) {
248 el.classList.remove(lpClassName.loading);
249 } else {
250 el.classList.add(lpClassName.loading);
251 }
252 };
253
254 // Toggle collapse section
255 const toggleCollapse = (e, target, elTriggerClassName = '', elsExclude = [], callback) => {
256 if (!elTriggerClassName) {
257 elTriggerClassName = lpClassName.elTriggerToggle;
258 }
259
260 // Exclude elements, which should not trigger the collapse toggle
261 if (elsExclude && elsExclude.length > 0) {
262 for (const elExclude of elsExclude) {
263 if (target.closest(elExclude)) {
264 return;
265 }
266 }
267 }
268 const elTrigger = target.closest(elTriggerClassName);
269 if (!elTrigger) {
270 return;
271 }
272
273 //console.log( 'elTrigger', elTrigger );
274
275 const elSectionToggle = elTrigger.closest(`${lpClassName.elSectionToggle}`);
276 if (!elSectionToggle) {
277 return;
278 }
279 elSectionToggle.classList.toggle(`${lpClassName.elCollapse}`);
280 if ('function' === typeof callback) {
281 callback(elSectionToggle);
282 }
283 };
284
285 // Get data of form
286 const getDataOfForm = form => {
287 const dataSend = {};
288 const formData = new FormData(form);
289 for (const pair of formData.entries()) {
290 const key = pair[0];
291 const value = formData.getAll(key);
292 if (!dataSend.hasOwnProperty(key)) {
293 // Convert value array to string.
294 dataSend[key] = value.join(',');
295 }
296 }
297 return dataSend;
298 };
299
300 // Get field keys of form
301 const getFieldKeysOfForm = form => {
302 const keys = [];
303 const elements = form.elements;
304 for (let i = 0; i < elements.length; i++) {
305 const name = elements[i].name;
306 if (name && !keys.includes(name)) {
307 keys.push(name);
308 }
309 }
310 return keys;
311 };
312
313 // Merge data handle with data form.
314 const mergeDataWithDatForm = (elForm, dataHandle) => {
315 const dataForm = getDataOfForm(elForm);
316 const keys = getFieldKeysOfForm(elForm);
317 keys.forEach(key => {
318 if (!dataForm.hasOwnProperty(key)) {
319 delete dataHandle[key];
320 } else if (dataForm[key][0] === '') {
321 delete dataForm[key];
322 delete dataHandle[key];
323 }
324 });
325 dataHandle = {
326 ...dataHandle,
327 ...dataForm
328 };
329 return dataHandle;
330 };
331
332 /**
333 * Event trigger
334 * For each list of event handlers, listen event on document.
335 *
336 * eventName: 'click', 'change', ...
337 * eventHandlers = [ { selector: '.lp-button', callBack: function(){}, class: object } ]
338 *
339 * @param eventName
340 * @param eventHandlers
341 */
342 const eventHandlers = (eventName, eventHandlers) => {
343 document.addEventListener(eventName, e => {
344 const target = e.target;
345 let args = {
346 e,
347 target
348 };
349 eventHandlers.forEach(eventHandler => {
350 args = {
351 ...args,
352 ...eventHandler
353 };
354
355 //console.log( args );
356
357 // Check condition before call back
358 if (eventHandler.conditionBeforeCallBack) {
359 if (eventHandler.conditionBeforeCallBack(args) !== true) {
360 return;
361 }
362 }
363
364 // Special check for keydown event with checkIsEventEnter = true
365 if (eventName === 'keydown' && eventHandler.checkIsEventEnter) {
366 if (e.key !== 'Enter') {
367 return;
368 }
369 }
370 if (target.closest(eventHandler.selector)) {
371 if (eventHandler.class) {
372 // Call method of class, function callBack will understand exactly {this} is class object.
373 eventHandler.class[eventHandler.callBack](args);
374 } else {
375 // For send args is objected, {this} is eventHandler object, not class object.
376 eventHandler.callBack(args);
377 }
378 }
379 });
380 });
381 };
382
383 /**
384 * Debounce - delays function execution until after `wait` ms of inactivity.
385 *
386 * Each call resets the timer. Only the last call in a burst executes.
387 *
388 * USE CASES:
389 * - Search inputs, form validation, window resize
390 * - Multiple elements need independent timers
391 * - When you need to call with different arguments
392 *
393 * EXAMPLES:
394 * const debouncedSearch = debounce( (query) => fetchResults(query), 300 );
395 * searchInput.addEventListener('input', (e) => debouncedSearch(e.target.value));
396 *
397 * const debouncedResize = debounce( recalculateLayout, 250 );
398 * window.addEventListener('resize', debouncedResize);
399 *
400 * ⚠️ Create ONCE outside event handlers, not inside.
401 *
402 * @param {Function} func - Function to debounce (can be anonymous)
403 * @param {number} wait - Milliseconds to wait (default: 500)
404 * @return {Function} Debounced wrapper function
405 * @since 4.3.7
406 * @version 1.0.0
407 */
408 const debounce = (func, wait = 500) => {
409 let timer;
410 return args => {
411 clearTimeout(timer);
412 timer = setTimeout(() => func(args), wait);
413 };
414 };
415
416 /***/ }
417
418 /******/ });
419 /************************************************************************/
420 /******/ // The module cache
421 /******/ const __webpack_module_cache__ = {};
422 /******/
423 /******/ // The require function
424 /******/ function __webpack_require__(moduleId) {
425 /******/ // Check if module is in cache
426 /******/ const cachedModule = __webpack_module_cache__[moduleId];
427 /******/ if (cachedModule !== undefined) {
428 /******/ return cachedModule.exports;
429 /******/ }
430 /******/ // Create a new module (and put it into the cache)
431 /******/ const module = __webpack_module_cache__[moduleId] = {
432 /******/ // no module.id needed
433 /******/ // no module.loaded needed
434 /******/ exports: {}
435 /******/ };
436 /******/
437 /******/ // Execute the module function
438 /******/ if (!(moduleId in __webpack_modules__)) {
439 /******/ delete __webpack_module_cache__[moduleId];
440 /******/ const e = new Error("Cannot find module '" + moduleId + "'");
441 /******/ e.code = 'MODULE_NOT_FOUND';
442 /******/ throw e;
443 /******/ }
444 /******/ __webpack_modules__[moduleId](module, module.exports, __webpack_require__);
445 /******/
446 /******/ // Return the exports of the module
447 /******/ return module.exports;
448 /******/ }
449 /******/
450 /************************************************************************/
451 /******/ /* webpack/runtime/define property getters */
452 /******/ (() => {
453 /******/ // define getter/value functions for harmony exports
454 /******/ __webpack_require__.d = (exports, definition) => {
455 /******/ if(Array.isArray(definition)) {
456 /******/ var i = 0;
457 /******/ while(i < definition.length) {
458 /******/ var key = definition[i++];
459 /******/ var binding = definition[i++];
460 /******/ if(!__webpack_require__.o(exports, key)) {
461 /******/ if(binding === 0) {
462 /******/ Object.defineProperty(exports, key, { enumerable: true, value: definition[i++] });
463 /******/ } else {
464 /******/ Object.defineProperty(exports, key, { enumerable: true, get: binding });
465 /******/ }
466 /******/ } else if(binding === 0) { i++; }
467 /******/ }
468 /******/ } else {
469 /******/ for(var key in definition) {
470 /******/ if(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {
471 /******/ Object.defineProperty(exports, key, { enumerable: true, get: definition[key] });
472 /******/ }
473 /******/ }
474 /******/ }
475 /******/ };
476 /******/ })();
477 /******/
478 /******/ /* webpack/runtime/hasOwnProperty shorthand */
479 /******/ (() => {
480 /******/ __webpack_require__.o = (obj, prop) => (Object.hasOwn(obj, prop))
481 /******/ })();
482 /******/
483 /******/ /* webpack/runtime/make namespace object */
484 /******/ (() => {
485 /******/ // define __esModule on exports
486 /******/ __webpack_require__.r = (exports) => {
487 /******/ if(Symbol.toStringTag) {
488 /******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
489 /******/ }
490 /******/ Object.defineProperty(exports, '__esModule', { value: true });
491 /******/ };
492 /******/ })();
493 /******/
494 /************************************************************************/
495 let __webpack_exports__ = {};
496 // This entry needs to be wrapped in an IIFE because it needs to be isolated against other modules in the chunk.
497 (() => {
498 /*!**********************************************!*\
499 !*** ./assets/src/js/frontend/courses-v2.js ***!
500 \**********************************************/
501 __webpack_require__.r(__webpack_exports__);
502 /* harmony import */ var _api__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../api */ "./assets/src/js/api.js");
503 /* harmony import */ var _utils_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../utils.js */ "./assets/src/js/utils.js");
504 /**
505 * Handle events for courses list.
506 *
507 * @since 4.2.5.8
508 * @version 1.0.1
509 */
510
511
512
513 if ('undefined' === typeof lpData) {
514 console.log('lpData is undefined');
515 }
516
517 // Events
518 document.addEventListener('change', function (e) {
519 const target = e.target;
520 window.lpCoursesList.onChangeSortBy(e, target);
521 window.lpCoursesList.onChangeTypeLayout(e, target);
522 });
523 document.addEventListener('click', function (e) {
524 const target = e.target;
525 window.lpCoursesList.LoadMore(e, target);
526 });
527 document.addEventListener('keyup', function (e) {
528 const target = e.target;
529 window.lpCoursesList.searchCourse(e, target);
530 });
531 document.addEventListener('submit', function (e) {
532 const target = e.target;
533
534 //window.lpCourseList.searchCourse( e, target );
535 });
536 (0,_utils_js__WEBPACK_IMPORTED_MODULE_1__.lpOnElementReady)('.course-filter-btn-mobile', function (el) {
537 const widgetCourseFilter = document.querySelector('.widget_course_filter');
538 if (!widgetCourseFilter) {
539 el.remove();
540 }
541 });
542 let timeOutSearch;
543 window.lpCoursesList = (() => {
544 const classListCourse = '.lp-list-courses-no-css';
545 const classLPTarget = '.lp-target';
546 const classLoadMore = 'courses-btn-load-more-no-css';
547 const classPageResult = '.courses-page-result';
548 const classLoading = '.lp-loading-no-css';
549 const urlCurrent = (0,_utils_js__WEBPACK_IMPORTED_MODULE_1__.lpGetCurrentURLNoParam)();
550 return {
551 LoadMore: (e, target) => {
552 const btnLoadMore = target.closest(`.${classLoadMore + ':not(.disabled)'}`);
553 if (!btnLoadMore) {
554 return;
555 }
556 const elLPTarget = btnLoadMore.closest(`${classLPTarget}`);
557 if (!elLPTarget) {
558 return;
559 }
560 e.preventDefault();
561 btnLoadMore.classList.add('disabled');
562 const elLoading = btnLoadMore.querySelector(classLoading);
563 const dataObj = JSON.parse(elLPTarget.dataset.send);
564 const dataSend = {
565 ...dataObj
566 };
567 if (!dataSend.args.hasOwnProperty('paged')) {
568 dataSend.args.paged = 1;
569 }
570 dataSend.args.paged++;
571 elLPTarget.dataset.send = JSON.stringify(dataSend);
572 if (elLoading) {
573 elLoading.classList.remove('hide');
574 }
575 const callBack = {
576 success: response => {
577 const {
578 status,
579 message,
580 data
581 } = response;
582 const paged = parseInt(data.paged);
583 const totalPages = parseInt(data.total_pages);
584 const newEl = document.createElement('div');
585 newEl.innerHTML = data.content || '';
586 const elListCourse = elLPTarget.querySelector(classListCourse);
587 const elPageResult = elLPTarget.querySelector(classPageResult);
588 const elPageResultNew = newEl.querySelector(classPageResult);
589 elListCourse.insertAdjacentHTML('beforeend', newEl.querySelector(classListCourse).innerHTML);
590 if (elPageResult && elPageResultNew) {
591 elPageResult.innerHTML = elPageResultNew.innerHTML;
592 }
593 if (paged >= totalPages) {
594 btnLoadMore.remove();
595 }
596 },
597 error: error => {
598 console.log(error);
599 },
600 completed: () => {
601 //console.log( 'completed' );
602 if (elLoading) {
603 elLoading.classList.add('hide');
604 }
605 btnLoadMore.classList.remove('disabled');
606 }
607 };
608 window.lpAJAXG.fetchAJAX(dataSend, callBack);
609 },
610 LoadInfinite: () => {
611 // When see element, will call API to load more items.
612 const callBackAfterSeeItem = entry => {
613 const elInfinite = entry.target;
614 const elLoading = elInfinite.querySelector(`${classLoading}:not(.disabled)`);
615 if (!elLoading) {
616 return;
617 }
618 elLoading.classList.remove('hide');
619 elLoading.classList.add('disabled');
620 const elLPTarget = elInfinite.closest(classLPTarget);
621 if (!elLPTarget) {
622 return;
623 }
624 const dataObj = JSON.parse(elLPTarget.dataset.send);
625 const dataSend = {
626 ...dataObj
627 }; // Clone object
628
629 if (!dataSend.args.hasOwnProperty('paged')) {
630 dataSend.args.paged = 1;
631 }
632
633 // Handle set data send to call API
634 dataSend.args.paged++;
635 elLPTarget.dataset.send = JSON.stringify(dataSend);
636 const callBack = {
637 success: response => {
638 const {
639 status,
640 message,
641 data
642 } = response;
643 const newEl = document.createElement('div');
644 newEl.innerHTML = data.content || '';
645 const elListCourse = elLPTarget.querySelector(classListCourse);
646 const elPageResult = elLPTarget.querySelector(classPageResult);
647 const elPageResultNew = newEl.querySelector(classPageResult);
648 elListCourse.insertAdjacentHTML('beforeend', newEl.querySelector(classListCourse).innerHTML);
649 if (elPageResult && elPageResultNew) {
650 elPageResult.innerHTML = elPageResultNew.innerHTML;
651 }
652 if (data.total_pages === data.paged) {
653 elInfinite.remove();
654 }
655 },
656 error: error => {
657 console.log(error);
658 },
659 completed: () => {
660 //console.log( 'completed' );
661 elLoading.classList.add('hide');
662 elLoading.classList.remove('disabled');
663 }
664 };
665 window.lpAJAXG.fetchAJAX(dataSend, callBack);
666 };
667
668 // Listen el courses load infinite have just created.
669 (0,_utils_js__WEBPACK_IMPORTED_MODULE_1__.listenElementCreated)(node => {
670 if (node.classList.contains('courses-load-infinite-no-css')) {
671 (0,_utils_js__WEBPACK_IMPORTED_MODULE_1__.listenElementViewed)(node, callBackAfterSeeItem);
672 } else if (node.classList.contains('wp-block-learnpress-list-courses')) {
673 // For block Gutenberg
674 const elInfinite = node.querySelector('.courses-load-infinite-no-css');
675 if (elInfinite) {
676 (0,_utils_js__WEBPACK_IMPORTED_MODULE_1__.listenElementViewed)(elInfinite, callBackAfterSeeItem);
677 }
678 }
679 });
680
681 // If el created on DOMContentLoaded.
682 const elInfinite = document.querySelector('.courses-load-infinite-no-css');
683 if (elInfinite) {
684 (0,_utils_js__WEBPACK_IMPORTED_MODULE_1__.listenElementViewed)(elInfinite, callBackAfterSeeItem);
685 }
686 },
687 onChangeSortBy: (e, target) => {
688 if (!target.classList.contains('courses-order-by')) {
689 return;
690 }
691 const elLPTarget = target.closest(classLPTarget);
692 if (!elLPTarget) {
693 lpData.urlParams.paged = 1;
694 lpData.urlParams.order_by = target.value || '';
695 window.location.href = (0,_utils_js__WEBPACK_IMPORTED_MODULE_1__.lpAddQueryArgs)(urlCurrent, lpData.urlParams);
696 return;
697 }
698 e.preventDefault();
699 const dataObj = JSON.parse(elLPTarget.dataset.send);
700 const dataSend = {
701 ...dataObj
702 };
703 dataSend.args.paged = 1;
704 dataSend.args.order_by = target.value || '';
705 elLPTarget.dataset.send = JSON.stringify(dataSend);
706
707 // Set url params to reload page.
708 // Todo: need check allow set url params.
709 lpData.urlParams.paged = dataSend.args.paged;
710 lpData.urlParams.order_by = dataSend.args.order_by;
711 window.history.pushState({}, '', (0,_utils_js__WEBPACK_IMPORTED_MODULE_1__.lpAddQueryArgs)(urlCurrent, lpData.urlParams));
712 // End.
713
714 // Show loading
715 window.lpAJAXG.showHideLoading(elLPTarget, 1);
716 // End
717
718 const callBack = {
719 success: response => {
720 //console.log( 'response', response );
721 const {
722 status,
723 message,
724 data
725 } = response;
726 elLPTarget.innerHTML = data.content || '';
727 },
728 error: error => {
729 console.log(error);
730 },
731 completed: () => {
732 //console.log( 'completed' );
733 window.lpAJAXG.showHideLoading(elLPTarget, 0);
734 }
735 };
736 window.lpAJAXG.fetchAJAX(dataSend, callBack);
737 },
738 onChangeTypeLayout: (e, target) => {
739 if ('lp-switch-layout-btn' !== target.getAttribute('name')) {
740 return;
741 }
742 const elListCourse = document.querySelector(classListCourse);
743 if (!elListCourse) {
744 return;
745 }
746 e.preventDefault();
747 const layout = target.value;
748 if (layout) {
749 elListCourse.dataset.layout = layout;
750 window.wpCookies.set('courses-layout', layout, 24 * 60 * 60, '/');
751 }
752 },
753 searchCourse: (e, target) => {
754 if ('c_search' !== target.name) {
755 return;
756 }
757 const elLPTarget = target.closest(classLPTarget);
758 if (!elLPTarget) {
759 return;
760 }
761 e.preventDefault();
762 const dataObj = JSON.parse(elLPTarget.dataset.send);
763 const dataSend = {
764 ...dataObj
765 };
766 const keyword = target.value;
767 dataSend.args.c_search = keyword || '';
768 dataSend.args.paged = 1;
769 elLPTarget.dataset.send = JSON.stringify(dataSend);
770
771 // Set url params to reload page.
772 // Todo: need check allow set url params.
773 lpData.urlParams.paged = dataSend.args.paged;
774 lpData.urlParams.c_search = dataSend.args.c_search;
775 window.history.pushState({}, '', (0,_utils_js__WEBPACK_IMPORTED_MODULE_1__.lpAddQueryArgs)((0,_utils_js__WEBPACK_IMPORTED_MODULE_1__.lpGetCurrentURLNoParam)(), lpData.urlParams));
776 // End.
777
778 if (!keyword || keyword && keyword.length > 2) {
779 if (undefined !== timeOutSearch) {
780 clearTimeout(timeOutSearch);
781 }
782 timeOutSearch = setTimeout(function () {
783 const callBack = {
784 success: response => {
785 //console.log( 'response', response );
786 const {
787 status,
788 message,
789 data
790 } = response;
791 elLPTarget.innerHTML = data.content || '';
792 },
793 error: error => {
794 console.log(error);
795 },
796 completed: () => {
797 //console.log( 'completed' );
798 }
799 };
800 window.lpAJAXG.fetchAJAX(dataSend, callBack);
801 }, 800);
802 }
803 }
804 };
805 })();
806 window.lpCoursesList.LoadInfinite();
807 })();
808
809 /******/ })()
810 ;
811 //# sourceMappingURL=courses-v2.js.map