PluginProbe
LearnPress – WordPress LMS Plugin for Create and Sell Online Courses / 4.4.9
LearnPress – WordPress LMS Plugin for Create and Sell Online Courses v4.4.9
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
← All changes | assets/dist/js/admin/admin-courses.js +155 -33 4.4.1 → 4.4.9 View file →
@@ -418,9 +418,8 @@
418 418 if (!btn) {
419 419 return;
420 420 }
421 421 lpAssetsJsPath_utils_js__WEBPACK_IMPORTED_MODULE_1__.lpSetLoadingEl(btn, isLoading ? 1 : 0);
422 - btn.disabled = !!isLoading;
423 422 }
424 423 init() {
425 424 if (ViewStudentsModal._loadedEvents) {
426 425 return;
@@ -456,9 +455,9 @@
456 455 }]);
457 456 }
458 457 handleOpenModal(args) {
459 458 const btn = args?.target?.closest(ViewStudentsModal.selectors.courseTrigger);
460 - if (!btn || this.isRequesting || btn.classList.contains('loading') || btn.disabled) {
459 + if (!btn || this.isRequesting || btn.classList.contains('loading')) {
461 460 return;
462 461 }
463 462 const courseId = parseInt(btn.dataset.courseId, 10) || 0;
464 463 if (!courseId) {
@@ -508,9 +507,9 @@
508 507 }
509 508 if (args?.e) {
510 509 args.e.preventDefault();
511 510 }
512 - if (this.isRequesting || btn.classList.contains('loading') || btn.disabled) {
511 + if (this.isRequesting || btn.classList.contains('loading')) {
513 512 return;
514 513 }
515 514 form.reset();
516 515 this.setButtonLoadingState(btn, true);
@@ -713,8 +712,9 @@
713 712 __webpack_require__.r(__webpack_exports__);
714 713 /* harmony export */ __webpack_require__.d(__webpack_exports__, {
715 714 /* harmony export */ debounce: () => (/* binding */ debounce),
716 715 /* harmony export */ eventHandlers: () => (/* binding */ eventHandlers),
716 +/* harmony export */ fullScreenView: () => (/* binding */ fullScreenView),
717 717 /* harmony export */ getDataOfForm: () => (/* binding */ getDataOfForm),
718 718 /* harmony export */ getFieldKeysOfForm: () => (/* binding */ getFieldKeysOfForm),
719 719 /* harmony export */ listenElementCreated: () => (/* binding */ listenElementCreated),
720 720 /* harmony export */ listenElementViewed: () => (/* binding */ listenElementViewed),
@@ -726,9 +726,10 @@
726 726 /* harmony export */ lpOnElementReady: () => (/* binding */ lpOnElementReady),
727 727 /* harmony export */ lpSetLoadingEl: () => (/* binding */ lpSetLoadingEl),
728 728 /* harmony export */ lpShowHideEl: () => (/* binding */ lpShowHideEl),
729 729 /* harmony export */ mergeDataWithDatForm: () => (/* binding */ mergeDataWithDatForm),
730 -/* harmony export */ toggleCollapse: () => (/* binding */ toggleCollapse)
730 +/* harmony export */ toggleCollapse: () => (/* binding */ toggleCollapse),
731 +/* harmony export */ toggleEnable: () => (/* binding */ toggleEnable)
731 732 /* harmony export */ });
732 733 /**
733 734 * Utils functions
734 735 *
@@ -735,9 +736,9 @@
735 736 * @param url
736 737 * @param data
737 738 * @param functions
738 739 * @since 4.2.5.1
739 - * @version 1.0.6
740 + * @version 1.0.7
740 741 */
741 742 const lpClassName = {
742 743 hidden: 'lp-hidden',
743 744 loading: 'loading',
@@ -742,9 +743,12 @@
742 743 hidden: 'lp-hidden',
743 744 loading: 'loading',
744 745 elCollapse: 'lp-collapse',
745 746 elSectionToggle: '.lp-section-toggle',
746 - elTriggerToggle: '.lp-trigger-toggle'
747 + elTriggerToggle: '.lp-trigger-toggle',
748 + elBtnFullScreen: '.lp-btn-full-screen-view',
749 + elFullScreen: 'lp-full-screen-view',
750 + elBtnFullScreenClose: 'lp-full-screen-view__close'
747 751 };
748 752 const lpFetchAPI = (url, data = {}, functions = {}) => {
749 753 if ('function' === typeof functions.before) {
750 754 functions.before();
@@ -1062,8 +1066,141 @@
1062 1066 timer = setTimeout(() => func(args), wait);
1063 1067 };
1064 1068 };
1065 1069
1070 +/**
1071 + * Initialize lp-toggle-enable components.
1072 + *
1073 + * Finds all `.lp-toggle-enable` elements and wires up toggle behavior.
1074 + * Reads initial state from `data-enabled` attribute ("true"/"false").
1075 + * Calls `data-on-toggle` callback (if provided via options) on state change.
1076 + *
1077 + * HTML structure:
1078 + * <label class="lp-toggle-enable" data-enabled="true">
1079 + * <input type="checkbox" class="lp-toggle-enable__input" />
1080 + * <span class="lp-toggle-enable__track"></span>
1081 + * </label>
1082 + *
1083 + * @param {string} selector CSS selector for toggle elements (default: '.lp-toggle-enable')
1084 + * @param {Function} onToggle Optional callback( el, isEnabled ) called on state change
1085 + * @since 4.4.5
1086 + * @version 1.0.0
1087 + */
1088 +window.lpToggleEnableInit = 0;
1089 +const toggleEnable = (onToggle = null) => {
1090 + if (window.lpToggleEnableInit) {
1091 + return;
1092 + }
1093 + window.lpToggleEnableInit = 1;
1094 + const selector = '.lp-toggle-enable';
1095 + const updateUI = (toggle, isEnabled) => {
1096 + toggle.classList.toggle('is-enabled', isEnabled);
1097 + const input = toggle.querySelector('.lp-toggle-enable__input');
1098 + if (input) {
1099 + input.checked = isEnabled;
1100 + input.value = isEnabled ? '1' : '0';
1101 + }
1102 + };
1103 +
1104 + // Delegate click handling via eventHandlers.
1105 + eventHandlers('click', [{
1106 + selector,
1107 + callBack: args => {
1108 + const {
1109 + e,
1110 + target
1111 + } = args;
1112 + const toggle = target.closest(selector);
1113 + if (!toggle || toggle.classList.contains('is-disabled')) {
1114 + return;
1115 + }
1116 + e.preventDefault();
1117 + const isEnabled = !toggle.classList.contains('is-enabled');
1118 + updateUI(toggle, isEnabled);
1119 + if ('function' === typeof onToggle) {
1120 + onToggle(toggle, isEnabled);
1121 + }
1122 + }
1123 + }]);
1124 +};
1125 +
1126 +/**
1127 + * Initialize custom fullscreen view buttons.
1128 + *
1129 + * Delegates clicks on `.lp-btn-full-screen-view` buttons to
1130 + * `lpToggleFullscreenView`. Reads the `data-target` attribute to find the
1131 + * target element. Falls back to the button's parent element when
1132 + * `data-target` is not provided.
1133 + *
1134 + * @since 4.4.5
1135 + * @version 1.0.0
1136 + */
1137 +window.lpFullScreenViewInit = 0;
1138 +const fullScreenView = () => {
1139 + if (window.lpFullScreenViewInit) {
1140 + return;
1141 + }
1142 + window.lpFullScreenViewInit = 1;
1143 + let lastScrollY = 0;
1144 + const lpToggleFullscreenView = (elTarget, elBtnFullScreen = null) => {
1145 + const isFullscreen = elTarget.classList.contains(lpClassName.elFullScreen);
1146 + if (isFullscreen) {
1147 + elTarget.classList.remove(lpClassName.elFullScreen);
1148 + document.documentElement.classList.remove('lp-full-screen-active');
1149 + window.scrollTo(0, lastScrollY);
1150 + } else {
1151 + lastScrollY = window.scrollY;
1152 + elTarget.classList.add(lpClassName.elFullScreen);
1153 + document.documentElement.classList.add('lp-full-screen-active');
1154 + }
1155 + if (!isFullscreen) {
1156 + if (!elTarget.querySelector(`.${lpClassName.elBtnFullScreenClose}`)) {
1157 + const closeButton = document.createElement('button');
1158 + closeButton.type = 'button';
1159 + closeButton.className = lpClassName.elBtnFullScreenClose;
1160 + closeButton.setAttribute('aria-label', 'Close');
1161 + closeButton.innerHTML = lpData.i18n.closeButtonFullScreen || 'Close &times;';
1162 + closeButton.addEventListener('click', e => {
1163 + e.preventDefault();
1164 + lpToggleFullscreenView(elTarget);
1165 + });
1166 + elTarget.appendChild(closeButton);
1167 + }
1168 + } else {
1169 + const closeButton = elTarget.querySelector(`.${lpClassName.elBtnFullScreenClose}`);
1170 + if (closeButton) {
1171 + closeButton.remove();
1172 + }
1173 + }
1174 + };
1175 + eventHandlers('click', [{
1176 + selector: lpClassName.elBtnFullScreen,
1177 + callBack: args => {
1178 + const {
1179 + e,
1180 + target
1181 + } = args;
1182 + const elBtnFullScreen = target.closest(lpClassName.elBtnFullScreen);
1183 + if (!elBtnFullScreen) {
1184 + console.log('No full screen button found');
1185 + return;
1186 + }
1187 + e.preventDefault();
1188 + let elTarget = null;
1189 + const targetSelector = elBtnFullScreen.dataset.targetFullscreen;
1190 + console.log(targetSelector);
1191 + if (targetSelector) {
1192 + elTarget = document.querySelector(targetSelector);
1193 + }
1194 + if (!elTarget) {
1195 + console.log('No target element found');
1196 + return;
1197 + }
1198 + lpToggleFullscreenView(elTarget, elBtnFullScreen);
1199 + }
1200 + }]);
1201 +};
1202 +
1066 1203 /***/ },
1067 1204
1068 1205 /***/ "./node_modules/css-loader/dist/cjs.js!./node_modules/toastify-js/src/toastify.css"
1069 1206 /*!*****************************************************************************************!*\
@@ -6916,19 +7053,19 @@
6916 7053
6917 7054 /******/ });
6918 7055 /************************************************************************/
6919 7056 /******/ // The module cache
6920 -/******/ const __webpack_module_cache__ = {};
7057 +/******/ var __webpack_module_cache__ = {};
6921 7058 /******/
6922 7059 /******/ // The require function
6923 7060 /******/ function __webpack_require__(moduleId) {
6924 7061 /******/ // Check if module is in cache
6925 -/******/ const cachedModule = __webpack_module_cache__[moduleId];
7062 +/******/ var cachedModule = __webpack_module_cache__[moduleId];
6926 7063 /******/ if (cachedModule !== undefined) {
6927 7064 /******/ return cachedModule.exports;
6928 7065 /******/ }
6929 7066 /******/ // Create a new module (and put it into the cache)
6930 -/******/ const module = __webpack_module_cache__[moduleId] = {
7067 +/******/ var module = __webpack_module_cache__[moduleId] = {
6931 7068 /******/ id: moduleId,
6932 7069 /******/ // no module.loaded needed
6933 7070 /******/ exports: {}
6934 7071 /******/ };
@@ -6935,9 +7072,9 @@
6935 7072 /******/
6936 7073 /******/ // Execute the module function
6937 7074 /******/ if (!(moduleId in __webpack_modules__)) {
6938 7075 /******/ delete __webpack_module_cache__[moduleId];
6939 -/******/ const e = new Error("Cannot find module '" + moduleId + "'");
7076 +/******/ var e = new Error("Cannot find module '" + moduleId + "'");
6940 7077 /******/ e.code = 'MODULE_NOT_FOUND';
6941 7078 /******/ throw e;
6942 7079 /******/ }
6943 7080 /******/ __webpack_modules__[moduleId].call(module.exports, module, module.exports, __webpack_require__);
@@ -6950,9 +7087,9 @@
6950 7087 /******/ /* webpack/runtime/compat get default export */
6951 7088 /******/ (() => {
6952 7089 /******/ // getDefaultExport function for compatibility with non-harmony modules
6953 7090 /******/ __webpack_require__.n = (module) => {
6954 -/******/ const getter = module && module.__esModule ?
7091 +/******/ var getter = module && module.__esModule ?
6955 7092 /******/ () => (module['default']) :
6956 7093 /******/ () => (module);
6957 7094 /******/ __webpack_require__.d(getter, { a: getter });
6958 7095 /******/ return getter;
@@ -6960,29 +7097,14 @@
6960 7097 /******/ })();
6961 7098 /******/
6962 7099 /******/ /* webpack/runtime/define property getters */
6963 7100 /******/ (() => {
6964 -/******/ // define getter/value functions for harmony exports
7101 +/******/ // define getter functions for harmony exports
6965 7102 /******/ __webpack_require__.d = (exports, definition) => {
6966 -/******/ if(Array.isArray(definition)) {
6967 -/******/ var i = 0;
6968 -/******/ while(i < definition.length) {
6969 -/******/ var key = definition[i++];
6970 -/******/ var binding = definition[i++];
6971 -/******/ if(!__webpack_require__.o(exports, key)) {
6972 -/******/ if(binding === 0) {
6973 -/******/ Object.defineProperty(exports, key, { enumerable: true, value: definition[i++] });
6974 -/******/ } else {
6975 -/******/ Object.defineProperty(exports, key, { enumerable: true, get: binding });
6976 -/******/ }
6977 -/******/ } else if(binding === 0) { i++; }
7103 +/******/ for(var key in definition) {
7104 +/******/ if(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {
7105 +/******/ Object.defineProperty(exports, key, { enumerable: true, get: definition[key] });
6978 7106 /******/ }
6979 -/******/ } else {
6980 -/******/ for(var key in definition) {
6981 -/******/ if(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {
6982 -/******/ Object.defineProperty(exports, key, { enumerable: true, get: definition[key] });
6983 -/******/ }
6984 -/******/ }
6985 7107 /******/ }
6986 7108 /******/ };
6987 7109 /******/ })();
6988 7110 /******/
@@ -6987,9 +7109,9 @@
6987 7109 /******/ })();
6988 7110 /******/
6989 7111 /******/ /* webpack/runtime/hasOwnProperty shorthand */
6990 7112 /******/ (() => {
6991 -/******/ __webpack_require__.o = (obj, prop) => (Object.hasOwn(obj, prop))
7113 +/******/ __webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))
6992 7114 /******/ })();
6993 7115 /******/
6994 7116 /******/ /* webpack/runtime/make namespace object */
6995 7117 /******/ (() => {
@@ -6994,9 +7116,9 @@
6994 7116 /******/ /* webpack/runtime/make namespace object */
6995 7117 /******/ (() => {
6996 7118 /******/ // define __esModule on exports
6997 7119 /******/ __webpack_require__.r = (exports) => {
6998 -/******/ if(Symbol.toStringTag) {
7120 +/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) {
6999 7121 /******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
7000 7122 /******/ }
7001 7123 /******/ Object.defineProperty(exports, '__esModule', { value: true });
7002 7124 /******/ };
@@ -7007,9 +7129,9 @@
7007 7129 /******/ __webpack_require__.nc = undefined;
7008 7130 /******/ })();
7009 7131 /******/
7010 7132 /************************************************************************/
7011 -let __webpack_exports__ = {};
7133 +var __webpack_exports__ = {};
7012 7134 // This entry needs to be wrapped in an IIFE because it needs to be in strict mode.
7013 7135 (() => {
7014 7136 "use strict";
7015 7137 /*!**********************************************!*\