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/edit-quiz.js +167 -21 4.4.2 → 4.4.9 View file →
@@ -1333,9 +1333,9 @@
1333 1333 sweetalert2__WEBPACK_IMPORTED_MODULE_2___default().fire({
1334 1334 html: modalTemplate.innerHTML,
1335 1335 showConfirmButton: false,
1336 1336 showCloseButton: true,
1337 - width: '60%',
1337 + width: 'max(350px, 65vw)',
1338 1338 customClass: {
1339 1339 popup: 'lp-select-items-popup',
1340 1340 htmlContainer: 'lp-select-items-html-container',
1341 1341 container: 'lp-select-items-container'
@@ -1342,25 +1342,33 @@
1342 1342 },
1343 1343 willOpen: () => {
1344 1344 elPopup = sweetalert2__WEBPACK_IMPORTED_MODULE_2___default().getPopup();
1345 1345 const elLPTarget = elPopup.querySelector(`${LpPopupSelectItemToAdd.selectors.LPTarget}`);
1346 - if (elLPTarget) {
1347 - const dataSend = window.lpAJAXG.getDataSetCurrent(elLPTarget);
1348 - dataSend.args.paged = 1;
1349 - dataSend.args.item_selecting = itemsSelectedData || [];
1350 - window.lpAJAXG.setDataSetCurrent(elLPTarget, dataSend);
1351 - window.lpAJAXG.fetchAJAX(dataSend, {
1352 - success: response => {
1353 - const {
1354 - data
1355 - } = response;
1356 - const elSkeleton = elPopup.querySelector('.lp-skeleton-animation');
1357 - elSkeleton.remove();
1358 - elLPTarget.innerHTML = data.content || '';
1359 - this.watchItemsSelectedDataChange();
1360 - }
1361 - });
1362 - }
1346 +
1347 + // Avoid duplicate AJAX: loadAJAX.js handles fresh elements; skip if already loaded. Set timeout to ensure DOM is ready handle.
1348 + setTimeout(() => {
1349 + const elLoadAjaxElement = elLPTarget.closest('.lp-load-ajax-element:not(.loaded)');
1350 + if (!elLoadAjaxElement) {
1351 + return;
1352 + }
1353 + if (elLPTarget) {
1354 + const dataSend = window.lpAJAXG.getDataSetCurrent(elLPTarget);
1355 + dataSend.args.paged = 1;
1356 + dataSend.args.item_selecting = itemsSelectedData || [];
1357 + window.lpAJAXG.setDataSetCurrent(elLPTarget, dataSend);
1358 + window.lpAJAXG.fetchAJAX(dataSend, {
1359 + success: response => {
1360 + const {
1361 + data
1362 + } = response;
1363 + const elSkeleton = elPopup.querySelector('.lp-skeleton-animation');
1364 + elSkeleton.remove();
1365 + elLPTarget.innerHTML = data.content || '';
1366 + this.watchItemsSelectedDataChange();
1367 + }
1368 + });
1369 + }
1370 + }, 1);
1363 1371 }
1364 1372 }).then(result => {
1365 1373 if (result.isDismissed) {}
1366 1374 });
@@ -1696,8 +1704,9 @@
1696 1704 __webpack_require__.r(__webpack_exports__);
1697 1705 /* harmony export */ __webpack_require__.d(__webpack_exports__, {
1698 1706 /* harmony export */ debounce: () => (/* binding */ debounce),
1699 1707 /* harmony export */ eventHandlers: () => (/* binding */ eventHandlers),
1708 +/* harmony export */ fullScreenView: () => (/* binding */ fullScreenView),
1700 1709 /* harmony export */ getDataOfForm: () => (/* binding */ getDataOfForm),
1701 1710 /* harmony export */ getFieldKeysOfForm: () => (/* binding */ getFieldKeysOfForm),
1702 1711 /* harmony export */ listenElementCreated: () => (/* binding */ listenElementCreated),
1703 1712 /* harmony export */ listenElementViewed: () => (/* binding */ listenElementViewed),
@@ -1709,9 +1718,10 @@
1709 1718 /* harmony export */ lpOnElementReady: () => (/* binding */ lpOnElementReady),
1710 1719 /* harmony export */ lpSetLoadingEl: () => (/* binding */ lpSetLoadingEl),
1711 1720 /* harmony export */ lpShowHideEl: () => (/* binding */ lpShowHideEl),
1712 1721 /* harmony export */ mergeDataWithDatForm: () => (/* binding */ mergeDataWithDatForm),
1713 -/* harmony export */ toggleCollapse: () => (/* binding */ toggleCollapse)
1722 +/* harmony export */ toggleCollapse: () => (/* binding */ toggleCollapse),
1723 +/* harmony export */ toggleEnable: () => (/* binding */ toggleEnable)
1714 1724 /* harmony export */ });
1715 1725 /**
1716 1726 * Utils functions
1717 1727 *
@@ -1718,9 +1728,9 @@
1718 1728 * @param url
1719 1729 * @param data
1720 1730 * @param functions
1721 1731 * @since 4.2.5.1
1722 - * @version 1.0.6
1732 + * @version 1.0.7
1723 1733 */
1724 1734 const lpClassName = {
1725 1735 hidden: 'lp-hidden',
1726 1736 loading: 'loading',
@@ -1725,9 +1735,12 @@
1725 1735 hidden: 'lp-hidden',
1726 1736 loading: 'loading',
1727 1737 elCollapse: 'lp-collapse',
1728 1738 elSectionToggle: '.lp-section-toggle',
1729 - elTriggerToggle: '.lp-trigger-toggle'
1739 + elTriggerToggle: '.lp-trigger-toggle',
1740 + elBtnFullScreen: '.lp-btn-full-screen-view',
1741 + elFullScreen: 'lp-full-screen-view',
1742 + elBtnFullScreenClose: 'lp-full-screen-view__close'
1730 1743 };
1731 1744 const lpFetchAPI = (url, data = {}, functions = {}) => {
1732 1745 if ('function' === typeof functions.before) {
1733 1746 functions.before();
@@ -2043,8 +2056,141 @@
2043 2056 return args => {
2044 2057 clearTimeout(timer);
2045 2058 timer = setTimeout(() => func(args), wait);
2046 2059 };
2060 +};
2061 +
2062 +/**
2063 + * Initialize lp-toggle-enable components.
2064 + *
2065 + * Finds all `.lp-toggle-enable` elements and wires up toggle behavior.
2066 + * Reads initial state from `data-enabled` attribute ("true"/"false").
2067 + * Calls `data-on-toggle` callback (if provided via options) on state change.
2068 + *
2069 + * HTML structure:
2070 + * <label class="lp-toggle-enable" data-enabled="true">
2071 + * <input type="checkbox" class="lp-toggle-enable__input" />
2072 + * <span class="lp-toggle-enable__track"></span>
2073 + * </label>
2074 + *
2075 + * @param {string} selector CSS selector for toggle elements (default: '.lp-toggle-enable')
2076 + * @param {Function} onToggle Optional callback( el, isEnabled ) called on state change
2077 + * @since 4.4.5
2078 + * @version 1.0.0
2079 + */
2080 +window.lpToggleEnableInit = 0;
2081 +const toggleEnable = (onToggle = null) => {
2082 + if (window.lpToggleEnableInit) {
2083 + return;
2084 + }
2085 + window.lpToggleEnableInit = 1;
2086 + const selector = '.lp-toggle-enable';
2087 + const updateUI = (toggle, isEnabled) => {
2088 + toggle.classList.toggle('is-enabled', isEnabled);
2089 + const input = toggle.querySelector('.lp-toggle-enable__input');
2090 + if (input) {
2091 + input.checked = isEnabled;
2092 + input.value = isEnabled ? '1' : '0';
2093 + }
2094 + };
2095 +
2096 + // Delegate click handling via eventHandlers.
2097 + eventHandlers('click', [{
2098 + selector,
2099 + callBack: args => {
2100 + const {
2101 + e,
2102 + target
2103 + } = args;
2104 + const toggle = target.closest(selector);
2105 + if (!toggle || toggle.classList.contains('is-disabled')) {
2106 + return;
2107 + }
2108 + e.preventDefault();
2109 + const isEnabled = !toggle.classList.contains('is-enabled');
2110 + updateUI(toggle, isEnabled);
2111 + if ('function' === typeof onToggle) {
2112 + onToggle(toggle, isEnabled);
2113 + }
2114 + }
2115 + }]);
2116 +};
2117 +
2118 +/**
2119 + * Initialize custom fullscreen view buttons.
2120 + *
2121 + * Delegates clicks on `.lp-btn-full-screen-view` buttons to
2122 + * `lpToggleFullscreenView`. Reads the `data-target` attribute to find the
2123 + * target element. Falls back to the button's parent element when
2124 + * `data-target` is not provided.
2125 + *
2126 + * @since 4.4.5
2127 + * @version 1.0.0
2128 + */
2129 +window.lpFullScreenViewInit = 0;
2130 +const fullScreenView = () => {
2131 + if (window.lpFullScreenViewInit) {
2132 + return;
2133 + }
2134 + window.lpFullScreenViewInit = 1;
2135 + let lastScrollY = 0;
2136 + const lpToggleFullscreenView = (elTarget, elBtnFullScreen = null) => {
2137 + const isFullscreen = elTarget.classList.contains(lpClassName.elFullScreen);
2138 + if (isFullscreen) {
2139 + elTarget.classList.remove(lpClassName.elFullScreen);
2140 + document.documentElement.classList.remove('lp-full-screen-active');
2141 + window.scrollTo(0, lastScrollY);
2142 + } else {
2143 + lastScrollY = window.scrollY;
2144 + elTarget.classList.add(lpClassName.elFullScreen);
2145 + document.documentElement.classList.add('lp-full-screen-active');
2146 + }
2147 + if (!isFullscreen) {
2148 + if (!elTarget.querySelector(`.${lpClassName.elBtnFullScreenClose}`)) {
2149 + const closeButton = document.createElement('button');
2150 + closeButton.type = 'button';
2151 + closeButton.className = lpClassName.elBtnFullScreenClose;
2152 + closeButton.setAttribute('aria-label', 'Close');
2153 + closeButton.innerHTML = lpData.i18n.closeButtonFullScreen || 'Close &times;';
2154 + closeButton.addEventListener('click', e => {
2155 + e.preventDefault();
2156 + lpToggleFullscreenView(elTarget);
2157 + });
2158 + elTarget.appendChild(closeButton);
2159 + }
2160 + } else {
2161 + const closeButton = elTarget.querySelector(`.${lpClassName.elBtnFullScreenClose}`);
2162 + if (closeButton) {
2163 + closeButton.remove();
2164 + }
2165 + }
2166 + };
2167 + eventHandlers('click', [{
2168 + selector: lpClassName.elBtnFullScreen,
2169 + callBack: args => {
2170 + const {
2171 + e,
2172 + target
2173 + } = args;
2174 + const elBtnFullScreen = target.closest(lpClassName.elBtnFullScreen);
2175 + if (!elBtnFullScreen) {
2176 + console.log('No full screen button found');
2177 + return;
2178 + }
2179 + e.preventDefault();
2180 + let elTarget = null;
2181 + const targetSelector = elBtnFullScreen.dataset.targetFullscreen;
2182 + console.log(targetSelector);
2183 + if (targetSelector) {
2184 + elTarget = document.querySelector(targetSelector);
2185 + }
2186 + if (!elTarget) {
2187 + console.log('No target element found');
2188 + return;
2189 + }
2190 + lpToggleFullscreenView(elTarget, elBtnFullScreen);
2191 + }
2192 + }]);
2047 2193 };
2048 2194
2049 2195 /***/ },
2050 2196