/** * جاوااسکریپت مدیریت عملکردهای ادمین پنل تنظیمات پتروشیمی ها * رفع کامل باگ انتخاب مدیا برای دکمه‌های متعدد واترمارک و لوگو * مسیر فایل: inc/settings/assets/js/admin-script.js */ jQuery(document).ready(function($) { // دریافت امن آبجکت ایجکس با پشتیبانی از هر دو حالت var ajaxConfig = window.petrochemiha_ajax_obj || window.test_theme_ajax_obj || { ajax_url: ajaxurl, prefix: 'petrochemiha', nonce: '' }; function showFlashMessage(message, type) { $('.test-theme-flash-message').remove(); var icon = type === 'success' ? '✓' : '✗'; var flashHTML = '
' + '' + icon + '' + '' + message + '' + '
' + '
'; $('body').append(flashHTML); setTimeout(function() { $('.test-theme-flash-message').addClass('active'); }, 50); setTimeout(function() { $('.test-theme-flash-message').removeClass('active'); setTimeout(function() { $('.test-theme-flash-message').remove(); }, 300); }, 3500); } if ($.isFunction($.fn.wpColorPicker)) { $('.test-theme-color-picker').wpColorPicker(); } // ناوبری تب‌ها $('.test-theme-tabs-nav a').on('click', function(e) { e.preventDefault(); var targetTab = $(this).attr('href'); $('.test-theme-tabs-nav li').removeClass('active'); $(this).parent('li').addClass('active'); $('.test-theme-tab-content').removeClass('active'); $(targetTab).addClass('active'); }); // آپلود رسانه (اصلاح‌شده برای پشتیبانی همزمان از چند دکمه آپلود) $(document).on('click', '.test-theme-outline-upload-btn', function(e) { e.preventDefault(); var $button = $(this); var input_id = $button.data('input'); var preview_wrapper = $button.data('preview-wrapper'); var preview_img = $button.data('preview-img'); var custom_uploader = wp.media({ title: 'انتخاب یا آپلود تصویر', button: { text: 'قرار دادن تصویر' }, multiple: false }); custom_uploader.on('select', function() { var attachment = custom_uploader.state().get('selection').first().toJSON(); $('#' + input_id).val(attachment.url); $('#' + preview_img).attr('src', attachment.url); $('#' + preview_wrapper).css('display', 'inline-flex'); }); custom_uploader.open(); }); $(document).on('click', '.test-theme-remove-image', function(e) { e.preventDefault(); var input_id = $(this).data('input'); var preview_wrapper = $(this).data('preview-wrapper'); $('#' + input_id).val(''); $('#' + preview_wrapper).find('img').attr('src', ''); $('#' + preview_wrapper).css('display', 'none'); }); // ذخیره ایجکس $('#test-theme-ajax-form').on('submit', function(e) { e.preventDefault(); var $btn = $('#test-theme-save-btn'); var originalHtml = ' ذخیره تنظیمات'; $btn.html(' در حال ذخیره‌سازی...').prop('disabled', true); var formData = $(this).serialize(); $.ajax({ url: ajaxConfig.ajax_url, type: 'POST', dataType: 'json', data: { action: 'save_' + ajaxConfig.prefix + '_options_ajax', security: ajaxConfig.nonce, form_data: formData }, success: function(response) { if (response && response.success) { showFlashMessage(response.data.message || 'تنظیمات با موفقیت ذخیره شد.', 'success'); } else { var errorMsg = (response && response.data && response.data.message) ? response.data.message : 'خطایی در اعتبارسنجی داده‌ها رخ داد.'; showFlashMessage(errorMsg, 'error'); } }, error: function(xhr, status, error) { console.error('Save Error:', xhr.responseText); showFlashMessage('خطا در ارتباط با سرور. لطفاً مجدداً تلاش کنید.', 'error'); }, complete: function() { $btn.html(originalHtml).prop('disabled', false); } }); }); // ریست تنظیمات var $modal = $('#test-theme-reset-modal'); var $confirmInput = $('#test-theme-reset-confirm-input'); var $confirmBtn = $('#test-theme-reset-confirm-btn'); $('#test-theme-reset-trigger').on('click', function(e) { e.preventDefault(); $modal.addClass('active'); $confirmInput.val(''); $confirmBtn.prop('disabled', true); }); $('#test-theme-reset-cancel-btn, #test-theme-modal-close-btn').on('click', function() { $modal.removeClass('active'); }); $confirmInput.on('input', function() { if ($(this).val().trim() === 'بازیابی') { $confirmBtn.prop('disabled', false); } else { $confirmBtn.prop('disabled', true); } }); $confirmBtn.on('click', function(e) { e.preventDefault(); $(this).text('در حال بازنشانی...').prop('disabled', true); $.ajax({ url: ajaxConfig.ajax_url, type: 'POST', dataType: 'json', data: { action: 'reset_' + ajaxConfig.prefix + '_options_ajax', security: ajaxConfig.nonce }, success: function(response) { if (response && response.success) { $modal.removeClass('active'); showFlashMessage(response.data.message || 'تنظیمات بازنشانی شد.', 'success'); setTimeout(function() { location.reload(); }, 1200); } else { showFlashMessage('خطایی در بازنشانی رخ داد.', 'error'); } }, error: function() { showFlashMessage('خطا در برقراری ارتباط.', 'error'); }, complete: function() { $confirmBtn.text('تایید و بازنشانی کامل').prop('disabled', false); } }); }); // بکاپ و بازیابی var $importFileField = $('#test-theme-import-file'); var $importBtnTrigger = $('#test-theme-import-trigger'); var $importFilenameLabel = $('#test-theme-import-filename'); var $importStartBtn = $('#test-theme-import-btn'); var importedJSONContent = ''; $importBtnTrigger.on('click', function() { $importFileField.trigger('click'); }); $importFileField.on('change', function(e) { var file = e.target.files[0]; if (!file) return; if (file.type !== "application/json" && !file.name.endsWith('.json')) { showFlashMessage('فرمت فایل نامعتبر است. لطفاً فایل json انتخاب کنید.', 'error'); $importFileField.val(''); $importFilenameLabel.hide(); $importStartBtn.hide(); return; } $importFilenameLabel.text('فایل: ' + file.name).show(); $importStartBtn.show(); var reader = new FileReader(); reader.onload = function(evt) { importedJSONContent = evt.target.result; }; reader.readAsText(file); }); $importStartBtn.on('click', function(e) { e.preventDefault(); if (!importedJSONContent) return; if (!confirm('آیا مطمئن هستید؟ تمامی تنظیمات فعلی بازنویسی خواهند شد.')) return; var $btn = $(this); $btn.text('در حال بازیابی...').prop('disabled', true); $.ajax({ url: ajaxConfig.ajax_url, type: 'POST', dataType: 'json', data: { action: 'import_' + ajaxConfig.prefix + '_options_ajax', security: ajaxConfig.nonce, import_data: importedJSONContent }, success: function(response) { if (response && response.success) { showFlashMessage(response.data.message, 'success'); setTimeout(function() { location.reload(); }, 1200); } else { showFlashMessage(response.data.message || 'خطا در درون‌ریزی', 'error'); $btn.text('شروع بازیابی تنظیمات').prop('disabled', false); } }, error: function() { showFlashMessage('خطا در ارتباط با سرور.', 'error'); $btn.text('شروع بازیابی تنظیمات').prop('disabled', false); } }); }); });