jQuery(document).ready(function($) { 'use strict'; /** * Main WPDD Admin Object */ window.WPDD_Admin = { init: function() { this.initFileManager(); this.initPriceToggle(); this.initFormValidation(); this.initProductSync(); }, initFileManager: function() { var fileIndex = $('#wpdd-files-list .wpdd-file-item').length; // Add new file $('#wpdd-add-file').on('click', function(e) { e.preventDefault(); var template = $('#wpdd-file-template').html(); template = template.replace(/INDEX/g, fileIndex); var $newFile = $(template); $newFile.attr('data-index', fileIndex); $('#wpdd-files-list').append($newFile); fileIndex++; WPDD_Admin.updateFileIndices(); }); // Remove file $(document).on('click', '.wpdd-remove-file', function(e) { e.preventDefault(); if (confirm('Are you sure you want to remove this file?')) { $(this).closest('.wpdd-file-item').remove(); WPDD_Admin.updateFileIndices(); } }); // Upload file $(document).on('click', '.wpdd-upload-file', function(e) { e.preventDefault(); var $button = $(this); var $container = $button.closest('.wpdd-file-item'); var $urlInput = $container.find('.wpdd-file-url-input'); var $idInput = $container.find('.wpdd-file-id'); var $nameInput = $container.find('input[name*="[name]"]'); // Create file input element var $fileInput = $(''); $fileInput.on('change', function(event) { var file = event.target.files[0]; if (!file) return; // Show loading state $button.prop('disabled', true).text('Uploading...'); var formData = new FormData(); formData.append('action', 'wpdd_upload_protected_file'); formData.append('file', file); formData.append('nonce', wpdd_admin_nonce); $.ajax({ url: ajaxurl, type: 'POST', data: formData, processData: false, contentType: false, success: function(response) { if (response.success) { $urlInput.val(response.data.protected_url); $idInput.val(response.data.file_id); if (!$nameInput.val()) { $nameInput.val(file.name); } WPDD_Admin.showAdminNotice('File uploaded to protected directory', 'success'); } else { WPDD_Admin.showAdminNotice(response.data || 'Upload failed', 'error'); } $button.prop('disabled', false).text('Upload File'); }, error: function() { WPDD_Admin.showAdminNotice('Upload failed', 'error'); $button.prop('disabled', false).text('Upload File'); } }); // Clean up $fileInput.remove(); }); // Trigger file selection $('body').append($fileInput); $fileInput.trigger('click'); }); // Make files sortable if ($.fn.sortable) { $('#wpdd-files-list').sortable({ handle: '.wpdd-file-handle', placeholder: 'wpdd-file-placeholder', update: function() { WPDD_Admin.updateFileIndices(); } }); } }, moveToProtectedDirectory: function(attachmentId, $container) { $.ajax({ url: ajaxurl, type: 'POST', data: { action: 'wpdd_move_to_protected', attachment_id: attachmentId, nonce: wpdd_admin_nonce }, success: function(response) { if (response.success && response.data.protected_url) { $container.find('.wpdd-file-url-input').val(response.data.protected_url); } } }); }, updateFileIndices: function() { $('#wpdd-files-list .wpdd-file-item').each(function(index) { var $item = $(this); $item.attr('data-index', index); // Update input names $item.find('input').each(function() { var name = $(this).attr('name'); if (name) { name = name.replace(/\[\d+\]/, '[' + index + ']'); $(this).attr('name', name); } }); }); }, initPriceToggle: function() { $('#wpdd_is_free').on('change', function() { var $priceFields = $('.wpdd-price-field'); if ($(this).is(':checked')) { $priceFields.slideUp(); } else { $priceFields.slideDown(); } }).trigger('change'); }, initFormValidation: function() { // Validate PayPal settings $('input[name="wpdd_paypal_client_id"], input[name="wpdd_paypal_secret"]').on('blur', function() { var $field = $(this); var value = $field.val().trim(); if (value && value.length < 10) { $field.addClass('error'); WPDD_Admin.showAdminNotice('Invalid PayPal credential format', 'error'); } else { $field.removeClass('error'); } }); // Validate email fields $('input[type="email"]').on('blur', function() { var $field = $(this); var value = $field.val().trim(); var emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/; if (value && !emailRegex.test(value)) { $field.addClass('error'); } else { $field.removeClass('error'); } }); // Validate number fields $('input[type="number"]').on('input', function() { var $field = $(this); var value = parseFloat($field.val()); var min = parseFloat($field.attr('min')); var max = parseFloat($field.attr('max')); if (isNaN(value) || (min !== undefined && value < min) || (max !== undefined && value > max)) { $field.addClass('error'); } else { $field.removeClass('error'); } }); }, showAdminNotice: function(message, type) { type = type || 'info'; var notice = $('
' + message + '
' + '' + '