diff --git a/inc/files.php b/inc/files.php index 484559ba..db7a67ab 100644 --- a/inc/files.php +++ b/inc/files.php @@ -345,17 +345,20 @@ function ppom_upload_file() { // Deleting file function ppom_delete_file() { - $file_name = sanitize_file_name( $_REQUEST ['file_name'] ); + if ( ! isset( $_REQUEST ['file_name'] ) || ! isset( $_REQUEST['ppom_nonce'] ) ) { + echo __( 'Missing data.', 'woocommerce-product-addon' ); + die( 0 ); + } - $ppom_nonce = $_REQUEST['ppom_nonce']; + $file_name = sanitize_file_name( $_REQUEST ['file_name'] ); + $ppom_nonce = sanitize_key( $_REQUEST['ppom_nonce'] ); $file_nonce_action = 'ppom_deleting_file_action'; if ( ! wp_verify_nonce( $ppom_nonce, $file_nonce_action ) ) { - printf( __( 'Error while deleting file %s', 'woocommerce-product-addon' ), $file_name ); + printf( __( 'Verification failed for file: %s', 'woocommerce-product-addon' ), $file_name ); die( 0 ); } - $dir_path = ppom_get_dir_path(); - + $dir_path = ppom_get_dir_path(); $file_path = $dir_path . $file_name; if ( file_exists( $file_path ) && unlink( $file_path ) ) { @@ -379,7 +382,7 @@ function ppom_delete_file() { printf( __( 'Error while deleting file %s', 'woocommerce-product-addon' ), $file_path ); } } else { - printf( __( 'Error while deleting file %s', 'woocommerce-product-addon' ), $file_path ); + printf( __( 'The file %s does not exists.', 'woocommerce-product-addon' ), $file_path ); } die( 0 ); @@ -477,7 +480,7 @@ function ppom_uploaded_file_preview( $file_name, $settings ) { // Tools group $file_tools .= '
'; // $file_tools .= ''; - $file_tools .= '' . __( 'Delete', 'woocommerce-product-addon' ) . ''; + $file_tools .= ''; if ( apply_filters( 'ppom_show_image_popup', false ) ) { $file_tools .= ''; @@ -491,8 +494,10 @@ function ppom_uploaded_file_preview( $file_name, $settings ) { $file_meta .= __( 'Size: ', 'woocommerce-product-addon' ) . ppom_get_filesize_in_kb( $file_name ); $thumb_url = PPOM_URL . '/images/file.png'; - $file_tools .= ''; // delete icon - // $file_tools .= 'Delete'; //delete icon + // Tools group + $file_tools .= '
'; + $file_tools .= ''; + $file_tools .= '
'; } diff --git a/js/file-upload.js b/js/file-upload.js index ca61b54d..cab37a0d 100644 --- a/js/file-upload.js +++ b/js/file-upload.js @@ -90,53 +90,100 @@ jQuery(function($) { }); // Deleting File - $(".ppom-wrapper").on('click', '.u_i_c_tools_del', function(e) { + document.querySelector('.ppom-wrapper')?.addEventListener('click', async function(e) { + if ( + ! e.target.classList.contains('u_i_c_tools_del') || + ! plupload_instances + ) { + return; + } + e.preventDefault(); - var del_message = ppom_file_vars.delete_file_msg; - var a = confirm(del_message); - if (a) { - // it is removing from uploader instance - var fileid = $(this).closest('.ppom-file-wrapper').attr("data-fileid"); - var file_data_name = $(this).closest('div.ppom-field-wrapper').attr("data-data_name"); - // console.log(fileid); - field_file_count[file_data_name] = 0; + const delMessage = ppom_file_vars.delete_file_msg; + if ( ! confirm( delMessage ) ) return; + + const ppomFileWrapper = e.target.closest('.ppom-file-wrapper'); + const fileId = ppomFileWrapper?.getAttribute("data-fileid"); + const ppomFieldWrapper = e.target.closest('div.ppom-field-wrapper'); + const fileDataName = ppomFieldWrapper?.getAttribute("data-data_name"); - plupload_instances[file_data_name].removeFile(fileid); + if ( !fileId || !fileDataName ) return; - var filename = $('input:checkbox[name="ppom[fields][' + file_data_name + '][' + fileid + '][org]"]').val(); + field_file_count[fileDataName] = 0; - // it is removing physically if uploaded - $("#u_i_c_" + fileid).find('img').attr('src', ppom_file_vars.plugin_url + '/images/loading.gif'); + const uploaderInstance = plupload_instances[fileDataName]; + if ( uploaderInstance ) { + uploaderInstance.removeFile(fileId); + } - // console.log('filename ppom[fields][['+fileid+']'); - var data = { action: 'ppom_delete_file', file_name: filename, 'ppom_nonce': ppom_file_vars.ppom_file_delete_nonce }; + const checkbox = document.querySelector(`input[name="ppom[fields][${fileDataName}][${fileId}][org]"]`); + const fileName = checkbox?.value; - $.post(ppom_file_vars.ajaxurl, data, function(resp) { - alert(resp); - $("#u_i_c_" + fileid).hide(500).remove(); + if ( ! fileName ) return; - // it is removing for input Holder - $('input:checkbox[name="ppom[fields][' + file_data_name + '][' + fileid + '][org]"]').remove(); + // Delete animation. + const imageElement = document.querySelector(`#u_i_c_${fileId} img`); + if ( imageElement ) { + imageElement.src = `${ppom_file_vars.plugin_url}/images/loading.gif`; + } - // Removing file container - $(this).closest('.u_i_c_box').remove(); + const data = new URLSearchParams({ + action: 'ppom_delete_file', + file_name: fileName, + ppom_nonce: ppom_file_vars.ppom_file_delete_nonce + }); - // Removing cropper dom - if ($(".ppom-croppie-preview-" + fileid).length > 0) { - $(".ppom-croppie-preview-" + fileid).remove(); + try { + const response = await fetch(ppom_file_vars.ajaxurl, { + method: 'POST', + body: data, + headers: { + 'Content-Type': 'application/x-www-form-urlencoded', + 'X-Requested-With': 'XMLHttpRequest' } + }); - // Trigger - $.event.trigger({ - type: "ppom_uploaded_file_removed", - field_name: file_data_name, - fileid: fileid, + const responseText = await response.text(); + if ( ! response.ok ) { + confirm(`Error: ${responseText}`); + return; + } + + // Update UI + const fileContainer = document.querySelector(`#u_i_c_${fileId}`); + if ( fileContainer ) { + fileContainer.remove(); + } + + if ( checkbox ) { + checkbox.remove(); + } + + const parentBox = e.target.closest('.u_i_c_box'); + if ( parentBox ) { + parentBox.remove(); + } + + const croppiePreview = document.querySelector(`.ppom-croppie-preview-${fileId}`); + if ( croppiePreview ) { + croppiePreview.remove(); + } + + // Send action to PPOM_Validate + document.dispatchEvent(new CustomEvent("ppom_uploaded_file_removed", { + detail: { + field_name: fileDataName, + fileid: fileId, time: new Date() - }); + } + })); - field_file_count[file_data_name] -= 1; - }); + // Decrease file count + field_file_count[fileDataName] -= 1; + + } catch (error) { + confirm(`Error: ${error.message}`); } });