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/js/dist/admin/admin-orders.js +210 -72 4.3.9 → 4.4.9 View file →
@@ -1,4 +1,4 @@
1 1 /******/ (() => { // webpackBootstrap
2 2 /******/ var __webpack_modules__ = ({
3 3
4 4 /***/ "./assets/src/js/admin/orders/export-orders.js"
@@ -87,16 +87,16 @@
87 87 /* harmony export */ });
88 88 /* harmony import */ var toastify_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! toastify-js */ "./node_modules/toastify-js/src/toastify.js");
89 89 /* harmony import */ var toastify_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(toastify_js__WEBPACK_IMPORTED_MODULE_0__);
90 90 /* harmony import */ var toastify_js_src_toastify_css__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! toastify-js/src/toastify.css */ "./node_modules/toastify-js/src/toastify.css");
91 -/**
92 - * Utils functions
93 - *
94 - * @param url
95 - * @param data
96 - * @param functions
97 - * @since 4.3.0
98 - * @version 1.0.0
91 +/**
92 + * Utils functions
93 + *
94 + * @param url
95 + * @param data
96 + * @param functions
97 + * @since 4.3.0
98 + * @version 1.0.0
99 99 */
100 100
101 101
102 102 const argsToastify = {
@@ -138,8 +138,9 @@
138 138 __webpack_require__.r(__webpack_exports__);
139 139 /* harmony export */ __webpack_require__.d(__webpack_exports__, {
140 140 /* harmony export */ debounce: () => (/* binding */ debounce),
141 141 /* harmony export */ eventHandlers: () => (/* binding */ eventHandlers),
142 +/* harmony export */ fullScreenView: () => (/* binding */ fullScreenView),
142 143 /* harmony export */ getDataOfForm: () => (/* binding */ getDataOfForm),
143 144 /* harmony export */ getFieldKeysOfForm: () => (/* binding */ getFieldKeysOfForm),
144 145 /* harmony export */ listenElementCreated: () => (/* binding */ listenElementCreated),
145 146 /* harmony export */ listenElementViewed: () => (/* binding */ listenElementViewed),
@@ -151,18 +152,19 @@
151 152 /* harmony export */ lpOnElementReady: () => (/* binding */ lpOnElementReady),
152 153 /* harmony export */ lpSetLoadingEl: () => (/* binding */ lpSetLoadingEl),
153 154 /* harmony export */ lpShowHideEl: () => (/* binding */ lpShowHideEl),
154 155 /* harmony export */ mergeDataWithDatForm: () => (/* binding */ mergeDataWithDatForm),
155 -/* harmony export */ toggleCollapse: () => (/* binding */ toggleCollapse)
156 +/* harmony export */ toggleCollapse: () => (/* binding */ toggleCollapse),
157 +/* harmony export */ toggleEnable: () => (/* binding */ toggleEnable)
156 158 /* harmony export */ });
157 -/**
158 - * Utils functions
159 - *
160 - * @param url
161 - * @param data
162 - * @param functions
163 - * @since 4.2.5.1
164 - * @version 1.0.6
159 +/**
160 + * Utils functions
161 + *
162 + * @param url
163 + * @param data
164 + * @param functions
165 + * @since 4.2.5.1
166 + * @version 1.0.7
165 167 */
166 168 const lpClassName = {
167 169 hidden: 'lp-hidden',
168 170 loading: 'loading',
@@ -167,9 +169,12 @@
167 169 hidden: 'lp-hidden',
168 170 loading: 'loading',
169 171 elCollapse: 'lp-collapse',
170 172 elSectionToggle: '.lp-section-toggle',
171 - elTriggerToggle: '.lp-trigger-toggle'
173 + elTriggerToggle: '.lp-trigger-toggle',
174 + elBtnFullScreen: '.lp-btn-full-screen-view',
175 + elFullScreen: 'lp-full-screen-view',
176 + elBtnFullScreenClose: 'lp-full-screen-view__close'
172 177 };
173 178 const lpFetchAPI = (url, data = {}, functions = {}) => {
174 179 if ('function' === typeof functions.before) {
175 180 functions.before();
@@ -191,12 +196,12 @@
191 196 }
192 197 });
193 198 };
194 199
195 -/**
196 - * Get current URL without params.
197 - *
198 - * @since 4.2.5.1
200 +/**
201 + * Get current URL without params.
202 + *
203 + * @since 4.2.5.1
199 204 */
200 205 const lpGetCurrentURLNoParam = () => {
201 206 let currentUrl = window.location.href;
202 207 const hasParams = currentUrl.includes('?');
@@ -212,14 +217,14 @@
212 217 });
213 218 return url;
214 219 };
215 220
216 -/**
217 - * Listen element viewed.
218 - *
219 - * @param el
220 - * @param callback
221 - * @since 4.2.5.8
221 +/**
222 + * Listen element viewed.
223 + *
224 + * @param el
225 + * @param callback
226 + * @since 4.2.5.8
222 227 */
223 228 const listenElementViewed = (el, callback) => {
224 229 const observerSeeItem = new IntersectionObserver(function (entries) {
225 230 for (const entry of entries) {
@@ -230,13 +235,13 @@
230 235 });
231 236 observerSeeItem.observe(el);
232 237 };
233 238
234 -/**
235 - * Listen element created.
236 - *
237 - * @param callback
238 - * @since 4.2.5.8
239 +/**
240 + * Listen element created.
241 + *
242 + * @param callback
243 + * @since 4.2.5.8
239 244 */
240 245 const listenElementCreated = callback => {
241 246 const observerCreateItem = new MutationObserver(function (mutations) {
242 247 mutations.forEach(function (mutation) {
@@ -255,14 +260,14 @@
255 260 });
256 261 // End.
257 262 };
258 263
259 -/**
260 - * Listen element created.
261 - *
262 - * @param selector
263 - * @param callback
264 - * @since 4.2.7.1
264 +/**
265 + * Listen element created.
266 + *
267 + * @param selector
268 + * @param callback
269 + * @since 4.2.7.1
265 270 */
266 271 const lpOnElementReady = (selector, callback) => {
267 272 const element = document.querySelector(selector);
268 273 if (element) {
@@ -403,17 +408,17 @@
403 408 };
404 409 return dataHandle;
405 410 };
406 411
407 -/**
408 - * Event trigger
409 - * For each list of event handlers, listen event on document.
410 - *
411 - * eventName: 'click', 'change', ...
412 - * eventHandlers = [ { selector: '.lp-button', callBack: function(){}, class: object } ]
413 - *
414 - * @param eventName
415 - * @param eventHandlers
412 +/**
413 + * Event trigger
414 + * For each list of event handlers, listen event on document.
415 + *
416 + * eventName: 'click', 'change', ...
417 + * eventHandlers = [ { selector: '.lp-button', callBack: function(){}, class: object } ]
418 + *
419 + * @param eventName
420 + * @param eventHandlers
416 421 */
417 422 const eventHandlers = (eventName, eventHandlers) => {
418 423 document.addEventListener(eventName, e => {
419 424 const target = e.target;
@@ -454,32 +459,32 @@
454 459 });
455 460 });
456 461 };
457 462
458 -/**
459 - * Debounce - delays function execution until after `wait` ms of inactivity.
460 - *
461 - * Each call resets the timer. Only the last call in a burst executes.
462 - *
463 - * USE CASES:
464 - * - Search inputs, form validation, window resize
465 - * - Multiple elements need independent timers
466 - * - When you need to call with different arguments
467 - *
468 - * EXAMPLES:
469 - * const debouncedSearch = debounce( (query) => fetchResults(query), 300 );
470 - * searchInput.addEventListener('input', (e) => debouncedSearch(e.target.value));
471 - *
472 - * const debouncedResize = debounce( recalculateLayout, 250 );
473 - * window.addEventListener('resize', debouncedResize);
474 - *
475 - * ⚠️ Create ONCE outside event handlers, not inside.
476 - *
477 - * @param {Function} func - Function to debounce (can be anonymous)
478 - * @param {number} wait - Milliseconds to wait (default: 500)
479 - * @return {Function} Debounced wrapper function
480 - * @since 4.3.7
481 - * @version 1.0.0
463 +/**
464 + * Debounce - delays function execution until after `wait` ms of inactivity.
465 + *
466 + * Each call resets the timer. Only the last call in a burst executes.
467 + *
468 + * USE CASES:
469 + * - Search inputs, form validation, window resize
470 + * - Multiple elements need independent timers
471 + * - When you need to call with different arguments
472 + *
473 + * EXAMPLES:
474 + * const debouncedSearch = debounce( (query) => fetchResults(query), 300 );
475 + * searchInput.addEventListener('input', (e) => debouncedSearch(e.target.value));
476 + *
477 + * const debouncedResize = debounce( recalculateLayout, 250 );
478 + * window.addEventListener('resize', debouncedResize);
479 + *
480 + * ⚠️ Create ONCE outside event handlers, not inside.
481 + *
482 + * @param {Function} func - Function to debounce (can be anonymous)
483 + * @param {number} wait - Milliseconds to wait (default: 500)
484 + * @return {Function} Debounced wrapper function
485 + * @since 4.3.7
486 + * @version 1.0.0
482 487 */
483 488 const debounce = (func, wait = 500) => {
484 489 let timer;
485 490 return args => {
@@ -485,8 +490,141 @@
485 490 return args => {
486 491 clearTimeout(timer);
487 492 timer = setTimeout(() => func(args), wait);
488 493 };
494 +};
495 +
496 +/**
497 + * Initialize lp-toggle-enable components.
498 + *
499 + * Finds all `.lp-toggle-enable` elements and wires up toggle behavior.
500 + * Reads initial state from `data-enabled` attribute ("true"/"false").
501 + * Calls `data-on-toggle` callback (if provided via options) on state change.
502 + *
503 + * HTML structure:
504 + * <label class="lp-toggle-enable" data-enabled="true">
505 + * <input type="checkbox" class="lp-toggle-enable__input" />
506 + * <span class="lp-toggle-enable__track"></span>
507 + * </label>
508 + *
509 + * @param {string} selector CSS selector for toggle elements (default: '.lp-toggle-enable')
510 + * @param {Function} onToggle Optional callback( el, isEnabled ) called on state change
511 + * @since 4.4.5
512 + * @version 1.0.0
513 + */
514 +window.lpToggleEnableInit = 0;
515 +const toggleEnable = (onToggle = null) => {
516 + if (window.lpToggleEnableInit) {
517 + return;
518 + }
519 + window.lpToggleEnableInit = 1;
520 + const selector = '.lp-toggle-enable';
521 + const updateUI = (toggle, isEnabled) => {
522 + toggle.classList.toggle('is-enabled', isEnabled);
523 + const input = toggle.querySelector('.lp-toggle-enable__input');
524 + if (input) {
525 + input.checked = isEnabled;
526 + input.value = isEnabled ? '1' : '0';
527 + }
528 + };
529 +
530 + // Delegate click handling via eventHandlers.
531 + eventHandlers('click', [{
532 + selector,
533 + callBack: args => {
534 + const {
535 + e,
536 + target
537 + } = args;
538 + const toggle = target.closest(selector);
539 + if (!toggle || toggle.classList.contains('is-disabled')) {
540 + return;
541 + }
542 + e.preventDefault();
543 + const isEnabled = !toggle.classList.contains('is-enabled');
544 + updateUI(toggle, isEnabled);
545 + if ('function' === typeof onToggle) {
546 + onToggle(toggle, isEnabled);
547 + }
548 + }
549 + }]);
550 +};
551 +
552 +/**
553 + * Initialize custom fullscreen view buttons.
554 + *
555 + * Delegates clicks on `.lp-btn-full-screen-view` buttons to
556 + * `lpToggleFullscreenView`. Reads the `data-target` attribute to find the
557 + * target element. Falls back to the button's parent element when
558 + * `data-target` is not provided.
559 + *
560 + * @since 4.4.5
561 + * @version 1.0.0
562 + */
563 +window.lpFullScreenViewInit = 0;
564 +const fullScreenView = () => {
565 + if (window.lpFullScreenViewInit) {
566 + return;
567 + }
568 + window.lpFullScreenViewInit = 1;
569 + let lastScrollY = 0;
570 + const lpToggleFullscreenView = (elTarget, elBtnFullScreen = null) => {
571 + const isFullscreen = elTarget.classList.contains(lpClassName.elFullScreen);
572 + if (isFullscreen) {
573 + elTarget.classList.remove(lpClassName.elFullScreen);
574 + document.documentElement.classList.remove('lp-full-screen-active');
575 + window.scrollTo(0, lastScrollY);
576 + } else {
577 + lastScrollY = window.scrollY;
578 + elTarget.classList.add(lpClassName.elFullScreen);
579 + document.documentElement.classList.add('lp-full-screen-active');
580 + }
581 + if (!isFullscreen) {
582 + if (!elTarget.querySelector(`.${lpClassName.elBtnFullScreenClose}`)) {
583 + const closeButton = document.createElement('button');
584 + closeButton.type = 'button';
585 + closeButton.className = lpClassName.elBtnFullScreenClose;
586 + closeButton.setAttribute('aria-label', 'Close');
587 + closeButton.innerHTML = lpData.i18n.closeButtonFullScreen || 'Close &times;';
588 + closeButton.addEventListener('click', e => {
589 + e.preventDefault();
590 + lpToggleFullscreenView(elTarget);
591 + });
592 + elTarget.appendChild(closeButton);
593 + }
594 + } else {
595 + const closeButton = elTarget.querySelector(`.${lpClassName.elBtnFullScreenClose}`);
596 + if (closeButton) {
597 + closeButton.remove();
598 + }
599 + }
600 + };
601 + eventHandlers('click', [{
602 + selector: lpClassName.elBtnFullScreen,
603 + callBack: args => {
604 + const {
605 + e,
606 + target
607 + } = args;
608 + const elBtnFullScreen = target.closest(lpClassName.elBtnFullScreen);
609 + if (!elBtnFullScreen) {
610 + console.log('No full screen button found');
611 + return;
612 + }
613 + e.preventDefault();
614 + let elTarget = null;
615 + const targetSelector = elBtnFullScreen.dataset.targetFullscreen;
616 + console.log(targetSelector);
617 + if (targetSelector) {
618 + elTarget = document.querySelector(targetSelector);
619 + }
620 + if (!elTarget) {
621 + console.log('No target element found');
622 + return;
623 + }
624 + lpToggleFullscreenView(elTarget, elBtnFullScreen);
625 + }
626 + }]);
489 627 };
490 628
491 629 /***/ },
492 630