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-tools.js +235 -97 4.3.8 → 4.4.9 View file →
@@ -1,4 +1,4 @@
1 1 /******/ (() => { // webpackBootstrap
2 2 /******/ "use strict";
3 3 /******/ var __webpack_modules__ = ({
4 4
@@ -12,13 +12,13 @@
12 12 /* harmony export */ __webpack_require__.d(__webpack_exports__, {
13 13 /* harmony export */ "default": () => (/* binding */ assignUserCourse)
14 14 /* harmony export */ });
15 15 /* harmony import */ var _utils_admin_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../utils-admin.js */ "./assets/src/js/admin/utils-admin.js");
16 -/**
17 - * Assign user to course
18 - *
19 - * @since 4.2.5.6
20 - * @version 1.0.1
16 +/**
17 + * Assign user to course
18 + *
19 + * @since 4.2.5.6
20 + * @version 1.0.1
21 21 */
22 22
23 23 function assignUserCourse() {
24 24 let elFormAssignUserCourse;
@@ -259,13 +259,13 @@
259 259 /* harmony export */ });
260 260 /* harmony import */ var _utils_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../utils.js */ "./assets/src/js/utils.js");
261 261 /* harmony import */ var tom_select__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! tom-select */ "./node_modules/tom-select/dist/esm/tom-select.complete.js");
262 262 /* harmony import */ var _api_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../api.js */ "./assets/src/js/api.js");
263 -/**
264 - * Library run on Admin
265 - *
266 - * @since 4.2.6.9
267 - * @version 1.0.1
263 +/**
264 + * Library run on Admin
265 + *
266 + * @since 4.2.6.9
267 + * @version 1.0.1
268 268 */
269 269
270 270
271 271
@@ -305,26 +305,26 @@
305 305 ...optionDefault,
306 306 ...options
307 307 };
308 308 const items_selected = options.options;
309 - /*if ( options?.options?.length > 20 ) {
310 - const chunkSize = 20;
311 - const length = options.options.length;
312 - let i = 0;
313 - const chunkedOptions = { ...options };
314 - chunkedOptions.options = items_selected.slice( i, chunkSize );
315 - const tomSelect = new TomSelect( elTomSelect, chunkedOptions );
316 - i += chunkSize;
317 - const interval = setInterval( () => {
318 - if ( i > ( length - 1 ) ) {
319 - clearInterval( interval );
320 - }
321 - const optionsSlice = items_selected.slice( i, i + chunkSize );
322 - i += chunkSize;
323 - tomSelect.addOptions( optionsSlice );
324 - tomSelect.setValue( options.items );
325 - }, 200 );
326 - return tomSelect;
309 + /*if ( options?.options?.length > 20 ) {
310 + const chunkSize = 20;
311 + const length = options.options.length;
312 + let i = 0;
313 + const chunkedOptions = { ...options };
314 + chunkedOptions.options = items_selected.slice( i, chunkSize );
315 + const tomSelect = new TomSelect( elTomSelect, chunkedOptions );
316 + i += chunkSize;
317 + const interval = setInterval( () => {
318 + if ( i > ( length - 1 ) ) {
319 + clearInterval( interval );
320 + }
321 + const optionsSlice = items_selected.slice( i, i + chunkSize );
322 + i += chunkSize;
323 + tomSelect.addOptions( optionsSlice );
324 + tomSelect.setValue( options.items );
325 + }, 200 );
326 + return tomSelect;
327 327 }*/
328 328
329 329 return new tom_select__WEBPACK_IMPORTED_MODULE_1__["default"](elTomSelect, options);
330 330 },
@@ -376,13 +376,13 @@
376 376 __webpack_require__.r(__webpack_exports__);
377 377 /* harmony export */ __webpack_require__.d(__webpack_exports__, {
378 378 /* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__)
379 379 /* harmony export */ });
380 -/**
381 - * List API on backend
382 - *
383 - * @since 4.2.6
384 - * @version 1.0.2
380 +/**
381 + * List API on backend
382 + *
383 + * @since 4.2.6
384 + * @version 1.0.2
385 385 */
386 386
387 387 const lplistAPI = {};
388 388 let lp_rest_url;
@@ -428,8 +428,9 @@
428 428 __webpack_require__.r(__webpack_exports__);
429 429 /* harmony export */ __webpack_require__.d(__webpack_exports__, {
430 430 /* harmony export */ debounce: () => (/* binding */ debounce),
431 431 /* harmony export */ eventHandlers: () => (/* binding */ eventHandlers),
432 +/* harmony export */ fullScreenView: () => (/* binding */ fullScreenView),
432 433 /* harmony export */ getDataOfForm: () => (/* binding */ getDataOfForm),
433 434 /* harmony export */ getFieldKeysOfForm: () => (/* binding */ getFieldKeysOfForm),
434 435 /* harmony export */ listenElementCreated: () => (/* binding */ listenElementCreated),
435 436 /* harmony export */ listenElementViewed: () => (/* binding */ listenElementViewed),
@@ -441,18 +442,19 @@
441 442 /* harmony export */ lpOnElementReady: () => (/* binding */ lpOnElementReady),
442 443 /* harmony export */ lpSetLoadingEl: () => (/* binding */ lpSetLoadingEl),
443 444 /* harmony export */ lpShowHideEl: () => (/* binding */ lpShowHideEl),
444 445 /* harmony export */ mergeDataWithDatForm: () => (/* binding */ mergeDataWithDatForm),
445 -/* harmony export */ toggleCollapse: () => (/* binding */ toggleCollapse)
446 +/* harmony export */ toggleCollapse: () => (/* binding */ toggleCollapse),
447 +/* harmony export */ toggleEnable: () => (/* binding */ toggleEnable)
446 448 /* harmony export */ });
447 -/**
448 - * Utils functions
449 - *
450 - * @param url
451 - * @param data
452 - * @param functions
453 - * @since 4.2.5.1
454 - * @version 1.0.6
449 +/**
450 + * Utils functions
451 + *
452 + * @param url
453 + * @param data
454 + * @param functions
455 + * @since 4.2.5.1
456 + * @version 1.0.7
455 457 */
456 458 const lpClassName = {
457 459 hidden: 'lp-hidden',
458 460 loading: 'loading',
@@ -457,9 +459,12 @@
457 459 hidden: 'lp-hidden',
458 460 loading: 'loading',
459 461 elCollapse: 'lp-collapse',
460 462 elSectionToggle: '.lp-section-toggle',
461 - elTriggerToggle: '.lp-trigger-toggle'
463 + elTriggerToggle: '.lp-trigger-toggle',
464 + elBtnFullScreen: '.lp-btn-full-screen-view',
465 + elFullScreen: 'lp-full-screen-view',
466 + elBtnFullScreenClose: 'lp-full-screen-view__close'
462 467 };
463 468 const lpFetchAPI = (url, data = {}, functions = {}) => {
464 469 if ('function' === typeof functions.before) {
465 470 functions.before();
@@ -481,12 +486,12 @@
481 486 }
482 487 });
483 488 };
484 489
485 -/**
486 - * Get current URL without params.
487 - *
488 - * @since 4.2.5.1
490 +/**
491 + * Get current URL without params.
492 + *
493 + * @since 4.2.5.1
489 494 */
490 495 const lpGetCurrentURLNoParam = () => {
491 496 let currentUrl = window.location.href;
492 497 const hasParams = currentUrl.includes('?');
@@ -502,14 +507,14 @@
502 507 });
503 508 return url;
504 509 };
505 510
506 -/**
507 - * Listen element viewed.
508 - *
509 - * @param el
510 - * @param callback
511 - * @since 4.2.5.8
511 +/**
512 + * Listen element viewed.
513 + *
514 + * @param el
515 + * @param callback
516 + * @since 4.2.5.8
512 517 */
513 518 const listenElementViewed = (el, callback) => {
514 519 const observerSeeItem = new IntersectionObserver(function (entries) {
515 520 for (const entry of entries) {
@@ -520,13 +525,13 @@
520 525 });
521 526 observerSeeItem.observe(el);
522 527 };
523 528
524 -/**
525 - * Listen element created.
526 - *
527 - * @param callback
528 - * @since 4.2.5.8
529 +/**
530 + * Listen element created.
531 + *
532 + * @param callback
533 + * @since 4.2.5.8
529 534 */
530 535 const listenElementCreated = callback => {
531 536 const observerCreateItem = new MutationObserver(function (mutations) {
532 537 mutations.forEach(function (mutation) {
@@ -545,14 +550,14 @@
545 550 });
546 551 // End.
547 552 };
548 553
549 -/**
550 - * Listen element created.
551 - *
552 - * @param selector
553 - * @param callback
554 - * @since 4.2.7.1
554 +/**
555 + * Listen element created.
556 + *
557 + * @param selector
558 + * @param callback
559 + * @since 4.2.7.1
555 560 */
556 561 const lpOnElementReady = (selector, callback) => {
557 562 const element = document.querySelector(selector);
558 563 if (element) {
@@ -693,17 +698,17 @@
693 698 };
694 699 return dataHandle;
695 700 };
696 701
697 -/**
698 - * Event trigger
699 - * For each list of event handlers, listen event on document.
700 - *
701 - * eventName: 'click', 'change', ...
702 - * eventHandlers = [ { selector: '.lp-button', callBack: function(){}, class: object } ]
703 - *
704 - * @param eventName
705 - * @param eventHandlers
702 +/**
703 + * Event trigger
704 + * For each list of event handlers, listen event on document.
705 + *
706 + * eventName: 'click', 'change', ...
707 + * eventHandlers = [ { selector: '.lp-button', callBack: function(){}, class: object } ]
708 + *
709 + * @param eventName
710 + * @param eventHandlers
706 711 */
707 712 const eventHandlers = (eventName, eventHandlers) => {
708 713 document.addEventListener(eventName, e => {
709 714 const target = e.target;
@@ -744,32 +749,32 @@
744 749 });
745 750 });
746 751 };
747 752
748 -/**
749 - * Debounce - delays function execution until after `wait` ms of inactivity.
750 - *
751 - * Each call resets the timer. Only the last call in a burst executes.
752 - *
753 - * USE CASES:
754 - * - Search inputs, form validation, window resize
755 - * - Multiple elements need independent timers
756 - * - When you need to call with different arguments
757 - *
758 - * EXAMPLES:
759 - * const debouncedSearch = debounce( (query) => fetchResults(query), 300 );
760 - * searchInput.addEventListener('input', (e) => debouncedSearch(e.target.value));
761 - *
762 - * const debouncedResize = debounce( recalculateLayout, 250 );
763 - * window.addEventListener('resize', debouncedResize);
764 - *
765 - * ⚠️ Create ONCE outside event handlers, not inside.
766 - *
767 - * @param {Function} func - Function to debounce (can be anonymous)
768 - * @param {number} wait - Milliseconds to wait (default: 500)
769 - * @return {Function} Debounced wrapper function
770 - * @since 4.3.7
771 - * @version 1.0.0
753 +/**
754 + * Debounce - delays function execution until after `wait` ms of inactivity.
755 + *
756 + * Each call resets the timer. Only the last call in a burst executes.
757 + *
758 + * USE CASES:
759 + * - Search inputs, form validation, window resize
760 + * - Multiple elements need independent timers
761 + * - When you need to call with different arguments
762 + *
763 + * EXAMPLES:
764 + * const debouncedSearch = debounce( (query) => fetchResults(query), 300 );
765 + * searchInput.addEventListener('input', (e) => debouncedSearch(e.target.value));
766 + *
767 + * const debouncedResize = debounce( recalculateLayout, 250 );
768 + * window.addEventListener('resize', debouncedResize);
769 + *
770 + * ⚠️ Create ONCE outside event handlers, not inside.
771 + *
772 + * @param {Function} func - Function to debounce (can be anonymous)
773 + * @param {number} wait - Milliseconds to wait (default: 500)
774 + * @return {Function} Debounced wrapper function
775 + * @since 4.3.7
776 + * @version 1.0.0
772 777 */
773 778 const debounce = (func, wait = 500) => {
774 779 let timer;
775 780 return args => {
@@ -775,8 +780,141 @@
775 780 return args => {
776 781 clearTimeout(timer);
777 782 timer = setTimeout(() => func(args), wait);
778 783 };
784 +};
785 +
786 +/**
787 + * Initialize lp-toggle-enable components.
788 + *
789 + * Finds all `.lp-toggle-enable` elements and wires up toggle behavior.
790 + * Reads initial state from `data-enabled` attribute ("true"/"false").
791 + * Calls `data-on-toggle` callback (if provided via options) on state change.
792 + *
793 + * HTML structure:
794 + * <label class="lp-toggle-enable" data-enabled="true">
795 + * <input type="checkbox" class="lp-toggle-enable__input" />
796 + * <span class="lp-toggle-enable__track"></span>
797 + * </label>
798 + *
799 + * @param {string} selector CSS selector for toggle elements (default: '.lp-toggle-enable')
800 + * @param {Function} onToggle Optional callback( el, isEnabled ) called on state change
801 + * @since 4.4.5
802 + * @version 1.0.0
803 + */
804 +window.lpToggleEnableInit = 0;
805 +const toggleEnable = (onToggle = null) => {
806 + if (window.lpToggleEnableInit) {
807 + return;
808 + }
809 + window.lpToggleEnableInit = 1;
810 + const selector = '.lp-toggle-enable';
811 + const updateUI = (toggle, isEnabled) => {
812 + toggle.classList.toggle('is-enabled', isEnabled);
813 + const input = toggle.querySelector('.lp-toggle-enable__input');
814 + if (input) {
815 + input.checked = isEnabled;
816 + input.value = isEnabled ? '1' : '0';
817 + }
818 + };
819 +
820 + // Delegate click handling via eventHandlers.
821 + eventHandlers('click', [{
822 + selector,
823 + callBack: args => {
824 + const {
825 + e,
826 + target
827 + } = args;
828 + const toggle = target.closest(selector);
829 + if (!toggle || toggle.classList.contains('is-disabled')) {
830 + return;
831 + }
832 + e.preventDefault();
833 + const isEnabled = !toggle.classList.contains('is-enabled');
834 + updateUI(toggle, isEnabled);
835 + if ('function' === typeof onToggle) {
836 + onToggle(toggle, isEnabled);
837 + }
838 + }
839 + }]);
840 +};
841 +
842 +/**
843 + * Initialize custom fullscreen view buttons.
844 + *
845 + * Delegates clicks on `.lp-btn-full-screen-view` buttons to
846 + * `lpToggleFullscreenView`. Reads the `data-target` attribute to find the
847 + * target element. Falls back to the button's parent element when
848 + * `data-target` is not provided.
849 + *
850 + * @since 4.4.5
851 + * @version 1.0.0
852 + */
853 +window.lpFullScreenViewInit = 0;
854 +const fullScreenView = () => {
855 + if (window.lpFullScreenViewInit) {
856 + return;
857 + }
858 + window.lpFullScreenViewInit = 1;
859 + let lastScrollY = 0;
860 + const lpToggleFullscreenView = (elTarget, elBtnFullScreen = null) => {
861 + const isFullscreen = elTarget.classList.contains(lpClassName.elFullScreen);
862 + if (isFullscreen) {
863 + elTarget.classList.remove(lpClassName.elFullScreen);
864 + document.documentElement.classList.remove('lp-full-screen-active');
865 + window.scrollTo(0, lastScrollY);
866 + } else {
867 + lastScrollY = window.scrollY;
868 + elTarget.classList.add(lpClassName.elFullScreen);
869 + document.documentElement.classList.add('lp-full-screen-active');
870 + }
871 + if (!isFullscreen) {
872 + if (!elTarget.querySelector(`.${lpClassName.elBtnFullScreenClose}`)) {
873 + const closeButton = document.createElement('button');
874 + closeButton.type = 'button';
875 + closeButton.className = lpClassName.elBtnFullScreenClose;
876 + closeButton.setAttribute('aria-label', 'Close');
877 + closeButton.innerHTML = lpData.i18n.closeButtonFullScreen || 'Close &times;';
878 + closeButton.addEventListener('click', e => {
879 + e.preventDefault();
880 + lpToggleFullscreenView(elTarget);
881 + });
882 + elTarget.appendChild(closeButton);
883 + }
884 + } else {
885 + const closeButton = elTarget.querySelector(`.${lpClassName.elBtnFullScreenClose}`);
886 + if (closeButton) {
887 + closeButton.remove();
888 + }
889 + }
890 + };
891 + eventHandlers('click', [{
892 + selector: lpClassName.elBtnFullScreen,
893 + callBack: args => {
894 + const {
895 + e,
896 + target
897 + } = args;
898 + const elBtnFullScreen = target.closest(lpClassName.elBtnFullScreen);
899 + if (!elBtnFullScreen) {
900 + console.log('No full screen button found');
901 + return;
902 + }
903 + e.preventDefault();
904 + let elTarget = null;
905 + const targetSelector = elBtnFullScreen.dataset.targetFullscreen;
906 + console.log(targetSelector);
907 + if (targetSelector) {
908 + elTarget = document.querySelector(targetSelector);
909 + }
910 + if (!elTarget) {
911 + console.log('No target element found');
912 + return;
913 + }
914 + lpToggleFullscreenView(elTarget, elBtnFullScreen);
915 + }
916 + }]);
779 917 };
780 918
781 919 /***/ },
782 920