Sindbad~EG File Manager

Current Path : /home/escuelai/public_html/wp-content/plugins/learnpress/assets/src/js/admin/
Upload File :
Current File : /home/escuelai/public_html/wp-content/plugins/learnpress/assets/src/js/admin/course-material.js

document.addEventListener( 'DOMContentLoaded', function() {
	const $ = window.jQuery;
	const postID = document.getElementById( 'current-material-post-id' ).value,
		max_file_size = document.getElementById( 'material-max-file-size' ).value,
		accept_file = document.querySelector( '.lp-material--field-upload' ).getAttribute( 'accept' ).split( ',' ),
		can_upload = document.getElementById( 'available-to-upload' ),
		add_btn = document.getElementById( 'btn-lp--add-material' ),
		group_template = document.getElementById( 'lp-material--add-material-template' ),
		material__group_container = document.getElementById( 'lp-material--group-container' ),
		material_tab = document.getElementById( 'lp-material-container' ),
		material_save_btn = document.getElementById( 'btn-lp--save-material' );
	const getResponse = async ( ele, postID ) => {
		const elementMaterial = document.querySelector( '.lp-material--table tbody' );
		try {
			const url = `${ lpDataAdmin.lp_rest_url }lp/v1/material/item-materials/${ postID }`;
			fetch( url, {
				method: 'GET',
				headers: {
					'X-WP-Nonce': lpGlobalSettings.nonce,
					'Content-Type': 'application/json',
				},
			} )
				.then( ( response ) => response.json() )
				.then( ( response ) => {
					const { data, status } = response;
					if ( status !== 'success' ) {
						console.error( response.message );
						return;
					}

					if ( data && data.items && data.items.length > 0 ) {
						const materials = data.items;
						if ( ele.querySelector( '.lp-skeleton-animation' ) ) {
							ele.querySelector( '.lp-skeleton-animation' ).remove();
						}
						for ( let i = 0; i < materials.length; i++ ) {
							insertRow( elementMaterial, materials[ i ] );
						}
					}
				} )
				.catch( ( err ) => console.log( err ) );
		} catch ( error ) {
			console.log( error.message );
		}
	};
	const insertRow = ( parent, data ) => {
		if ( ! parent ) {
			return;
		}
		const delete_btn_text = document.getElementById( 'delete-material-row-text' ).value;
		parent.insertAdjacentHTML(
			'beforeend',
			`<tr data-id="${ data.file_id }" data-sort="${ data.orders }" >
              <td class="sort"><span class="dashicons dashicons-menu"></span> ${ data.file_name }</td>
              <td>${ capitalizeFirstChar( data.method ) }</td>
              <td><a href="javascript:void(0)" class="delete-material-row" data-id="${ data.file_id }">${ delete_btn_text }</a></td>
            </tr>`
		);
	};
	const capitalizeFirstChar = ( str ) => str.charAt( 0 ).toUpperCase() + str.substring( 1 );
	//load material data from API
	getResponse( material_tab, postID );

	//add material group field
	add_btn.addEventListener( 'click', function( e ) {
		const can_upload_data = ~~this.getAttribute( 'can-upload' );
		const groups = material__group_container.querySelectorAll( '.lp-material--group' ).length;
		if ( groups >= can_upload_data ) {
			return false;
		}
		material__group_container.insertAdjacentHTML( 'afterbegin', group_template.innerHTML );
	} );
	//switch input when change method between "upload" and "external"
	material_tab.addEventListener( 'change', function( event ) {
		const target = event.target;
		if ( target.classList.contains( 'lp-material--field-method' ) ) {
			const method = target.value;
			const upload_field_template = document.getElementById( 'lp-material--upload-field-template' ).innerHTML,
				external_field_template = document.getElementById( 'lp-material--external-field-template' ).innerHTML;
			switch ( method ) {
			case 'upload' :
				target.parentNode.insertAdjacentHTML( 'afterend', upload_field_template );
				target.closest( '.lp-material--group' ).querySelector( '.lp-material--external-wrap' ).remove();
				break;
			case 'external' :
				target.parentNode.insertAdjacentHTML( 'afterend', external_field_template );
				target.closest( '.lp-material--group' ).querySelector( '.lp-material--upload-wrap' ).remove();
				break;
			}
		}
		if ( target.classList.contains( 'lp-material--field-upload' ) ) {
			if ( target.value && target.files.length > 0 ) {
				if ( ! accept_file.includes( target.files[ 0 ].type ) ) {
					alert( 'This file is not allowed! Please choose another file!' );
					target.value = '';
				} else if ( target.files[ 0 ].size > max_file_size * 1024 * 1024 ) {
					alert( `This file size is greater than ${ max_file_size }MB! Please choose another file!` );
					target.value = '';
				}
			}
		}
	} );
	// Dynamic click action ...
	material_tab.addEventListener( 'click', function( event ) {
		const target = event.target;
		if ( target.classList.contains( 'lp-material--delete' ) && target.nodeName == 'BUTTON' ) {
			target.closest( '.lp-material--group' ).remove();
		} else if ( target.classList.contains( 'lp-material-save-field' ) ) {
			// save a file
			let material = target.closest( '.lp-material--group' );
			material = singleNode( material );
			// target.classList.add( 'loading' );
			lpSaveMaterial( material, true, target );
			// target.classList.remove( 'loading' );
		}
		return false;
	} );

	//save all material files
	material_save_btn.addEventListener( 'click', function( event ) {
		const materials = material__group_container.querySelectorAll( '.lp-material--group' );
		if ( materials.length > 0 ) {
			// material_save_btn.classList.add( 'loading' );
			lpSaveMaterial( materials, false, material_save_btn );
			// material_save_btn.classList.remove( 'loading' );
		}
	} );
	function lpSaveMaterial( materials, is_single = false, target ) {
		if ( materials.length > 0 ) {
			let material_data = [];
			let formData = new FormData(),
				send_request = true;

			materials.forEach( function( ele, index ) {
				const label = ele.querySelector( '.lp-material--field-title' ).value,
					method = ele.querySelector( '.lp-material--field-method' ).value,
					external_field = ele.querySelector( '.lp-material--field-external-link' ),
					upload_field = ele.querySelector( '.lp-material--field-upload' );
				let file, link;
				if ( ! label ) {
					send_request = false;
				}
				switch ( method ) {
				case 'upload' :
					if ( upload_field.value ) {
						file = upload_field.files[ 0 ].name;
						link = '';
						formData.append( 'file[]', upload_field.files[ 0 ] );
					} else {
						send_request = false;
					}
					break;
				case 'external' :
					link = external_field.value;
					file = '';
					if ( ! link ) {
						send_request = false;
					}
					break;
				}
				material_data.push( { label, method, file, link } );
			} );

			if ( ! send_request ) {
				alert( 'Enter file title, choose file or enter file link!' );
			} else {
				// console.log(material_data);
				material_data = JSON.stringify( material_data );
				const url = `${ lpGlobalSettings.rest }lp/v1/material/item-materials/${ postID }`;
				formData.append( 'data', material_data );
				target.classList.add( 'loading' );

				fetch( url, {
					method: 'POST',
					headers: {
						'X-WP-Nonce': lpGlobalSettings.nonce,
					},
					body: formData,
				} ) // wrapped
					.then( ( res ) => res.text() )
					.then( ( resString ) => {
						// console.log( data );
						if ( ! is_single ) {
							material__group_container.innerHTML = '';
						} else {
							materials[ 0 ].remove();
						}
						const res = JSON.parse( resString );
						const { message, data, status } = res;
						alert( message );

						if ( status === 'success' ) {
							if ( data.length > 0 ) {
								const material_table = document.querySelector( '.lp-material--table' );
								const thead = material_table.querySelector( 'thead' );
								const tbody = material_table.querySelector( 'tbody' );

								thead.classList.remove( 'hidden' );
								for ( let i = 0; i < data.length; i++ ) {
									const row = data[ i ];
									insertRow( tbody, row );
								}
								can_upload.innerText = parseInt( can_upload.innerText ) - data.length;
								add_btn.setAttribute( 'can-upload', can_upload.innerText );
							}
						}
					} )
					.finally( () => {
						target.classList.remove( 'loading' );
					} )
					.catch( ( err ) => console.log( err ) );
			}
		}
	}
	//delete material
	document.addEventListener( 'click', function( e ) {
		const target = e.target;
		if ( target.classList.contains( 'delete-material-row' ) && target.nodeName == 'A' ) {
			const rowID = target.getAttribute( 'data-id' ), //material file ID
				message = document.getElementById( 'delete-material-message' ).value;//Delete message content
			if ( confirm( message ) ) {
				wp.apiFetch( {
					path: `lp/v1/material/${ rowID }`,
					method: 'DELETE',
					data: {
						item_id: postID,
					},
				} ).then( ( res ) => {
					// console.log( res );
					if ( res.status !== 200 || ! res.delete ) {
						alert( res.message );
					} else {
						target.closest( 'tr' ).remove();
						can_upload.innerText = ~~can_upload.innerText + 1;
						add_btn.setAttribute( 'can-upload', ~~can_upload.innerText );
					}
				} ).catch( ( err ) => {
					console.log( err );
				} ).finally( () => {

				} );
			}
		}
	} );
	const singleNode = ( ( nodeList ) => ( node ) => {
		const layer = { // define our specific case
			0: { value: node, enumerable: true },
			length: { value: 1 },
			item: {
				value( i ) {
					return this[ +i || 0 ];
				},
				enumerable: true,
			},
		};
		return Object.create( nodeList, layer ); // put our case on top of true NodeList
	} )( document.createDocumentFragment().childNodes ); // scope a true NodeList
	$( '.lp-material--table tbody' ).sortable( {
		items: 'tr',
		cursor: 'move',
		axis: 'y',
		handle: 'td.sort',
		scrollSensitivity: 40,
		forcePlaceholderSize: true,
		helper: 'clone',
		opacity: 0.65,
		update( event, ui ) {
			$( this ).sortable( 'option', 'disabled', true );
			updateSort();
			$( this ).sortable( 'option', 'disabled', false );
		},
	} );
	function updateSort() {
		const items = $( '.lp-material--table tbody tr' ),
			data = [];
		// $( ".lp-material--table tbody tr" ).sortable( "option", "disabled", true );
		items.each( function( i, item ) {
			$( this ).attr( 'data-sort', i + 1 );
			data.push( { file_id: ~~$( this ).attr( 'data-id' ), orders: i + 1 } );
		} );
		wp.apiFetch( {
			path: `lp/v1/material/item-materials/${ postID }`,
			method: 'PUT',
			data: {
				sort_arr: JSON.stringify( data ),
			},
		} ).then( ( res ) => {
			if ( res.status == 200 ) {
				//
			} else {
				alert( 'Sort table fail.' );
			}
		} ).catch( ( err ) => {
			console.log( err );
		} ).finally( () => {

		} );
		// $( ".lp-material--table tbody tr" ).sortable( "option", "disabled", false );
		// console.log( data );
	}
} );

Sindbad File Manager Version 1.0, Coded By Sindbad EG ~ The Terrorists