PluginProbe
LearnPress – WordPress LMS Plugin for Create and Sell Online Courses / 4.4.10
LearnPress – WordPress LMS Plugin for Create and Sell Online Courses v4.4.10
4.4.10 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 All 142 releases
← All changes | assets/js/dist/blocks/course-item-template.js +237 -87 4.3.9 → 4.4.10 View file →
@@ -1,4 +1,4 @@
1 1 /******/ (() => { // webpackBootstrap
2 2 /******/ var __webpack_modules__ = ({
3 3
4 4 /***/ "./assets/src/apps/js/blocks/courses/course-item-template/edit.js"
@@ -312,13 +312,13 @@
312 312 __webpack_require__.r(__webpack_exports__);
313 313 /* harmony export */ __webpack_require__.d(__webpack_exports__, {
314 314 /* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__)
315 315 /* harmony export */ });
316 -/**
317 - * List API on backend
318 - *
319 - * @since 4.2.6
320 - * @version 1.0.2
316 +/**
317 + * List API on backend
318 + *
319 + * @since 4.2.6
320 + * @version 1.0.2
321 321 */
322 322
323 323 const lplistAPI = {};
324 324 let lp_rest_url;
@@ -324,12 +324,9 @@
324 324 let lp_rest_url;
325 325 if ('undefined' !== typeof lpDataAdmin) {
326 326 lp_rest_url = lpDataAdmin.lp_rest_url;
327 327 lplistAPI.admin = {
328 - apiAdminNotice: lp_rest_url + 'lp/v1/admin/tools/admin-notices',
329 - apiAddons: lp_rest_url + 'lp/v1/addon/all',
330 - apiAddonAction: lp_rest_url + 'lp/v1/addon/action-n',
331 - apiAddonsPurchase: lp_rest_url + 'lp/v1/addon/info-addons-purchase',
328 + // apiAdminNotice: lp_rest_url + 'lp/v1/admin/tools/admin-notices',
332 329 apiSearchCourses: lp_rest_url + 'lp/v1/admin/tools/search-course',
333 330 apiSearchUsers: lp_rest_url + 'lp/v1/admin/tools/search-user',
334 331 apiAssignUserCourse: lp_rest_url + 'lp/v1/admin/tools/assign-user-course',
335 332 apiUnAssignUserCourse: lp_rest_url + 'lp/v1/admin/tools/unassign-user-course'
@@ -365,8 +362,9 @@
365 362 __webpack_require__.r(__webpack_exports__);
366 363 /* harmony export */ __webpack_require__.d(__webpack_exports__, {
367 364 /* harmony export */ debounce: () => (/* binding */ debounce),
368 365 /* harmony export */ eventHandlers: () => (/* binding */ eventHandlers),
366 +/* harmony export */ fullScreenView: () => (/* binding */ fullScreenView),
369 367 /* harmony export */ getDataOfForm: () => (/* binding */ getDataOfForm),
370 368 /* harmony export */ getFieldKeysOfForm: () => (/* binding */ getFieldKeysOfForm),
371 369 /* harmony export */ listenElementCreated: () => (/* binding */ listenElementCreated),
372 370 /* harmony export */ listenElementViewed: () => (/* binding */ listenElementViewed),
@@ -378,18 +376,19 @@
378 376 /* harmony export */ lpOnElementReady: () => (/* binding */ lpOnElementReady),
379 377 /* harmony export */ lpSetLoadingEl: () => (/* binding */ lpSetLoadingEl),
380 378 /* harmony export */ lpShowHideEl: () => (/* binding */ lpShowHideEl),
381 379 /* harmony export */ mergeDataWithDatForm: () => (/* binding */ mergeDataWithDatForm),
382 -/* harmony export */ toggleCollapse: () => (/* binding */ toggleCollapse)
380 +/* harmony export */ toggleCollapse: () => (/* binding */ toggleCollapse),
381 +/* harmony export */ toggleEnable: () => (/* binding */ toggleEnable)
383 382 /* harmony export */ });
384 -/**
385 - * Utils functions
386 - *
387 - * @param url
388 - * @param data
389 - * @param functions
390 - * @since 4.2.5.1
391 - * @version 1.0.6
383 +/**
384 + * Utils functions
385 + *
386 + * @param url
387 + * @param data
388 + * @param functions
389 + * @since 4.2.5.1
390 + * @version 1.0.7
392 391 */
393 392 const lpClassName = {
394 393 hidden: 'lp-hidden',
395 394 loading: 'loading',
@@ -394,9 +393,12 @@
394 393 hidden: 'lp-hidden',
395 394 loading: 'loading',
396 395 elCollapse: 'lp-collapse',
397 396 elSectionToggle: '.lp-section-toggle',
398 - elTriggerToggle: '.lp-trigger-toggle'
397 + elTriggerToggle: '.lp-trigger-toggle',
398 + elBtnFullScreen: '.lp-btn-full-screen-view',
399 + elFullScreen: 'lp-full-screen-view',
400 + elBtnFullScreenClose: 'lp-full-screen-view__close'
399 401 };
400 402 const lpFetchAPI = (url, data = {}, functions = {}) => {
401 403 if ('function' === typeof functions.before) {
402 404 functions.before();
@@ -418,12 +420,12 @@
418 420 }
419 421 });
420 422 };
421 423
422 -/**
423 - * Get current URL without params.
424 - *
425 - * @since 4.2.5.1
424 +/**
425 + * Get current URL without params.
426 + *
427 + * @since 4.2.5.1
426 428 */
427 429 const lpGetCurrentURLNoParam = () => {
428 430 let currentUrl = window.location.href;
429 431 const hasParams = currentUrl.includes('?');
@@ -439,14 +441,14 @@
439 441 });
440 442 return url;
441 443 };
442 444
443 -/**
444 - * Listen element viewed.
445 - *
446 - * @param el
447 - * @param callback
448 - * @since 4.2.5.8
445 +/**
446 + * Listen element viewed.
447 + *
448 + * @param el
449 + * @param callback
450 + * @since 4.2.5.8
449 451 */
450 452 const listenElementViewed = (el, callback) => {
451 453 const observerSeeItem = new IntersectionObserver(function (entries) {
452 454 for (const entry of entries) {
@@ -457,13 +459,13 @@
457 459 });
458 460 observerSeeItem.observe(el);
459 461 };
460 462
461 -/**
462 - * Listen element created.
463 - *
464 - * @param callback
465 - * @since 4.2.5.8
463 +/**
464 + * Listen element created.
465 + *
466 + * @param callback
467 + * @since 4.2.5.8
466 468 */
467 469 const listenElementCreated = callback => {
468 470 const observerCreateItem = new MutationObserver(function (mutations) {
469 471 mutations.forEach(function (mutation) {
@@ -482,14 +484,14 @@
482 484 });
483 485 // End.
484 486 };
485 487
486 -/**
487 - * Listen element created.
488 - *
489 - * @param selector
490 - * @param callback
491 - * @since 4.2.7.1
488 +/**
489 + * Listen element created.
490 + *
491 + * @param selector
492 + * @param callback
493 + * @since 4.2.7.1
492 494 */
493 495 const lpOnElementReady = (selector, callback) => {
494 496 const element = document.querySelector(selector);
495 497 if (element) {
@@ -630,17 +632,17 @@
630 632 };
631 633 return dataHandle;
632 634 };
633 635
634 -/**
635 - * Event trigger
636 - * For each list of event handlers, listen event on document.
637 - *
638 - * eventName: 'click', 'change', ...
639 - * eventHandlers = [ { selector: '.lp-button', callBack: function(){}, class: object } ]
640 - *
641 - * @param eventName
642 - * @param eventHandlers
636 +/**
637 + * Event trigger
638 + * For each list of event handlers, listen event on document.
639 + *
640 + * eventName: 'click', 'change', ...
641 + * eventHandlers = [ { selector: '.lp-button', callBack: function(){}, class: object } ]
642 + *
643 + * @param eventName
644 + * @param eventHandlers
643 645 */
644 646 const eventHandlers = (eventName, eventHandlers) => {
645 647 document.addEventListener(eventName, e => {
646 648 const target = e.target;
@@ -681,32 +683,32 @@
681 683 });
682 684 });
683 685 };
684 686
685 -/**
686 - * Debounce - delays function execution until after `wait` ms of inactivity.
687 - *
688 - * Each call resets the timer. Only the last call in a burst executes.
689 - *
690 - * USE CASES:
691 - * - Search inputs, form validation, window resize
692 - * - Multiple elements need independent timers
693 - * - When you need to call with different arguments
694 - *
695 - * EXAMPLES:
696 - * const debouncedSearch = debounce( (query) => fetchResults(query), 300 );
697 - * searchInput.addEventListener('input', (e) => debouncedSearch(e.target.value));
698 - *
699 - * const debouncedResize = debounce( recalculateLayout, 250 );
700 - * window.addEventListener('resize', debouncedResize);
701 - *
702 - * ⚠️ Create ONCE outside event handlers, not inside.
703 - *
704 - * @param {Function} func - Function to debounce (can be anonymous)
705 - * @param {number} wait - Milliseconds to wait (default: 500)
706 - * @return {Function} Debounced wrapper function
707 - * @since 4.3.7
708 - * @version 1.0.0
687 +/**
688 + * Debounce - delays function execution until after `wait` ms of inactivity.
689 + *
690 + * Each call resets the timer. Only the last call in a burst executes.
691 + *
692 + * USE CASES:
693 + * - Search inputs, form validation, window resize
694 + * - Multiple elements need independent timers
695 + * - When you need to call with different arguments
696 + *
697 + * EXAMPLES:
698 + * const debouncedSearch = debounce( (query) => fetchResults(query), 300 );
699 + * searchInput.addEventListener('input', (e) => debouncedSearch(e.target.value));
700 + *
701 + * const debouncedResize = debounce( recalculateLayout, 250 );
702 + * window.addEventListener('resize', debouncedResize);
703 + *
704 + * ⚠️ Create ONCE outside event handlers, not inside.
705 + *
706 + * @param {Function} func - Function to debounce (can be anonymous)
707 + * @param {number} wait - Milliseconds to wait (default: 500)
708 + * @return {Function} Debounced wrapper function
709 + * @since 4.3.7
710 + * @version 1.0.0
709 711 */
710 712 const debounce = (func, wait = 500) => {
711 713 let timer;
712 714 return args => {
@@ -714,8 +716,141 @@
714 716 timer = setTimeout(() => func(args), wait);
715 717 };
716 718 };
717 719
720 +/**
721 + * Initialize lp-toggle-enable components.
722 + *
723 + * Finds all `.lp-toggle-enable` elements and wires up toggle behavior.
724 + * Reads initial state from `data-enabled` attribute ("true"/"false").
725 + * Calls `data-on-toggle` callback (if provided via options) on state change.
726 + *
727 + * HTML structure:
728 + * <label class="lp-toggle-enable" data-enabled="true">
729 + * <input type="checkbox" class="lp-toggle-enable__input" />
730 + * <span class="lp-toggle-enable__track"></span>
731 + * </label>
732 + *
733 + * @param {string} selector CSS selector for toggle elements (default: '.lp-toggle-enable')
734 + * @param {Function} onToggle Optional callback( el, isEnabled ) called on state change
735 + * @since 4.4.5
736 + * @version 1.0.0
737 + */
738 +window.lpToggleEnableInit = 0;
739 +const toggleEnable = (onToggle = null) => {
740 + if (window.lpToggleEnableInit) {
741 + return;
742 + }
743 + window.lpToggleEnableInit = 1;
744 + const selector = '.lp-toggle-enable';
745 + const updateUI = (toggle, isEnabled) => {
746 + toggle.classList.toggle('is-enabled', isEnabled);
747 + const input = toggle.querySelector('.lp-toggle-enable__input');
748 + if (input) {
749 + input.checked = isEnabled;
750 + input.value = isEnabled ? '1' : '0';
751 + }
752 + };
753 +
754 + // Delegate click handling via eventHandlers.
755 + eventHandlers('click', [{
756 + selector,
757 + callBack: args => {
758 + const {
759 + e,
760 + target
761 + } = args;
762 + const toggle = target.closest(selector);
763 + if (!toggle || toggle.classList.contains('is-disabled')) {
764 + return;
765 + }
766 + e.preventDefault();
767 + const isEnabled = !toggle.classList.contains('is-enabled');
768 + updateUI(toggle, isEnabled);
769 + if ('function' === typeof onToggle) {
770 + onToggle(toggle, isEnabled);
771 + }
772 + }
773 + }]);
774 +};
775 +
776 +/**
777 + * Initialize custom fullscreen view buttons.
778 + *
779 + * Delegates clicks on `.lp-btn-full-screen-view` buttons to
780 + * `lpToggleFullscreenView`. Reads the `data-target` attribute to find the
781 + * target element. Falls back to the button's parent element when
782 + * `data-target` is not provided.
783 + *
784 + * @since 4.4.5
785 + * @version 1.0.0
786 + */
787 +window.lpFullScreenViewInit = 0;
788 +const fullScreenView = () => {
789 + if (window.lpFullScreenViewInit) {
790 + return;
791 + }
792 + window.lpFullScreenViewInit = 1;
793 + let lastScrollY = 0;
794 + const lpToggleFullscreenView = (elTarget, elBtnFullScreen = null) => {
795 + const isFullscreen = elTarget.classList.contains(lpClassName.elFullScreen);
796 + if (isFullscreen) {
797 + elTarget.classList.remove(lpClassName.elFullScreen);
798 + document.documentElement.classList.remove('lp-full-screen-active');
799 + window.scrollTo(0, lastScrollY);
800 + } else {
801 + lastScrollY = window.scrollY;
802 + elTarget.classList.add(lpClassName.elFullScreen);
803 + document.documentElement.classList.add('lp-full-screen-active');
804 + }
805 + if (!isFullscreen) {
806 + if (!elTarget.querySelector(`.${lpClassName.elBtnFullScreenClose}`)) {
807 + const closeButton = document.createElement('button');
808 + closeButton.type = 'button';
809 + closeButton.className = lpClassName.elBtnFullScreenClose;
810 + closeButton.setAttribute('aria-label', 'Close');
811 + closeButton.innerHTML = lpData.i18n.closeButtonFullScreen || 'Close &times;';
812 + closeButton.addEventListener('click', e => {
813 + e.preventDefault();
814 + lpToggleFullscreenView(elTarget);
815 + });
816 + elTarget.appendChild(closeButton);
817 + }
818 + } else {
819 + const closeButton = elTarget.querySelector(`.${lpClassName.elBtnFullScreenClose}`);
820 + if (closeButton) {
821 + closeButton.remove();
822 + }
823 + }
824 + };
825 + eventHandlers('click', [{
826 + selector: lpClassName.elBtnFullScreen,
827 + callBack: args => {
828 + const {
829 + e,
830 + target
831 + } = args;
832 + const elBtnFullScreen = target.closest(lpClassName.elBtnFullScreen);
833 + if (!elBtnFullScreen) {
834 + console.log('No full screen button found');
835 + return;
836 + }
837 + e.preventDefault();
838 + let elTarget = null;
839 + const targetSelector = elBtnFullScreen.dataset.targetFullscreen;
840 + console.log(targetSelector);
841 + if (targetSelector) {
842 + elTarget = document.querySelector(targetSelector);
843 + }
844 + if (!elTarget) {
845 + console.log('No target element found');
846 + return;
847 + }
848 + lpToggleFullscreenView(elTarget, elBtnFullScreen);
849 + }
850 + }]);
851 +};
852 +
718 853 /***/ },
719 854
720 855 /***/ "react"
721 856 /*!************************!*\
@@ -894,19 +1029,19 @@
894 1029
895 1030 /******/ });
896 1031 /************************************************************************/
897 1032 /******/ // The module cache
898 -/******/ var __webpack_module_cache__ = {};
1033 +/******/ const __webpack_module_cache__ = {};
899 1034 /******/
900 1035 /******/ // The require function
901 1036 /******/ function __webpack_require__(moduleId) {
902 1037 /******/ // Check if module is in cache
903 -/******/ var cachedModule = __webpack_module_cache__[moduleId];
1038 +/******/ const cachedModule = __webpack_module_cache__[moduleId];
904 1039 /******/ if (cachedModule !== undefined) {
905 1040 /******/ return cachedModule.exports;
906 1041 /******/ }
907 1042 /******/ // Create a new module (and put it into the cache)
908 -/******/ var module = __webpack_module_cache__[moduleId] = {
1043 +/******/ const module = __webpack_module_cache__[moduleId] = {
909 1044 /******/ // no module.id needed
910 1045 /******/ // no module.loaded needed
911 1046 /******/ exports: {}
912 1047 /******/ };
@@ -913,9 +1048,9 @@
913 1048 /******/
914 1049 /******/ // Execute the module function
915 1050 /******/ if (!(moduleId in __webpack_modules__)) {
916 1051 /******/ delete __webpack_module_cache__[moduleId];
917 -/******/ var e = new Error("Cannot find module '" + moduleId + "'");
1052 +/******/ const e = new Error("Cannot find module '" + moduleId + "'");
918 1053 /******/ e.code = 'MODULE_NOT_FOUND';
919 1054 /******/ throw e;
920 1055 /******/ }
921 1056 /******/ __webpack_modules__[moduleId](module, module.exports, __webpack_require__);
@@ -928,9 +1063,9 @@
928 1063 /******/ /* webpack/runtime/compat get default export */
929 1064 /******/ (() => {
930 1065 /******/ // getDefaultExport function for compatibility with non-harmony modules
931 1066 /******/ __webpack_require__.n = (module) => {
932 -/******/ var getter = module && module.__esModule ?
1067 +/******/ const getter = module && module.__esModule ?
933 1068 /******/ () => (module['default']) :
934 1069 /******/ () => (module);
935 1070 /******/ __webpack_require__.d(getter, { a: getter });
936 1071 /******/ return getter;
@@ -938,14 +1073,29 @@
938 1073 /******/ })();
939 1074 /******/
940 1075 /******/ /* webpack/runtime/define property getters */
941 1076 /******/ (() => {
942 -/******/ // define getter functions for harmony exports
1077 +/******/ // define getter/value functions for harmony exports
943 1078 /******/ __webpack_require__.d = (exports, definition) => {
944 -/******/ for(var key in definition) {
945 -/******/ if(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {
946 -/******/ Object.defineProperty(exports, key, { enumerable: true, get: definition[key] });
1079 +/******/ if(Array.isArray(definition)) {
1080 +/******/ var i = 0;
1081 +/******/ while(i < definition.length) {
1082 +/******/ var key = definition[i++];
1083 +/******/ var binding = definition[i++];
1084 +/******/ if(!__webpack_require__.o(exports, key)) {
1085 +/******/ if(binding === 0) {
1086 +/******/ Object.defineProperty(exports, key, { enumerable: true, value: definition[i++] });
1087 +/******/ } else {
1088 +/******/ Object.defineProperty(exports, key, { enumerable: true, get: binding });
1089 +/******/ }
1090 +/******/ } else if(binding === 0) { i++; }
947 1091 /******/ }
1092 +/******/ } else {
1093 +/******/ for(var key in definition) {
1094 +/******/ if(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {
1095 +/******/ Object.defineProperty(exports, key, { enumerable: true, get: definition[key] });
1096 +/******/ }
1097 +/******/ }
948 1098 /******/ }
949 1099 /******/ };
950 1100 /******/ })();
951 1101 /******/
@@ -950,9 +1100,9 @@
950 1100 /******/ })();
951 1101 /******/
952 1102 /******/ /* webpack/runtime/hasOwnProperty shorthand */
953 1103 /******/ (() => {
954 -/******/ __webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))
1104 +/******/ __webpack_require__.o = (obj, prop) => (Object.hasOwn(obj, prop))
955 1105 /******/ })();
956 1106 /******/
957 1107 /******/ /* webpack/runtime/make namespace object */
958 1108 /******/ (() => {
@@ -957,9 +1107,9 @@
957 1107 /******/ /* webpack/runtime/make namespace object */
958 1108 /******/ (() => {
959 1109 /******/ // define __esModule on exports
960 1110 /******/ __webpack_require__.r = (exports) => {
961 -/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) {
1111 +/******/ if(Symbol.toStringTag) {
962 1112 /******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
963 1113 /******/ }
964 1114 /******/ Object.defineProperty(exports, '__esModule', { value: true });
965 1115 /******/ };
@@ -965,9 +1115,9 @@
965 1115 /******/ };
966 1116 /******/ })();
967 1117 /******/
968 1118 /************************************************************************/
969 -var __webpack_exports__ = {};
1119 +let __webpack_exports__ = {};
970 1120 // This entry needs to be wrapped in an IIFE because it needs to be in strict mode.
971 1121 (() => {
972 1122 "use strict";
973 1123 /*!*************************************************************************!*\
@@ -981,10 +1131,10 @@
981 1131 /* harmony import */ var _block_json__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./block.json */ "./assets/src/apps/js/blocks/courses/course-item-template/block.json");
982 1132 /* harmony import */ var _wordpress_blocks__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @wordpress/blocks */ "@wordpress/blocks");
983 1133 /* harmony import */ var _wordpress_blocks__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(_wordpress_blocks__WEBPACK_IMPORTED_MODULE_4__);
984 1134
985 -/**
986 - * Register block single course property.
1135 +/**
1136 + * Register block single course property.
987 1137 */
988 1138
989 1139
990 1140