# learnpress/4.4.10/assets/src/js/frontend/course-builder/builder-lesson/builder-tab-lesson.js

LearnPress – WordPress LMS Plugin for Create and Sell Online Courses, version 4.4.10. 562 lines.

- Page: https://pluginprobe.com/plugins/learnpress/4.4.10/code/assets/src/js/frontend/course-builder/builder-lesson/builder-tab-lesson.js
- Raw: https://pluginprobe.com/plugins/learnpress/4.4.10/raw/assets/src/js/frontend/course-builder/builder-lesson/builder-tab-lesson.js
- Modified: 2026-10-09T07:39:42+00:00

Line numbers below start at 1. Link to a line or a range by appending a fragment to the
page URL, for example `https://pluginprobe.com/plugins/learnpress/4.4.10/code/assets/src/js/frontend/course-builder/builder-lesson/builder-tab-lesson.js#L10-L20`.

```javascript
import * as lpUtils from 'lpAssetsJsPath/utils.js';
import * as lpToastify from 'lpAssetsJsPath/lpToastify.js';
import SweetAlert from 'sweetalert2';
import { SWAL_ICON_DELETE, SWAL_ICON_DUPLICATE, SWAL_ICON_TRASH_DRAFT } from '../swal-icons.js';

export class BuilderTabLesson {
	constructor() {
		this.init();
	}

	static selectors = {
		elLessonItem: '.lesson-item',
		elLessonExpandedItems: '.lesson-action-expanded__items',
		elLessonDuplicate: '.lesson-action-expanded__duplicate',
		elLessonTrash: '.lesson-action-expanded__trash',
		elLessonRestore: '.lesson-action-expanded__restore',
		elLessonPublish: '.lesson-action-expanded__publish',
		elLessonDelete: '.lesson-action-expanded__delete',
		elLessonActionExpanded: '.lesson-action-expanded',
		elLessonStatus: '.lesson-status',
		elLessonPreview: '.lesson__preview.lp-btn-set-preview-item',
	};

	init() {
		this.events();
	}

	events() {
		if ( BuilderTabLesson._loadedEvents ) {
			return;
		}
		BuilderTabLesson._loadedEvents = true;

		lpUtils.eventHandlers( 'click', [
			{
				selector: BuilderTabLesson.selectors.elLessonDuplicate,
				class: this,
				callBack: this.duplicateLesson.name,
			},
			{
				selector: BuilderTabLesson.selectors.elLessonTrash,
				class: this,
				callBack: this.trashLesson.name,
			},
			{
				selector: BuilderTabLesson.selectors.elLessonPublish,
				class: this,
				callBack: this.publishLesson.name,
			},
			{
				selector: BuilderTabLesson.selectors.elLessonRestore,
				class: this,
				callBack: this.restoreLesson.name,
			},
			{
				selector: BuilderTabLesson.selectors.elLessonDelete,
				class: this,
				callBack: this.deleteLesson.name,
			},
			{
				selector: BuilderTabLesson.selectors.elLessonActionExpanded,
				class: this,
				callBack: this.toggleExpandedAction.name,
			},
			{
				selector: BuilderTabLesson.selectors.elLessonPreview,
				class: this,
				callBack: this.toggleLessonPreview.name,
			},
		] );

		document.addEventListener( 'click', ( e ) => {
			if ( ! e.target.closest( BuilderTabLesson.selectors.elLessonActionExpanded ) ) {
				this.closeAllExpanded();
			}
		} );

		document.addEventListener( 'lp-builder-popup-saved', ( e ) => {
			const { type, id, data } = e.detail;
			if ( type !== 'lesson' || ! data?.list_item_html ) return;
			const elItem = document.querySelector( `.lesson-item[data-lesson-id="${ id }"]` );
			if ( elItem ) {
				this.replaceItemHtml( elItem.closest( '.lesson' ), data.list_item_html );
			}
		} );

		document.addEventListener( 'lp-builder-popup-trashed', ( e ) => {
			const { type, id, data } = e.detail;
			if ( type !== 'lesson' || ! data?.html ) return;
			const elItem = document.querySelector( `.lesson-item[data-lesson-id="${ id }"]` );
			if ( elItem ) {
				this.replaceItemHtml( elItem.closest( '.lesson' ), data.html );
			}
		} );
	}

	duplicateLesson( args ) {
		const { target } = args;
		const elLessonDuplicate = target.closest( BuilderTabLesson.selectors.elLessonDuplicate );
		const elLessonItem = elLessonDuplicate.closest( BuilderTabLesson.selectors.elLessonItem );

		if ( ! elLessonItem ) {
			return;
		}

		const elActionExpanded = elLessonItem.querySelector(
			BuilderTabLesson.selectors.elLessonActionExpanded
		);
		const lessonId = elLessonItem.dataset.lessonId || '';

		SweetAlert.fire( {
			title: elLessonDuplicate.dataset.title || 'Duplicate Lesson',
			text: elLessonDuplicate.dataset.content || 'Are you sure you want to duplicate this lesson?',
			iconHtml: SWAL_ICON_DUPLICATE,
			customClass: { icon: 'lp-cb-swal-icon-html' },
			showCloseButton: true,
			showCancelButton: true,
			cancelButtonText: lpData.i18n.cancel,
			confirmButtonText: lpData.i18n.yes,
			reverseButtons: true,
		} ).then( ( result ) => {
			if ( result.isConfirmed ) {
				lpUtils.lpSetLoadingEl( elActionExpanded, 1 );

				const dataSend = {
					action: 'duplicate_lesson',
					args: {
						id_url: 'duplicate-lesson',
					},
					lesson_id: lessonId,
				};

				const callBack = {
					success: ( response ) => {
						const { status, message, data } = response;
						lpToastify.show( message || 'Duplicated successfully!', status );

						if ( data?.html ) {
							const elLesson = elLessonDuplicate.closest( '.lesson' );
							const elLessonList = elLesson.closest( '.lessons-list' ) || elLesson.parentElement;

							if ( elLessonList ) {
								elLessonList.insertAdjacentHTML( 'afterbegin', data.html );
								const newLesson = elLessonList.firstElementChild;

								if ( newLesson ) {
									newLesson.scrollIntoView( {
										behavior: 'smooth',
										block: 'nearest',
									} );
									newLesson.classList.add( 'highlight-new-lesson' );
									setTimeout( () => {
										newLesson.classList.remove( 'highlight-new-lesson' );
									}, 1500 );
								}
							}
						}
					},
					error: ( error ) => {
						lpToastify.show( error.message || error, 'error' );
					},
					completed: () => {
						lpUtils.lpSetLoadingEl( elActionExpanded, 0 );
					},
				};

				window.lpAJAXG.fetchAJAX( dataSend, callBack );
			}
		} );
	}

	trashLesson( args ) {
		const { target } = args;
		const elLessonTrash = target.closest( BuilderTabLesson.selectors.elLessonTrash );
		const elLessonItem = elLessonTrash.closest( BuilderTabLesson.selectors.elLessonItem );

		if ( ! elLessonItem ) {
			return;
		}

		const elActionExpanded = elLessonItem.querySelector(
			BuilderTabLesson.selectors.elLessonActionExpanded
		);
		const lessonId = elLessonItem.dataset.lessonId || '';

		SweetAlert.fire( {
			title: elLessonTrash.dataset.title || 'Trash Lesson',
			text:
				elLessonTrash.dataset.content ||
				'Are you sure? Moving it to the trash will cause this item to be removed from the course.',
			iconHtml: SWAL_ICON_TRASH_DRAFT,
			customClass: { icon: 'lp-cb-swal-icon-html' },
			showCloseButton: true,
			showCancelButton: true,
			cancelButtonText: lpData.i18n.cancel,
			confirmButtonText: lpData.i18n.yes,
			reverseButtons: true,
		} ).then( ( result ) => {
			if ( result.isConfirmed ) {
				lpUtils.lpSetLoadingEl( elActionExpanded, 1 );

				const dataSend = {
					action: 'move_trash_lesson',
					args: {
						id_url: 'move-trash-lesson',
					},
					lesson_id: lessonId,
				};

				const callBack = {
					success: ( response ) => {
						const { status, message, data } = response;
						lpToastify.show( message, status );

						if ( data?.html ) {
							this.replaceItemHtml( elLessonTrash.closest( '.lesson' ), data.html );
						}
					},
					error: ( error ) => {
						lpToastify.show( error.message || error, 'error' );
					},
					completed: () => {
						lpUtils.lpSetLoadingEl( elActionExpanded, 0 );
					},
				};

				window.lpAJAXG.fetchAJAX( dataSend, callBack );
			}
		} );
	}

	publishLesson( args ) {
		const { target } = args;
		const elLessonPublish = target.closest( BuilderTabLesson.selectors.elLessonPublish );
		const elLessonItem = elLessonPublish.closest( BuilderTabLesson.selectors.elLessonItem );

		if ( ! elLessonItem ) {
			return;
		}

		const elActionExpanded = elLessonItem.querySelector(
			BuilderTabLesson.selectors.elLessonActionExpanded
		);
		lpUtils.lpSetLoadingEl( elActionExpanded, 1 );

		const lessonId = elLessonItem.dataset.lessonId || '';

		const dataSend = {
			action: 'move_trash_lesson',
			args: {
				id_url: 'move-trash-lesson',
			},
			lesson_id: lessonId,
			status: 'publish',
		};

		const callBack = {
			success: ( response ) => {
				const { status, message, data } = response;
				lpToastify.show( message, status );
				if ( data?.html ) {
					this.replaceItemHtml( elLessonPublish.closest( '.lesson' ), data.html );
				}
			},
			error: ( error ) => {
				lpToastify.show( error.message || error, 'error' );
			},
			completed: () => {
				lpUtils.lpSetLoadingEl( elActionExpanded, 0 );
			},
		};

		window.lpAJAXG.fetchAJAX( dataSend, callBack );
	}

	restoreLesson( args ) {
		const { target } = args;
		const elLessonRestore = target.closest( BuilderTabLesson.selectors.elLessonRestore );
		const elLessonItem = elLessonRestore.closest( BuilderTabLesson.selectors.elLessonItem );

		if ( ! elLessonItem ) {
			return;
		}

		const elActionExpanded = elLessonItem.querySelector(
			BuilderTabLesson.selectors.elLessonActionExpanded
		);
		lpUtils.lpSetLoadingEl( elActionExpanded, 1 );

		const lessonId = elLessonItem.dataset.lessonId || '';

		const dataSend = {
			action: 'move_trash_lesson',
			args: {
				id_url: 'move-trash-lesson',
			},
			lesson_id: lessonId,
			status: 'draft',
		};

		const callBack = {
			success: ( response ) => {
				const { status, message, data } = response;
				lpToastify.show( message, status );
				if ( data?.html ) {
					this.replaceItemHtml( elLessonRestore.closest( '.lesson' ), data.html );
				}
			},
			error: ( error ) => {
				lpToastify.show( error.message || error, 'error' );
			},
			completed: () => {
				lpUtils.lpSetLoadingEl( elActionExpanded, 0 );
			},
		};

		window.lpAJAXG.fetchAJAX( dataSend, callBack );
	}

	deleteLesson( args ) {
		const { target } = args;
		const elLessonDelete = target.closest( BuilderTabLesson.selectors.elLessonDelete );
		const elLessonItem = elLessonDelete.closest( BuilderTabLesson.selectors.elLessonItem );

		if ( ! elLessonItem ) {
			return;
		}

		const elActionExpanded = elLessonItem.querySelector(
			BuilderTabLesson.selectors.elLessonActionExpanded
		);
		const lessonId = elLessonItem.dataset.lessonId || '';

		if ( ! lessonId ) {
			return;
		}

		SweetAlert.fire( {
			title: elLessonDelete.dataset.title || 'Delete Lesson',
			text:
				elLessonDelete.dataset.content ||
				'Are you sure you want to permanently delete this lesson?',
			iconHtml: SWAL_ICON_DELETE,
			customClass: { icon: 'lp-cb-swal-icon-html' },
			showCloseButton: true,
			showCancelButton: true,
			cancelButtonText: lpData.i18n.cancel,
			confirmButtonText: lpData.i18n.yes,
			reverseButtons: true,
		} ).then( ( result ) => {
			if ( result.isConfirmed ) {
				lpUtils.lpSetLoadingEl( elActionExpanded, 1 );

				const dataSend = {
					action: 'move_trash_lesson',
					args: {
						id_url: 'move-trash-lesson',
					},
					lesson_id: lessonId,
					status: 'delete',
				};

				const callBack = {
					success: ( response ) => {
						const { status, message } = response;
						lpToastify.show( message, status );

						if ( status === 'success' ) {
							const elLesson = elLessonDelete.closest( '.lesson' );
							elLesson.style.transition = 'opacity 0.4s ease-out, transform 0.4s ease-out';
							elLesson.style.opacity = '0';
							elLesson.style.transform = 'translateX(160px)';

							setTimeout( () => {
								elLesson.remove();
							}, 400 );
						}
					},
					error: ( error ) => {
						lpToastify.show( error.message || error, 'error' );
					},
					completed: () => {
						lpUtils.lpSetLoadingEl( elActionExpanded, 0 );
					},
				};

				window.lpAJAXG.fetchAJAX( dataSend, callBack );
			}
		} );
	}

	toggleExpandedAction( args ) {
		const { target } = args;
		const elLessonActionExpanded = target.closest(
			BuilderTabLesson.selectors.elLessonActionExpanded
		);

		if ( ! elLessonActionExpanded ) {
			return;
		}

		const elLessonItem = elLessonActionExpanded.closest( BuilderTabLesson.selectors.elLessonItem );

		if ( ! elLessonItem ) {
			return;
		}

		const elExpandedItems = elLessonItem.querySelector(
			BuilderTabLesson.selectors.elLessonExpandedItems
		);

		if ( ! elExpandedItems ) {
			return;
		}

		this.closeAllExpanded( elExpandedItems );
		const willOpen = ! elExpandedItems.classList.contains( 'active' );

		if ( willOpen ) {
			elExpandedItems.classList.add( 'active' );
			elLessonActionExpanded.classList.add( 'active' );
			this.setExpandedDirection( elExpandedItems );
		} else {
			elExpandedItems.classList.remove( 'active' );
			elExpandedItems.classList.remove( 'is-dropup' );
			elLessonActionExpanded.classList.remove( 'active' );
		}
	}

	closeAllExpanded( excludeElement = null ) {
		const allExpandedItems = document.querySelectorAll(
			`${ BuilderTabLesson.selectors.elLessonExpandedItems }.active`
		);

		allExpandedItems.forEach( ( item ) => {
			if ( item === excludeElement ) {
				return;
			}

			item.classList.remove( 'active' );
			item.classList.remove( 'is-dropup' );

			const lessonItem = item.closest( BuilderTabLesson.selectors.elLessonItem );

			if ( ! lessonItem ) {
				return;
			}

			const expandedBtn = lessonItem.querySelector(
				BuilderTabLesson.selectors.elLessonActionExpanded
			);
			if ( expandedBtn ) {
				expandedBtn.classList.remove( 'active' );
			}
		} );
	}

	setExpandedDirection( elExpandedItems ) {
		if ( ! elExpandedItems ) {
			return;
		}

		elExpandedItems.classList.remove( 'is-dropup' );

		const elLesson = elExpandedItems.closest( '.lesson' );
		if ( ! elLesson ) {
			return;
		}

		if ( elLesson.matches( ':last-child' ) ) {
			elExpandedItems.classList.add( 'is-dropup' );
		}
	}

	/* Toggle preview for a lesson in the lesson list */
	toggleLessonPreview( args ) {
		const { target } = args;
		const elPreviewBtn = target.closest( BuilderTabLesson.selectors.elLessonPreview );
		if ( ! elPreviewBtn ) {
			return;
		}
		if (
			elPreviewBtn.classList.contains( 'loading' ) ||
			elPreviewBtn.classList.contains( 'lp-loading' )
		) {
			return;
		}

		const elLessonItem = elPreviewBtn.closest( BuilderTabLesson.selectors.elLessonItem );
		if ( ! elLessonItem ) {
			return;
		}

		const icon = elPreviewBtn.querySelector( 'a' );
		if ( ! icon ) {
			return;
		}

		const lessonId = elLessonItem.dataset.lessonId || elPreviewBtn.dataset.id || '';
		if ( ! lessonId ) {
			return;
		}

		// Optimistic toggle
		icon.classList.toggle( 'lp-icon-eye' );
		icon.classList.toggle( 'lp-icon-eye-slash' );

		const enablePreview = icon.classList.contains( 'lp-icon-eye' );

		lpUtils.lpSetLoadingEl( elPreviewBtn, 1 );
		elPreviewBtn.classList.add( 'lp-loading' );

		const dataSend = {
			action: 'builder_update_lesson',
			args: { id_url: 'builder-update-lesson' },
			lesson_id: lessonId,
			lesson_settings: true,
			_lp_preview: enablePreview ? 'yes' : '',
			return_html: 'yes',
		};

		const callBack = {
			success: ( response ) => {
				const { status, message, data } = response;
				lpToastify.show( message, status );

				if ( status === 'error' ) {
					// Revert on error
					icon.classList.toggle( 'lp-icon-eye' );
					icon.classList.toggle( 'lp-icon-eye-slash' );
				} else if ( data?.list_item_html ) {
					this.replaceItemHtml( elLessonItem, data.list_item_html );
				}
			},
			error: ( error ) => {
				lpToastify.show( error.message || error, 'error' );
				icon.classList.toggle( 'lp-icon-eye' );
				icon.classList.toggle( 'lp-icon-eye-slash' );
			},
			completed: () => {
				lpUtils.lpSetLoadingEl( elPreviewBtn, 0 );
				elPreviewBtn.classList.remove( 'lp-loading' );
			},
		};

		window.lpAJAXG.fetchAJAX( dataSend, callBack );
	}

	replaceItemHtml( elLesson, html ) {
		if ( ! elLesson || ! html ) {
			return;
		}

		const nextLesson = elLesson.nextElementSibling;
		elLesson.insertAdjacentHTML( 'afterend', html.trim() );
		const newLesson = elLesson.nextElementSibling;
		if ( newLesson && newLesson !== nextLesson ) {
			elLesson.remove();
		}
	}
}

```
