إدارة الأعضاء من لوحة الإدارة الرئيسية تتطلب التنقل بين صفحات عديدة، خاصة حين تريد تعديل بيانات عضو أو فرض قيد عليه بسرعة. هذا الكود يضيف لوحة تحكم مصغّرة تظهر داخل البيانات الشخصية للأعضاء في المواضيع، وتحتوي على ثمانية أزرار مقسمة إلى مجموعتين. المجموعة الأولى للإجراءات الإدارية: زر البطاقة لتغيير اسم المستخدم، وزر الميدالية لتغيير رتبته، وزر الزائد لإضافته إلى مجموعة، وزر الناقص لإزالته من مجموعة. أما المجموعة الثانية فللتنشيط والتعطيل: زر العضو لحظره ومنعه من الوصول إلى المنتدى، وزر الرسائل لمنعه من استخدام الرسائل الخاصة، وزر المرفقات لمنعه من إرسال المرفقات، وزر الصورة الشخصية لمنعه من تعيين صورة رمزية. ولا يمكن استخدام هذه اللوحة إلا من قبل مدير المنتدى، كما لا يستطيع المدير تغيير معلومات مؤسس المنتدى من خلالها.
كود JavaScript
العنوان: كما تريد
الصلاحيات: المدير
المكان: في المواضيع
لنسخ phpBB3 - PunBB - ModernBB - AwesomeBB
لنسخ phpBB2 - Invision
ثم اضغط على زر قدم.
بهذه اللوحة يصبح التحكم في الأعضاء أسرع بكثير، وتستطيع اتخاذ الإجراء المناسب من داخل الموضوع نفسه دون مغادرته. شكر وتقدير لصاحب الكود على هذا العمل المتقن الذي طوّره بالاستعانة بالذكاء الاصطناعي.
صاحب الكود: كونان2000
مثال على الكود
شرح تركيب الكود
كود CSSCSS:
.modern-admin-wrapper { position: relative; display: inline-flex; flex-direction: column; align-items: center; margin: 10px 0; width: 100%; font-family: tahoma, arial; }
.admin-main-trigger { background: #2c3e50; color: #fff; width: 36px; height: 36px; border-radius: 50%; display: flex; align-items: center; justify-content: center; cursor: pointer; transition: 0.3s; z-index: 10; border: 2px solid #fff; box-shadow: 0 2px 8px rgba(0,0,0,0.2); }
.admin-main-trigger.active { background: #e74c3c; transform: rotate(90deg); }
.modern-admin-menu { display: none; background: #fff; border: 1px solid #dcdde1; border-radius: 12px; padding: 12px; width: 210px; box-shadow: 0 8px 25px rgba(0,0,0,0.25); position: absolute; top: 42px; left: 50%; transform: translateX(-50%); z-index: 999; flex-direction: column; }
.modern-admin-menu.show { display: flex; }
.close-admin-menu { padding: 2px 5px; position: absolute; top: 2px; right: 3px; cursor: pointer; background: #e74c3c; color: #fff; font-size: 14px; transition: 0.2s; border-radius: 3px; }
.admin-header-h1,.admin-header { width: 100%; font-size: 10px; color: #fff; text-align: center; font-weight: bold; padding: 2px 0; margin: 5px 0; border-radius: 3px; }
span.admin-header {background: #0186fb;margin-top: 22px;}
span.admin-header-h1 {background: #F44336;}
.modern-admin-menu.show hr {border: 1px solid #c9c4c4;}
.name-edit-container {display: flex;}
.admin-tools-row { background: #f8f9fa; display: flex; justify-content: space-around; padding: 6px 0; border-radius: 6px; margin: 3px 0; }
.admin-icon-btn { cursor: pointer; font-size: 17px; padding: 5px; border-radius: 5px; transition: 0.2s; opacity: 0.8; }
.btn-edit-name { color: #27ae60; } .btn-rank { color: #8f7200; } .btn-add-grp { color: #9b59b6; } .btn-rem-grp { color: #e74c3c; }
.modern-admin-menu.show .select:after {display: none;}
select.quick-admin-select.sel-rem.open-arrow,select.quick-admin-select.sel-add.open-arrow,select.quick-admin-select.sel-rank.open-arrow {padding: 0 4px;margin: 0;font-size: 13px;font-weight: bold;}
select.quick-admin-select.sel-rem.open-arrow {color: #b31100 !important;}
select.quick-admin-select.sel-add.open-arrow {color: #8427ab !important;}
select.quick-admin-select.sel-rank.open-arrow {color: #8f7200 !important;}
.quick-admin-select { width: 100%; height: 33px;text-align: center;font-size: 15px !important;padding: 0 !important; margin-top: 5px; display: none; border: 1px solid #ddd; border-radius: 4px; background: #fff; cursor: pointer; -webkit-appearance: none; -moz-appearance: none; appearance: none; background-repeat: no-repeat; background-position: right 8px center; background-size: 12px; transition: 0.3s; }
.sel-rank {background-size: 20px;background-position: right; background-image: url("data:image/svg+xml;charset=UTF-8,%3Csvg xmlns=\'http://www.w3.org/2000/svg\' viewBox=\'0 0 24 24\' fill=\'none\' stroke=\'%238f7200\' stroke-width=\'3\' stroke-linecap=\'round\' stroke-linejoin=\'round\'%3E%3Cpolyline points=\'6 9 12 15 18 9\'%3E%3C/polyline%3E%3C/svg%3E"); }
.sel-add {background-size: 20px;background-position: right; background-image: url("data:image/svg+xml;charset=UTF-8,%3Csvg xmlns=\'http://www.w3.org/2000/svg\' viewBox=\'0 0 24 24\' fill=\'none\' stroke=\'%239b59b6\' stroke-width=\'3\' stroke-linecap=\'round\' stroke-linejoin=\'round\'%3E%3Cpolyline points=\'6 9 12 15 18 9\'%3E%3C/polyline%3E%3C/svg%3E"); }
.sel-rem {background-size: 20px;background-position: right; background-image: url("data:image/svg+xml;charset=UTF-8,%3Csvg xmlns=\'http://www.w3.org/2000/svg\' viewBox=\'0 0 24 24\' fill=\'none\' stroke=\'%23e74c3c\' stroke-width=\'3\' stroke-linecap=\'round\' stroke-linejoin=\'round\'%3E%3Cpolyline points=\'6 9 12 15 18 9\'%3E%3C/polyline%3E%3C/svg%3E"); }
.status-indicator {background: #dcdfd8; cursor: pointer; font-size: 17px; padding: 5px; opacity: 0.8; }
.status-on { color: #009688 !important; } .status-off, .status-banned {background: #edd9d7 !important; color: #990606 !important; }
.admin-icon-btn:hover {background: #56abf5;color: #fff;}
.admin-icon-btn {background: #dddddd;border: dotted 1px #b9b9b9;}
.edit-name-pop { display: flex; gap: 3px; margin-top: 5px; background: #f1f2f6; padding: 4px; border-radius: 4px; }
.edit-name-pop input { flex: 1;font-size: 16px;padding: 3px;border: 1px solid #27ae60;outline: none;width: 100%;font-weight: 900;text-align: center;font-family: none; }
.edit-name-pop button { background: #27ae60; color: #fff; border: none; padding: 3px 6px; cursor: pointer; font-size: 10px; border-radius: 3px; }
.fa-spin-custom { animation: fa-spin 1s infinite linear; }
.edit-name-pop input::selection { background: #c1f8ff;color: #000000;}
i.fas.fa-user-check.status-indicator.stat-active.status-banned:after,i.fas.fa-paperclip.status-indicator.stat-att.status-off:after,i.fas.fa-image.status-indicator.stat-avatar.status-off:after,i.fas.fa-envelope.status-indicator.stat-pm.status-off:after {content: "\f00d" !important;position: absolute;color: #e74c3c;display: inline-block;}
.user:has(.modern-admin-menu.show) {overflow: initial;}كود JavaScript
العنوان: كما تريد
الصلاحيات: المدير
المكان: في المواضيع
لنسخ phpBB3 - PunBB - ModernBB - AwesomeBB
JavaScript:
$(document).ready(function() {
if (!document.querySelector('link[href*="font-awesome"]')) {
$('head').append('<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.15.4/css/all.min.css">');
}
$('head').append('<link rel="stylesheet" href="https://fonts.googleapis.com/icon?family=Material+Icons">');
function cleanText(text) {
if (!text) return "";
const iconsToStrip = ['verified_user', 'thumb_up', 'alternate_email', 'settings', 'star', 'person', 'shield', 'admin_panel_settings', 'build'];
let cleaned = text;
iconsToStrip.forEach(icon => { cleaned = cleaned.split(icon).join(''); });
return cleaned.trim();
}
const versionSelectors = {
awesomebb: { profile: '.post-aside', name: '.post-author-name', rank: '.post-author-title', anchor: '.post-author-name a' },
phpbb3: { profile: '.postprofile', name: 'dt strong', rank: 'dd', anchor: 'dt a' },
punbb: { profile: '.user', name: '.username', rank: '.user-basic-info', anchor: '.username a' },
modernbb: { profile: '.postprofile', name: '.postprofile-name', rank: '.postprofile-rank', anchor: '.postprofile-name a' }
};
function getProfileSelectors() {
if ($('.post-aside').length) return versionSelectors.awesomebb;
if ($('.postprofile dt').length && !$('.postprofile-name').length) return versionSelectors.phpbb3;
if ($('.user .username').length) return versionSelectors.punbb;
if ($('.postprofile-name').length) return versionSelectors.modernbb;
return null;
}
const sel = getProfileSelectors();
if (!sel) return;
var allGroups = [], ranksList = "";
var tid = ($("a[href*='tid=']").attr('href') || "").match(/tid=([a-z0-9]+)/)?.[1] || "";
function setupInterface() {
$(sel.profile).each(function() {
var $aside = $(this);
if ($aside.find('a[href^="/u"]').length === 0) return;
if ($aside.find('.modern-admin-wrapper').length === 0) {
var html = `
<div class="modern-admin-wrapper">
<div class="admin-main-trigger" title="Quick Control Panel"><i class="fas fa-tools"></i></div>
<div class="modern-admin-menu">
<i class="fas fa-times close-admin-menu" title="clos"></i>
<span class="admin-header">الإجراءات الإدارية</span>
<div class="admin-tools-row">
<i class="fas fa-id-card admin-icon-btn btn-edit-name" title="تغيير الاسم"></i>
<i class="fas fa-medal admin-icon-btn btn-rank" title="تغيير الرتبة"></i>
<i class="fas fa-plus-circle admin-icon-btn btn-add-grp" title="أضف الى مجموعة"></i>
<i class="fas fa-minus-circle admin-icon-btn btn-rem-grp" title="ازالة من المجموعة"></i>
</div>
<div class="name-edit-container" style="display:none; margin: 10px 0;">
<input type="text" class="quick-admin-input input-new-name" placeholder="اكتب الاسم الجديد" style="width: 80%; padding: 5px; border-radius: 4px; border: 1px solid #ddd;">
<button class="save-name-btn" style="background: #28a745; color: #fff; border: none; padding: 5px 8px; border-radius: 4px; cursor: pointer;"><i class="fas fa-check"></i></button>
</div>
<select class="quick-admin-select sel-rank" style="display:none;"><option value="NO_RANK_SELECTED">جاري التغير...</option></select>
<select class="quick-admin-select sel-add" style="display:none;"><option value="">+ مجموعة</option></select>
<select class="quick-admin-select sel-rem" style="display:none;"><option value="">- مجموعة</option></select>
<hr>
<span class="admin-header-h1">تنشيط/تعطيل</span>
<div class="admin-tools-row">
<i class="fas fa-user-check status-indicator stat-active" data-field="user_status" title="العضو"></i>
<i class="fas fa-envelope status-indicator stat-pm" data-field="user_allowpm" title="الرسائل الخاصة"></i>
<i class="fas fa-paperclip status-indicator stat-att" data-field="user_allow_att" title="المرفقات"></i>
<i class="fas fa-image status-indicator stat-avatar" data-field="user_allowavatar" title="الصورة الرمزية"></i>
</div>
</div>
</div>`;
$aside.find(sel.name).first().before(html);
}
});
}
setupInterface();
$(document).on('click', '.admin-main-trigger', function() { $(this).toggleClass('active').next('.modern-admin-menu').toggleClass('show'); });
$(document).on('click', '.close-admin-menu', function() { $(this).closest('.modern-admin-menu').removeClass('show').prev('.admin-main-trigger').removeClass('active'); });
function hideAllInputs($menu) {
$menu.find('.quick-admin-select').hide();
$menu.find('.name-edit-container').hide();
}
$(document).on('click', '.btn-edit-name', function() {
var $menu = $(this).closest('.modern-admin-menu');
var $container = $menu.find('.name-edit-container');
var isVisible = $container.is(':visible');
hideAllInputs($menu);
if (!isVisible) $container.show().find('input').focus();
});
$(document).on('click', '.btn-rank, .btn-add-grp, .btn-rem-grp', function() {
var $btn = $(this), $menu = $btn.closest('.modern-admin-menu');
var targetSelect = $btn.hasClass('btn-rank') ? '.sel-rank' : ($btn.hasClass('btn-add-grp') ? '.sel-add' : '.sel-rem');
var isVisible = $menu.find(targetSelect).is(':visible');
hideAllInputs($menu);
if (!isVisible) $menu.find(targetSelect).show();
});
if (tid) {
$.get("/admin/?part=users_groups&sub=groups&tid=" + tid, function(data) {
$(data).find('a[href*="mode=editgroup"]').each(function() {
var $row = $(this).closest('tr');
var $groupLink = $row.find('td a').not('[href*="mode=editgroup"]').first();
if ($groupLink.length) {
allGroups.push({ name: cleanText($groupLink.text().trim()), link: $(this).attr('href') });
}
});
refreshAllUsersStatus();
});
}
function refreshAllUsersStatus() {
$(sel.profile).each(function() {
var $aside = $(this), uLink = $aside.find(sel.anchor).attr('href') || "", uId = uLink.match(/\/u(\d+)/)?.[1];
if (uId && tid) {
$.get("/admin/?part=users_groups&sub=users&mode=edit&u=" + uId + "&tid=" + tid, function(userData) {
var $h = $(userData);
var realUserName = $h.find('input[name="username_edit"]').val();
$aside.data('real-username', realUserName);
['user_status', 'user_allowpm', 'user_allow_att', 'user_allowavatar'].forEach(function(f) {
var $i = $aside.find('[data-field="'+f+'"]').removeClass('status-on status-off status-banned');
if (f==='user_status' && $h.find('input[name="user_status"][value="-1"]').is(':checked')) $i.addClass('status-banned').data('current-val', '-1');
else { var chk = $h.find('#'+f+'_yes').is(':checked'); $i.addClass(chk?'status-on':'status-off').data('current-val', chk?'1':'0'); }
});
var uGrps = [];
$h.find('a[href*="mode=editgroup"]').each(function() { uGrps.push(cleanText($(this).text().trim())); });
var addO = '<option value="">+ مجموعة</option>', remO = '<option value="">- مجموعة</option>';
allGroups.forEach(function(g) {
if (uGrps.indexOf(g.name) > -1) remO += `<option value="${g.link}">${g.name}</option>`;
else addO += `<option value="${g.link}">${g.name}</option>`;
});
$aside.find('.sel-add').html(addO); $aside.find('.sel-rem').html(remO);
if (!ranksList) {
var rO = '<option value="NO_RANK_SELECTED">الرتبة...</option>';
$h.find('select[name="user_rank"] option').each(function() { rO += `<option value="${$(this).val()}">${cleanText($(this).text())}</option>`; });
ranksList = rO;
}
$aside.find('.sel-rank').html(ranksList);
});
}
});
}
$(document).on('click', '.save-name-btn', function() {
var $aside = $(this).closest(sel.profile), $input = $(this).siblings('.input-new-name'), newName = $input.val().trim();
if (!newName) return;
var uId = $aside.find(sel.anchor).attr('href').match(/\/u(\d+)/)[1];
$(this).html('<i class="fas fa-spinner fa-spin"></i>').prop('disabled', true);
var url = "/admin/?part=users_groups&sub=users&mode=edit&u=" + uId + "&tid=" + tid;
$.get(url, function(d) {
var $f = $(d).find('form#post'), data = $f.serializeArray();
$.each(data, function(i, x){ if(x.name=="username_edit") x.value = newName; });
var sub = $f.find('input[type="submit"]').first();
data.push({name: sub.attr('name'), value: sub.val()});
$.post(url, data, function(){ location.reload(); });
});
});
$(document).on('change', '.quick-admin-select', function() {
var $s = $(this), val = $s.val(), $aside = $s.closest(sel.profile), uId = $aside.find(sel.anchor).attr('href').match(/\/u(\d+)/)[1];
if (!val || val === "NO_RANK_SELECTED") return;
$s.prop('disabled', true).css('opacity', '0.5');
if ($s.hasClass('sel-rank')) {
var url = "/admin/?part=users_groups&sub=users&mode=edit&u=" + uId + "&tid=" + tid;
$.get(url, function(d) {
var $f = $(d).find('form#post'), data = $f.serializeArray();
$.each(data, function(i, v) { if (v.name === "user_rank") v.value = val; });
var sub = $f.find('input[type="submit"]').first();
data.push({name: sub.attr('name'), value: sub.val()});
$.post(url, data, function() { location.reload(); });
});
} else {
var isAdd = $s.hasClass('sel-add');
var realName = $aside.data('real-username');
$.get(val, function(p) {
var $f = $(p).find('form'), data = $f.serializeArray();
if (isAdd) {
$.each(data, function(i, v) { if (v.name === 'useradd') v.value = realName; });
var subBtn = $f.find('input[name="add_user_action"]');
data.push({name: 'add_user_action', value: subBtn.val()});
$.post(val, data, function() { location.reload(); });
} else {
var dId = "";
$(p).find('a[href*="u=' + uId + '"], a[href$="/u' + uId + '"], a[href*="u/' + uId + '"]').each(function() {
var $check = $(this).closest('tr').find('input[name="user_delete[]"]');
if ($check.length) dId = $check.val();
});
if (dId) {
data.push({name: 'user_delete[]', value: dId});
data.push({name: 'user_delete_action', value: $f.find('input[name="user_delete_action"]').val()});
$.post(val, data, function() { location.reload(); });
} else {
console.log("لم يتم العثور على معرف العضو في جدول المجموعة.");
$s.prop('disabled', false).css('opacity', '1');
}
}
});
}
});
$(document).on('click', '.status-indicator', function() {
var $i = $(this), f = $i.data('field'), cur = $i.data('current-val'), uId = $i.closest(sel.profile).find(sel.anchor).attr('href').match(/\/u(\d+)/)[1];
var nxt = (f === "user_status") ? (cur == "1" ? "-1" : "1") : (cur == "1" ? "0" : "1");
$i.addClass('fa-spin').css('opacity', '0.5');
var url = "/admin/?part=users_groups&sub=users&mode=edit&u=" + uId + "&tid=" + tid;
$.get(url, function(d) {
var $f = $(d).find('form#post'), data = $f.serializeArray();
$.each(data, function(i, v) { if (v.name === f) v.value = nxt; });
var sub = $f.find('input[type="submit"]').first();
data.push({name: sub.attr('name'), value: sub.val()});
$.post(url, data, function() { refreshAllUsersStatus(); $i.removeClass('fa-spin').css('opacity', '1'); });
});
});
// ===== by كونان2000 =====
});لنسخ phpBB2 - Invision
JavaScript:
$(document).ready(function() {
if (!document.querySelector('link[href*="font-awesome"]')) {
$('head').append('<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.15.4/css/all.min.css">');
}
$('head').append('<link rel="stylesheet" href="https://fonts.googleapis.com/icon?family=Material+Icons">');
function cleanText(text) {
if (!text) return "";
const iconsToStrip = ['verified_user', 'thumb_up', 'alternate_email', 'settings', 'star', 'person', 'shield', 'admin_panel_settings', 'build'];
let cleaned = text;
iconsToStrip.forEach(icon => { cleaned = cleaned.split(icon).join(''); });
return cleaned.trim();
}
const versionSelectors = {
phpbb2: {
profile: 'td[class^="row"]',
name: '.name',
anchor: '.name a[href^="/u"]'
},
invision: {
profile: '.postprofile-details',
name: 'dt',
anchor: 'dt a[href^="/u"]'
}
};
function getProfileSelectors() {
if ($('td[class^="row"] .name').length) return versionSelectors.phpbb2;
if ($('.postprofile-details dt').length) return versionSelectors.invision;
return null;
}
const sel = getProfileSelectors();
if (!sel) return;
var allGroups = [], ranksList = "";
var tid = ($("a[href*='tid=']").attr('href') || "").match(/tid=([a-z0-9]+)/)?.[1] || "";
function setupInterface() {
$(sel.profile).each(function() {
var $aside = $(this);
if ($aside.find('a[href^="/u"]').length === 0) return;
if ($aside.find('.modern-admin-wrapper').length === 0) {
var html = `
<div class="modern-admin-wrapper">
<div class="admin-main-trigger" title="Quick Control Panel"><i class="fas fa-tools"></i></div>
<div class="modern-admin-menu">
<i class="fas fa-times close-admin-menu" title="clos"></i>
<span class="admin-header">الإجراءات الإدارية</span>
<div class="admin-tools-row">
<i class="fas fa-id-card admin-icon-btn btn-edit-name" title="تغيير الاسم"></i>
<i class="fas fa-medal admin-icon-btn btn-rank" title="تغيير الرتبة"></i>
<i class="fas fa-plus-circle admin-icon-btn btn-add-grp" title="اضف الى مجموعة"></i>
<i class="fas fa-minus-circle admin-icon-btn btn-rem-grp" title="ازالة من المجموعة"></i>
</div>
<div class="name-edit-container" style="display:none; margin: 10px 0;">
<input type="text" class="quick-admin-input input-new-name" placeholder="اكتب الاسم الجديد" style="width: 80%; padding: 5px; border-radius: 4px; border: 1px solid #ddd;">
<button class="save-name-btn" style="background: #28a745; color: #fff; border: none; padding: 5px 8px; border-radius: 4px; cursor: pointer;"><i class="fas fa-check"></i></button>
</div>
<select class="quick-admin-select sel-rank" style="display:none;"><option value="NO_RANK_SELECTED">جاري التغير...</option></select>
<select class="quick-admin-select sel-add" style="display:none;"><option value="">+ مجموعة</option></select>
<select class="quick-admin-select sel-rem" style="display:none;"><option value="">- مجموعة</option></select>
<hr>
<span class="admin-header-h1">تنشيط/تعطيل</span>
<div class="admin-tools-row">
<i class="fas fa-user-check status-indicator stat-active" data-field="user_status" title="عضو"></i>
<i class="fas fa-envelope status-indicator stat-pm" data-field="user_allowpm" title="الرسائل الخاصة"></i>
<i class="fas fa-paperclip status-indicator stat-att" data-field="user_allow_att" title="المرفقات"></i>
<i class="fas fa-image status-indicator stat-avatar" data-field="user_allowavatar" title="الصورة الرمزية"></i>
</div>
</div>
</div>`;
$aside.find(sel.name).first().before(html);
}
});
}
setupInterface();
$(document).on('click', '.admin-main-trigger', function() { $(this).toggleClass('active').next('.modern-admin-menu').toggleClass('show'); });
$(document).on('click', '.close-admin-menu', function() { $(this).closest('.modern-admin-menu').removeClass('show').prev('.admin-main-trigger').removeClass('active'); });
function hideAllInputs($menu) {
$menu.find('.quick-admin-select').hide();
$menu.find('.name-edit-container').hide();
}
$(document).on('click', '.btn-edit-name', function() {
var $menu = $(this).closest('.modern-admin-menu');
var $container = $menu.find('.name-edit-container');
var isVisible = $container.is(':visible');
hideAllInputs($menu);
if (!isVisible) $container.show().find('input').focus();
});
$(document).on('click', '.btn-rank, .btn-add-grp, .btn-rem-grp', function() {
var $btn = $(this), $menu = $btn.closest('.modern-admin-menu');
var targetSelect = $btn.hasClass('btn-rank') ? '.sel-rank' : ($btn.hasClass('btn-add-grp') ? '.sel-add' : '.sel-rem');
var isVisible = $menu.find(targetSelect).is(':visible');
hideAllInputs($menu);
if (!isVisible) $menu.find(targetSelect).show();
});
if (tid) {
$.get("/admin/?part=users_groups&sub=groups&tid=" + tid, function(data) {
$(data).find('a[href*="mode=editgroup"]').each(function() {
var $row = $(this).closest('tr');
var $groupLink = $row.find('td a').not('[href*="mode=editgroup"]').first();
if ($groupLink.length) {
allGroups.push({ name: cleanText($groupLink.text().trim()), link: $(this).attr('href') });
}
});
refreshAllUsersStatus();
});
}
function refreshAllUsersStatus() {
$(sel.profile).each(function() {
var $aside = $(this), uLink = $aside.find(sel.anchor).attr('href') || "", uId = uLink.match(/\/u(\d+)/)?.[1];
if (uId && tid) {
$.get("/admin/?part=users_groups&sub=users&mode=edit&u=" + uId + "&tid=" + tid, function(userData) {
var $h = $(userData);
var realUserName = $h.find('input[name="username_edit"]').val();
$aside.data('real-username', realUserName);
['user_status', 'user_allowpm', 'user_allow_att', 'user_allowavatar'].forEach(function(f) {
var $i = $aside.find('[data-field="'+f+'"]').removeClass('status-on status-off status-banned');
if (f==='user_status' && $h.find('input[name="user_status"][value="-1"]').is(':checked')) $i.addClass('status-banned').data('current-val', '-1');
else { var chk = $h.find('#'+f+'_yes').is(':checked'); $i.addClass(chk?'status-on':'status-off').data('current-val', chk?'1':'0'); }
});
var uGrps = [];
$h.find('a[href*="mode=editgroup"]').each(function() { uGrps.push(cleanText($(this).text().trim())); });
var addO = '<option value="">+ مجموعة</option>', remO = '<option value="">- مجموعة</option>';
allGroups.forEach(function(g) {
if (uGrps.indexOf(g.name) > -1) remO += `<option value="${g.link}">${g.name}</option>`;
else addO += `<option value="${g.link}">${g.name}</option>`;
});
$aside.find('.sel-add').html(addO); $aside.find('.sel-rem').html(remO);
if (!ranksList) {
var rO = '<option value="NO_RANK_SELECTED">الرتبة...</option>';
$h.find('select[name="user_rank"] option').each(function() { rO += `<option value="${$(this).val()}">${cleanText($(this).text())}</option>`; });
ranksList = rO;
}
$aside.find('.sel-rank').html(ranksList);
});
}
});
}
$(document).on('click', '.save-name-btn', function() {
var $aside = $(this).closest(sel.profile), $input = $(this).siblings('.input-new-name'), newName = $input.val().trim();
if (!newName) return;
var uId = $aside.find(sel.anchor).attr('href').match(/\/u(\d+)/)[1];
$(this).html('<i class="fas fa-spinner fa-spin"></i>').prop('disabled', true);
var url = "/admin/?part=users_groups&sub=users&mode=edit&u=" + uId + "&tid=" + tid;
$.get(url, function(d) {
var $f = $(d).find('form#post'), data = $f.serializeArray();
$.each(data, function(i, x){ if(x.name=="username_edit") x.value = newName; });
var sub = $f.find('input[type="submit"]').first();
data.push({name: sub.attr('name'), value: sub.val()});
$.post(url, data, function(){ location.reload(); });
});
});
$(document).on('change', '.quick-admin-select', function() {
var $s = $(this), val = $s.val(), $aside = $s.closest(sel.profile), uId = $aside.find(sel.anchor).attr('href').match(/\/u(\d+)/)[1];
if (!val || val === "NO_RANK_SELECTED") return;
$s.prop('disabled', true).css('opacity', '0.5');
if ($s.hasClass('sel-rank')) {
var url = "/admin/?part=users_groups&sub=users&mode=edit&u=" + uId + "&tid=" + tid;
$.get(url, function(d) {
var $f = $(d).find('form#post'), data = $f.serializeArray();
$.each(data, function(i, v) { if (v.name === "user_rank") v.value = val; });
var sub = $f.find('input[type="submit"]').first();
data.push({name: sub.attr('name'), value: sub.val()});
$.post(url, data, function() { location.reload(); });
});
} else {
var isAdd = $s.hasClass('sel-add');
var realName = $aside.data('real-username');
$.get(val, function(p) {
var $f = $(p).find('form'), data = $f.serializeArray();
if (isAdd) {
$.each(data, function(i, v) { if (v.name === 'useradd') v.value = realName; });
var subBtn = $f.find('input[name="add_user_action"]');
data.push({name: 'add_user_action', value: subBtn.val()});
$.post(val, data, function() { location.reload(); });
} else {
var dId = "";
$(p).find('a[href*="u=' + uId + '"], a[href$="/u' + uId + '"], a[href*="u/' + uId + '"]').each(function() {
var $check = $(this).closest('tr').find('input[name="user_delete[]"]');
if ($check.length) dId = $check.val();
});
if (dId) {
data.push({name: 'user_delete[]', value: dId});
data.push({name: 'user_delete_action', value: $f.find('input[name="user_delete_action"]').val()});
$.post(val, data, function() { location.reload(); });
} else {
console.log("لم يتم العثور على معرف العضو في جدول المجموعة.");
$s.prop('disabled', false).css('opacity', '1');
}
}
});
}
});
$(document).on('click', '.status-indicator', function() {
var $i = $(this), f = $i.data('field'), cur = $i.data('current-val'), uId = $i.closest(sel.profile).find(sel.anchor).attr('href').match(/\/u(\d+)/)[1];
var nxt = (f === "user_status") ? (cur == "1" ? "-1" : "1") : (cur == "1" ? "0" : "1");
$i.addClass('fa-spin').css('opacity', '0.5');
var url = "/admin/?part=users_groups&sub=users&mode=edit&u=" + uId + "&tid=" + tid;
$.get(url, function(d) {
var $f = $(d).find('form#post'), data = $f.serializeArray();
$.each(data, function(i, v) { if (v.name === f) v.value = nxt; });
var sub = $f.find('input[type="submit"]').first();
data.push({name: sub.attr('name'), value: sub.val()});
$.post(url, data, function() { refreshAllUsersStatus(); $i.removeClass('fa-spin').css('opacity', '1'); });
});
});
// ===== by كونان2000 =====
});ثم اضغط على زر قدم.
بهذه اللوحة يصبح التحكم في الأعضاء أسرع بكثير، وتستطيع اتخاذ الإجراء المناسب من داخل الموضوع نفسه دون مغادرته. شكر وتقدير لصاحب الكود على هذا العمل المتقن الذي طوّره بالاستعانة بالذكاء الاصطناعي.
صاحب الكود: كونان2000
التعديل الأخير: