PluginProbe
LearnPress – WordPress LMS Plugin for Create and Sell Online Courses / 4.4.9.1
LearnPress – WordPress LMS Plugin for Create and Sell Online Courses v4.4.9.1
4.4.9.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 All 141 releases
← All changes | assets/js/dist/loadAJAX.js +187 -25 4.4.1 → 4.4.9.1 View file →
@@ -11,8 +11,9 @@
11 11 __webpack_require__.r(__webpack_exports__);
12 12 /* harmony export */ __webpack_require__.d(__webpack_exports__, {
13 13 /* harmony export */ debounce: () => (/* binding */ debounce),
14 14 /* harmony export */ eventHandlers: () => (/* binding */ eventHandlers),
15 +/* harmony export */ fullScreenView: () => (/* binding */ fullScreenView),
15 16 /* harmony export */ getDataOfForm: () => (/* binding */ getDataOfForm),
16 17 /* harmony export */ getFieldKeysOfForm: () => (/* binding */ getFieldKeysOfForm),
17 18 /* harmony export */ listenElementCreated: () => (/* binding */ listenElementCreated),
18 19 /* harmony export */ listenElementViewed: () => (/* binding */ listenElementViewed),
@@ -24,9 +25,10 @@
24 25 /* harmony export */ lpOnElementReady: () => (/* binding */ lpOnElementReady),
25 26 /* harmony export */ lpSetLoadingEl: () => (/* binding */ lpSetLoadingEl),
26 27 /* harmony export */ lpShowHideEl: () => (/* binding */ lpShowHideEl),
27 28 /* harmony export */ mergeDataWithDatForm: () => (/* binding */ mergeDataWithDatForm),
28 -/* harmony export */ toggleCollapse: () => (/* binding */ toggleCollapse)
29 +/* harmony export */ toggleCollapse: () => (/* binding */ toggleCollapse),
30 +/* harmony export */ toggleEnable: () => (/* binding */ toggleEnable)
29 31 /* harmony export */ });
30 32 /**
31 33 * Utils functions
32 34 *
@@ -33,9 +35,9 @@
33 35 * @param url
34 36 * @param data
35 37 * @param functions
36 38 * @since 4.2.5.1
37 - * @version 1.0.6
39 + * @version 1.0.7
38 40 */
39 41 const lpClassName = {
40 42 hidden: 'lp-hidden',
41 43 loading: 'loading',
@@ -40,9 +42,12 @@
40 42 hidden: 'lp-hidden',
41 43 loading: 'loading',
42 44 elCollapse: 'lp-collapse',
43 45 elSectionToggle: '.lp-section-toggle',
44 - elTriggerToggle: '.lp-trigger-toggle'
46 + elTriggerToggle: '.lp-trigger-toggle',
47 + elBtnFullScreen: '.lp-btn-full-screen-view',
48 + elFullScreen: 'lp-full-screen-view',
49 + elBtnFullScreenClose: 'lp-full-screen-view__close'
45 50 };
46 51 const lpFetchAPI = (url, data = {}, functions = {}) => {
47 52 if ('function' === typeof functions.before) {
48 53 functions.before();
@@ -360,8 +365,141 @@
360 365 timer = setTimeout(() => func(args), wait);
361 366 };
362 367 };
363 368
369 +/**
370 + * Initialize lp-toggle-enable components.
371 + *
372 + * Finds all `.lp-toggle-enable` elements and wires up toggle behavior.
373 + * Reads initial state from `data-enabled` attribute ("true"/"false").
374 + * Calls `data-on-toggle` callback (if provided via options) on state change.
375 + *
376 + * HTML structure:
377 + * <label class="lp-toggle-enable" data-enabled="true">
378 + * <input type="checkbox" class="lp-toggle-enable__input" />
379 + * <span class="lp-toggle-enable__track"></span>
380 + * </label>
381 + *
382 + * @param {string} selector CSS selector for toggle elements (default: '.lp-toggle-enable')
383 + * @param {Function} onToggle Optional callback( el, isEnabled ) called on state change
384 + * @since 4.4.5
385 + * @version 1.0.0
386 + */
387 +window.lpToggleEnableInit = 0;
388 +const toggleEnable = (onToggle = null) => {
389 + if (window.lpToggleEnableInit) {
390 + return;
391 + }
392 + window.lpToggleEnableInit = 1;
393 + const selector = '.lp-toggle-enable';
394 + const updateUI = (toggle, isEnabled) => {
395 + toggle.classList.toggle('is-enabled', isEnabled);
396 + const input = toggle.querySelector('.lp-toggle-enable__input');
397 + if (input) {
398 + input.checked = isEnabled;
399 + input.value = isEnabled ? '1' : '0';
400 + }
401 + };
402 +
403 + // Delegate click handling via eventHandlers.
404 + eventHandlers('click', [{
405 + selector,
406 + callBack: args => {
407 + const {
408 + e,
409 + target
410 + } = args;
411 + const toggle = target.closest(selector);
412 + if (!toggle || toggle.classList.contains('is-disabled')) {
413 + return;
414 + }
415 + e.preventDefault();
416 + const isEnabled = !toggle.classList.contains('is-enabled');
417 + updateUI(toggle, isEnabled);
418 + if ('function' === typeof onToggle) {
419 + onToggle(toggle, isEnabled);
420 + }
421 + }
422 + }]);
423 +};
424 +
425 +/**
426 + * Initialize custom fullscreen view buttons.
427 + *
428 + * Delegates clicks on `.lp-btn-full-screen-view` buttons to
429 + * `lpToggleFullscreenView`. Reads the `data-target` attribute to find the
430 + * target element. Falls back to the button's parent element when
431 + * `data-target` is not provided.
432 + *
433 + * @since 4.4.5
434 + * @version 1.0.0
435 + */
436 +window.lpFullScreenViewInit = 0;
437 +const fullScreenView = () => {
438 + if (window.lpFullScreenViewInit) {
439 + return;
440 + }
441 + window.lpFullScreenViewInit = 1;
442 + let lastScrollY = 0;
443 + const lpToggleFullscreenView = (elTarget, elBtnFullScreen = null) => {
444 + const isFullscreen = elTarget.classList.contains(lpClassName.elFullScreen);
445 + if (isFullscreen) {
446 + elTarget.classList.remove(lpClassName.elFullScreen);
447 + document.documentElement.classList.remove('lp-full-screen-active');
448 + window.scrollTo(0, lastScrollY);
449 + } else {
450 + lastScrollY = window.scrollY;
451 + elTarget.classList.add(lpClassName.elFullScreen);
452 + document.documentElement.classList.add('lp-full-screen-active');
453 + }
454 + if (!isFullscreen) {
455 + if (!elTarget.querySelector(`.${lpClassName.elBtnFullScreenClose}`)) {
456 + const closeButton = document.createElement('button');
457 + closeButton.type = 'button';
458 + closeButton.className = lpClassName.elBtnFullScreenClose;
459 + closeButton.setAttribute('aria-label', 'Close');
460 + closeButton.innerHTML = lpData.i18n.closeButtonFullScreen || 'Close &times;';
461 + closeButton.addEventListener('click', e => {
462 + e.preventDefault();
463 + lpToggleFullscreenView(elTarget);
464 + });
465 + elTarget.appendChild(closeButton);
466 + }
467 + } else {
468 + const closeButton = elTarget.querySelector(`.${lpClassName.elBtnFullScreenClose}`);
469 + if (closeButton) {
470 + closeButton.remove();
471 + }
472 + }
473 + };
474 + eventHandlers('click', [{
475 + selector: lpClassName.elBtnFullScreen,
476 + callBack: args => {
477 + const {
478 + e,
479 + target
480 + } = args;
481 + const elBtnFullScreen = target.closest(lpClassName.elBtnFullScreen);
482 + if (!elBtnFullScreen) {
483 + console.log('No full screen button found');
484 + return;
485 + }
486 + e.preventDefault();
487 + let elTarget = null;
488 + const targetSelector = elBtnFullScreen.dataset.targetFullscreen;
489 + console.log(targetSelector);
490 + if (targetSelector) {
491 + elTarget = document.querySelector(targetSelector);
492 + }
493 + if (!elTarget) {
494 + console.log('No target element found');
495 + return;
496 + }
497 + lpToggleFullscreenView(elTarget, elBtnFullScreen);
498 + }
499 + }]);
500 +};
501 +
364 502 /***/ }
365 503
366 504 /******/ });
367 505 /************************************************************************/
@@ -449,14 +587,14 @@
449 587 __webpack_require__.r(__webpack_exports__);
450 588 /* harmony export */ __webpack_require__.d(__webpack_exports__, {
451 589 /* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__)
452 590 /* harmony export */ });
453 -/* harmony import */ var _utils_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./utils.js */ "./assets/src/js/utils.js");
591 +/* harmony import */ var lpAssetsJsPath_utils_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! lpAssetsJsPath/utils.js */ "./assets/src/js/utils.js");
454 592 /**
455 593 * Load all you need via AJAX
456 594 *
457 595 * @since 4.2.5.7
458 - * @version 1.1.0
596 + * @version 1.1.1
459 597 */
460 598
461 599
462 600
@@ -470,9 +608,9 @@
470 608 // End Handle general parameter in the Frontend and Backend
471 609
472 610 const lpAJAX = () => {
473 611 const classLPTarget = '.lp-target';
474 - const urlCurrent = (0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.lpGetCurrentURLNoParam)();
612 + const urlCurrent = lpAssetsJsPath_utils_js__WEBPACK_IMPORTED_MODULE_0__.lpGetCurrentURLNoParam();
475 613 return {
476 614 autoLoadAPIs: () => {
477 615 console.log('autoLoadAPIs');
478 616 },
@@ -496,11 +634,11 @@
496 634 option.headers['Content-Type'] = 'application/json';
497 635 } else {
498 636 params.args = JSON.stringify(params.args);
499 637 params.callback = JSON.stringify(params.callback);
500 - url = (0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.lpAddQueryArgs)(url, params);
638 + url = lpAssetsJsPath_utils_js__WEBPACK_IMPORTED_MODULE_0__.lpAddQueryArgs(url, params);
501 639 }
502 - (0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.lpFetchAPI)(url, option, callBack);
640 + lpAssetsJsPath_utils_js__WEBPACK_IMPORTED_MODULE_0__.lpFetchAPI(url, option, callBack);
503 641 },
504 642 fetchAJAX: (params, callBack) => {
505 643 let urlAjax = lpSettings.lpAjaxUrl;
506 644
@@ -505,36 +643,55 @@
505 643 let urlAjax = lpSettings.lpAjaxUrl;
506 644
507 645 // Set param id_url for identify.
508 646 if (params.hasOwnProperty('args') && params.args.hasOwnProperty('id_url')) {
509 - urlAjax = (0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.lpAddQueryArgs)(urlAjax, {
647 + urlAjax = lpAssetsJsPath_utils_js__WEBPACK_IMPORTED_MODULE_0__.lpAddQueryArgs(urlAjax, {
510 648 id_url: params.args.id_url
511 649 });
512 650 } else if (params.hasOwnProperty('id_url')) {
513 - urlAjax = (0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.lpAddQueryArgs)(urlAjax, {
651 + urlAjax = lpAssetsJsPath_utils_js__WEBPACK_IMPORTED_MODULE_0__.lpAddQueryArgs(urlAjax, {
514 652 id_url: params.id_url
515 653 });
516 654 }
517 655 // Set param lang here if exits, for detect translate
518 656 if (lpSettings.urlParams.hasOwnProperty('lang')) {
519 - urlAjax = (0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.lpAddQueryArgs)(urlAjax, {
657 + urlAjax = lpAssetsJsPath_utils_js__WEBPACK_IMPORTED_MODULE_0__.lpAddQueryArgs(urlAjax, {
520 658 lang: lpSettings.urlParams.lang
521 659 });
522 660 }
523 - const formData = new FormData();
524 661 const action = params.hasOwnProperty('action') ? params.action : 'load_content_via_ajax';
525 - formData.append('nonce', lpSettings.nonce);
526 - formData.append('lp-load-ajax', action);
527 - formData.append('data', JSON.stringify(params));
528 - const dataSend = {
529 - method: 'POST',
530 - headers: {},
531 - body: formData
532 - };
662 + const isGet = params.hasOwnProperty('method_request') && 'GET' === String(params.method_request).toUpperCase();
663 + let dataSend;
664 + if (isGet) {
665 + // Don't send method_request back to server; keep URL shorter.
666 + const paramsForSend = {
667 + ...params
668 + };
669 + delete paramsForSend.method_request;
670 + urlAjax = lpAssetsJsPath_utils_js__WEBPACK_IMPORTED_MODULE_0__.lpAddQueryArgs(urlAjax, {
671 + nonce: lpSettings.nonce,
672 + 'lp-load-ajax': action,
673 + data: JSON.stringify(paramsForSend)
674 + });
675 + dataSend = {
676 + method: 'GET',
677 + headers: {}
678 + };
679 + } else {
680 + const formData = new FormData();
681 + formData.append('nonce', lpSettings.nonce);
682 + formData.append('lp-load-ajax', action);
683 + formData.append('data', JSON.stringify(params));
684 + dataSend = {
685 + method: 'POST',
686 + headers: {},
687 + body: formData
688 + };
689 + }
533 690 if (0 !== parseInt(lpSettings.user_id)) {
534 691 dataSend.headers['X-WP-Nonce'] = lpSettings.nonce;
535 692 }
536 - (0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.lpFetchAPI)(urlAjax, dataSend, callBack);
693 + lpAssetsJsPath_utils_js__WEBPACK_IMPORTED_MODULE_0__.lpFetchAPI(urlAjax, dataSend, callBack);
537 694 },
538 695 getElements: () => {
539 696 // Finds all elements with the class '.lp-load-ajax-element'
540 697 const elements = document.querySelectorAll('.lp-load-ajax-element:not(.loaded)');
@@ -589,8 +746,13 @@
589 746 const btnNumber = target.closest('.page-numbers:not(.disabled)');
590 747 if (!btnNumber) {
591 748 return;
592 749 }
750 +
751 + // Check btnNumber is tag a
752 + if (btnNumber.tagName.toLowerCase() !== 'a') {
753 + return;
754 + }
593 755 const elLPTarget = btnNumber.closest(`${classLPTarget}`);
594 756 if (!elLPTarget) {
595 757 return;
596 758 }
@@ -617,9 +779,9 @@
617 779
618 780 // Set url params to reload page.
619 781 if (!dataSend.args.hasOwnProperty('enableUpdateParamsUrl') || dataSend.args.enableUpdateParamsUrl) {
620 782 lpSettings.urlParams.paged = dataSend.args.paged;
621 - window.history.pushState({}, '', (0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.lpAddQueryArgs)(urlCurrent, lpSettings.urlParams));
783 + window.history.pushState({}, '', lpAssetsJsPath_utils_js__WEBPACK_IMPORTED_MODULE_0__.lpAddQueryArgs(urlCurrent, lpSettings.urlParams));
622 784 }
623 785 // End.
624 786
625 787 // Show loading
@@ -661,9 +823,9 @@
661 823 },
662 824 showHideLoading: (elLPTarget, status) => {
663 825 const elLoading = elLPTarget.nextElementSibling?.querySelector('.lp-loading-change');
664 826 if (elLoading) {
665 - (0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.lpShowHideEl)(elLoading, status);
827 + lpAssetsJsPath_utils_js__WEBPACK_IMPORTED_MODULE_0__.lpShowHideEl(elLoading, status);
666 828 }
667 829 }
668 830 };
669 831 };
@@ -676,9 +838,9 @@
676 838 window.lpAJAXG.clickNumberPage(e, target);
677 839 });
678 840
679 841 // Listen element created
680 -(0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.listenElementCreated)(node => {
842 +lpAssetsJsPath_utils_js__WEBPACK_IMPORTED_MODULE_0__.listenElementCreated(node => {
681 843 if (node.classList.contains('lp-load-ajax-element')) {
682 844 //console.log( 'Element created', node );
683 845 window.lpAJAXG.getElements();
684 846 }
@@ -684,9 +846,9 @@
684 846 }
685 847 });
686 848
687 849 // Listen element ready
688 -(0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.lpOnElementReady)('.lp-load-ajax-element', element => {
850 +lpAssetsJsPath_utils_js__WEBPACK_IMPORTED_MODULE_0__.lpOnElementReady('.lp-load-ajax-element', element => {
689 851 //console.log( 'Element ready', element );
690 852 window.lpAJAXG.getElements();
691 853 });
692 854