File: /home/mahdetej/public_html/wp-content/plugins/Melli-shild/assets/js/admin.js
/**
* Melli Shield — shared admin UI
*/
(function ($) {
'use strict';
var cfg = window.melli_shield_ajax || {};
function servicesTextarea() {
return $('textarea.msh-services-textarea, textarea[name="melli_shield_allowed_services"], textarea[name="melli_shield_allowed_services"]').first();
}
function initSidebar() {
var $sidebar = $('#ms-sidebar');
var $backdrop = $('#ms-sidebar-backdrop');
var $toggle = $('#ms-sidebar-toggle');
if (!$sidebar.length || !$toggle.length) {
return;
}
function openSidebar() {
$sidebar.addClass('is-open');
$backdrop.addClass('is-open').attr('aria-hidden', 'false');
$toggle.attr('aria-expanded', 'true');
}
function closeSidebar() {
$sidebar.removeClass('is-open');
$backdrop.removeClass('is-open').attr('aria-hidden', 'true');
$toggle.attr('aria-expanded', 'false');
}
$toggle.on('click', function () {
if ($sidebar.hasClass('is-open')) {
closeSidebar();
} else {
openSidebar();
}
});
$backdrop.on('click', closeSidebar);
$sidebar.find('a').on('click', function () {
if (window.matchMedia('(max-width: 900px)').matches) {
closeSidebar();
}
});
$(document).on('keydown', function (e) {
if (e.key === 'Escape') {
closeSidebar();
}
});
}
// Mode switch confirm
$(document).on('submit', '.msh-mode-switch-form', function (e) {
var msg = (cfg.strings && cfg.strings.confirm_mode) ? cfg.strings.confirm_mode : 'آیا از تغییر حالت مطمئن هستید؟';
if (!window.confirm(msg)) {
e.preventDefault();
}
});
// URL probe
$(document).on('click', '#msh-probe-btn', function () {
var $btn = $(this);
var url = $('#msh-probe-url').val().trim();
var $result = $('#msh-probe-result');
if (!url) {
return;
}
$btn.prop('disabled', true).text('در حال بررسی...');
$.post(cfg.ajax_url, {
action: 'melli_shield_probe_url',
url: url,
_wpnonce: cfg.nonce
})
.done(function (res) {
if (!res.success) {
$result
.removeClass('is-allowed')
.addClass('is-visible msh-probe__result is-blocked')
.html('<strong>خطا:</strong> ' + (res.data && res.data.message ? res.data.message : 'ناموفق'));
return;
}
var d = res.data;
$result
.removeClass('is-blocked is-allowed')
.addClass('is-visible msh-probe__result ' + (d.blocked ? 'is-blocked' : 'is-allowed'))
.html(
'<strong>' + (d.blocked ? 'مسدود میشود' : 'مجاز است') + '</strong><br>' +
'دامنه: <code>' + $('<span>').text(d.domain).html() + '</code><br>' +
'حالت: ' + $('<span>').text(d.mode_label).html() + '<br>' +
$('<span>').text(d.reason).html()
);
})
.fail(function () {
$result
.removeClass('is-allowed')
.addClass('is-visible msh-probe__result is-blocked')
.html('<strong>خطا در ارتباط با سرور</strong>');
})
.always(function () {
$btn.prop('disabled', false).text('بررسی URL');
});
});
// Quick-add service domains
$(document).on('click', '.msh-quick-add', function () {
var $btn = $(this);
var $t = servicesTextarea();
if (!$t.length) {
return;
}
var originalLabel = $btn.data('original-label') || $btn.text().replace(/^[✅☑️]\s*/, '').trim();
$btn.data('original-label', originalLabel);
var cur = $t.val().trim();
var existing = cur ? cur.split('\n').map(function (d) { return d.trim().toLowerCase(); }) : [];
var toAdd = [];
String($btn.data('domains') || '').split('\n').forEach(function (d) {
d = d.trim().toLowerCase();
if (d && existing.indexOf(d) === -1) {
toAdd.push(d);
}
});
if (toAdd.length > 0) {
$t.val(cur ? cur + '\n' + toAdd.join('\n') : toAdd.join('\n'));
$btn.addClass('is-added').prop('disabled', true).text('+' + originalLabel + ' (' + toAdd.length + ')');
setTimeout(function () {
$btn.removeClass('is-added').prop('disabled', false).text('+' + originalLabel);
}, 2500);
} else {
$btn.prop('disabled', true).text('موجود: ' + originalLabel);
setTimeout(function () {
$btn.prop('disabled', false).text('+' + originalLabel);
}, 1500);
}
});
// Init quick-add labels
$('.msh-quick-add').each(function () {
var $b = $(this);
if (!$b.data('original-label')) {
$b.data('original-label', $b.text().replace(/^\+/, '').trim());
}
});
function initToasts() {
if (!$('body').hasClass('melli-shield-admin')) {
return;
}
var $root = $('#msh-toast-root');
if (!$root.length) {
$root = $('<div id="msh-toast-root" class="msh-toast-root" aria-live="polite" aria-atomic="true"></div>');
$('body').append($root);
}
function noticeType($el) {
if ($el.hasClass('msh-notice--success') || $el.hasClass('notice-success') || $el.hasClass('updated')) {
return 'success';
}
if ($el.hasClass('msh-notice--error') || $el.hasClass('notice-error') || $el.hasClass('error')) {
return 'error';
}
if ($el.hasClass('msh-notice--warning') || $el.hasClass('notice-warning')) {
return 'warning';
}
return 'info';
}
function extractMessage($el) {
var $clone = $el.clone();
$clone.find('button, .notice-dismiss').remove();
var text = $.trim($clone.text());
return text.replace(/\s+/g, ' ');
}
function showToast(message, type, duration) {
if (!message) {
return;
}
type = type || 'success';
duration = duration || 4200;
var $toast = $('<div class="msh-toast msh-toast--' + type + '" role="status"></div>');
$toast.text(message);
$root.append($toast);
window.setTimeout(function () {
$toast.addClass('is-leaving');
window.setTimeout(function () {
$toast.remove();
}, 240);
}, duration);
}
window.MelliShieldToast = showToast;
var selectors = [
'.wrap > .msh-notice',
'.msh-wrap .msh-notice',
'.msh-wrap .notice',
'#wpbody-content .wrap .notice'
].join(', ');
$(selectors).each(function () {
var $el = $(this);
if ($el.data('msh-toast-done')) {
return;
}
if ($el.hasClass('msh-notice--info') && !$el.hasClass('msh-notice--toast-source')) {
return;
}
var msg = extractMessage($el);
if (!msg) {
return;
}
var type = noticeType($el);
if (type === 'info' && !$el.hasClass('msh-notice--toast-source')) {
return;
}
$el.data('msh-toast-done', 1);
showToast(msg, type);
$el.addClass('msh-notice--toast-source').attr('hidden', 'hidden').hide();
});
}
initSidebar();
initToasts();
})(jQuery);