Version 3.2.3
This commit is contained in:
1 parent
ae5c01cc78
commit
78706903a2
2641 files changed
+228363
-201264
No files matched your search
@@ -0,0 +1,656 @@
|
||||
// ************************************ //
|
||||
// Member List //
|
||||
// ************************************ //
|
||||
var memberlist = {};
|
||||
|
||||
(function($){
|
||||
|
||||
memberlist = function($){
|
||||
//-------------------------------------
|
||||
// PROPERTIES
|
||||
var currentOptions = {
|
||||
st: 0,
|
||||
type: 'all',
|
||||
string: '',
|
||||
order_by: 'joined',
|
||||
order_direction: 'desc'
|
||||
},
|
||||
coreOptions = ['st', 'type', 'string', 'order_by', 'order_direction'],
|
||||
request_url = '',
|
||||
table = null,
|
||||
isAdvSearching = false,
|
||||
searchTimeout = null,
|
||||
lastVal = '',
|
||||
resultsCache = {};
|
||||
|
||||
//-------------------------------------
|
||||
// PUBLIC METHODS
|
||||
var init = function( url, defaultType ){
|
||||
request_url = url;
|
||||
table = $("#member_list");
|
||||
defaultType = defaultType ? defaultType : 'all';
|
||||
|
||||
// Set up events
|
||||
$("#member_types a").click( toggleType ); // Toggle bar
|
||||
$("#member_search").focus( focusSearch ).blur( blurSearch ); // Search box
|
||||
$(".sortable", table).click( sortTable ); // Column headers
|
||||
$(".member_action", table).live('click', doAction ); // Row action
|
||||
$(".mass_action", table).live('click', doMassAction ); // Mass action
|
||||
$("#mfooter_spam .spam_action").live('click', doSpamAction); // Spam action
|
||||
$(".check_all", table).live('click', checkAll ); // "Check All"
|
||||
$("#member_results input:checkbox").live("click", checkOne); // Check one
|
||||
$(".pagination a").live('click', hijackPagination ); // Hijack navigation
|
||||
$("#advanced_member_search").click( showAdvancedSearch ); // Advanced search
|
||||
$("#memberListForm").submit( function(e){ e.preventDefault(); } ); // Stop form submission
|
||||
|
||||
prepareAdvancedSearch();
|
||||
preparePruneAndMove();
|
||||
|
||||
if( window.location.hash ){
|
||||
parseHash();
|
||||
} else {
|
||||
//loadDefaults();
|
||||
}
|
||||
|
||||
// Default type
|
||||
if( defaultType )
|
||||
{
|
||||
currentOptions['type'] = defaultType;
|
||||
|
||||
$("#member_types li").removeClass("active");
|
||||
$('li[data-type|="' + defaultType + '"]').addClass("active");
|
||||
|
||||
if( $("#mheader_" + defaultType + ":hidden").size() )
|
||||
{
|
||||
$(".member_column_titles").hide();
|
||||
$(".sortable", table).removeClass("active");
|
||||
$("#mheader_" + defaultType )
|
||||
.show()
|
||||
.find('th[data-key="' + currentOptions['order_by'] + '"]')
|
||||
.addClass("active")
|
||||
.addClass( currentOptions['order_direction'] );
|
||||
|
||||
}
|
||||
|
||||
if( !$("#mfooter_" + defaultType + ":visible").size() )
|
||||
{
|
||||
$("tfoot tr", table).hide();
|
||||
$("#mfooter_" + defaultType ).show();
|
||||
}
|
||||
}
|
||||
|
||||
$("#members_loading").ajaxStart( function(){
|
||||
$(this).fadeIn('fast');
|
||||
}).ajaxStop( function(){
|
||||
$(this).fadeOut('fast');
|
||||
});
|
||||
},
|
||||
getOption = function(option){
|
||||
return currentOptions[ option ];
|
||||
},
|
||||
setOption = function( option, value ){
|
||||
currentOptions[ option ] = value;
|
||||
};
|
||||
|
||||
//-------------------------------------
|
||||
// PRIVATE METHODS
|
||||
// Toggles the type (member, validating, spammer etc.)
|
||||
var toggleType = function(e)
|
||||
{
|
||||
e.preventDefault();
|
||||
// Ignore if already active
|
||||
if( $( e.target ).closest(".ipsActionButton.active").size() ){
|
||||
return;
|
||||
}
|
||||
// Make active
|
||||
$("#member_types li").removeClass("active");
|
||||
var key = $( e.target ).closest("li").addClass("active").data('type');
|
||||
|
||||
// Send request
|
||||
fetchResults( { type: key } );
|
||||
},
|
||||
|
||||
// Handler for sorting the table by column
|
||||
sortTable = function(e)
|
||||
{
|
||||
e.preventDefault();
|
||||
var td = $( e.target ).closest('.sortable');
|
||||
|
||||
if( td.hasClass('active') ){
|
||||
if( td.hasClass('desc') ){
|
||||
td.removeClass('desc').addClass('asc');
|
||||
fetchResults( { order_direction: 'asc' } );
|
||||
} else {
|
||||
td.removeClass('asc').addClass('desc');
|
||||
fetchResults( { order_direction: 'desc' } );
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
$(".sortable", table).removeClass("active");
|
||||
var key = td.addClass("active").addClass("desc").data('key');
|
||||
|
||||
// Send request
|
||||
fetchResults( { order_by: key, order_direction: 'desc' } );
|
||||
},
|
||||
|
||||
// Perform an action on a member
|
||||
doAction = function(e)
|
||||
{
|
||||
e.preventDefault();
|
||||
|
||||
// Get the type and action
|
||||
var _do = currentOptions['type'];
|
||||
var _action = $( e.target ).data("action");
|
||||
if( $.undefined( _do ) || !_do || $.undefined( _action ) || !_action ){
|
||||
Debug.write( "No type, or no action."); return;
|
||||
}
|
||||
|
||||
if( _action == 'delete' ){
|
||||
if( !confirm( ipb.lang['confirm_delete_single_mem'] ) ){
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
// Get the relevant member ID
|
||||
var mid = $( e.target ).closest("tr").data("mid");
|
||||
if( $.undefined( mid ) || !mid ){
|
||||
Debug.write( "No member ID found."); return;
|
||||
}
|
||||
|
||||
if( _do == 'all' ){
|
||||
var url = request_url + "&do=do_" + _action + "&type=" + _do + "&mid_" + mid + "=1";
|
||||
} else {
|
||||
var url = request_url + "&do=do_" + _do + "&type=" + _action + "&mid_" + mid + "=1";
|
||||
}
|
||||
|
||||
// Send the request
|
||||
$.ajax( {
|
||||
url: url.replace(/&/g, '&'),
|
||||
type: 'get',
|
||||
success: function(data){
|
||||
if( data['ok'] ){
|
||||
if( _action == 'resend' )
|
||||
{
|
||||
alert( data['msg'] );
|
||||
}
|
||||
else
|
||||
{
|
||||
$( e.target ).closest(".member_controls")
|
||||
.addClass("success")
|
||||
.closest("tr")
|
||||
.fadeOut('slow', function(){
|
||||
$( this ).remove();
|
||||
checkForEmptyTable();
|
||||
});
|
||||
}
|
||||
}
|
||||
else if( data['error'] ) {
|
||||
alert( data['error'] );
|
||||
}
|
||||
else {
|
||||
alert( ipb.lang['generic_ajax_error'] );
|
||||
}
|
||||
}
|
||||
});
|
||||
},
|
||||
|
||||
doMassAction = function(e)
|
||||
{
|
||||
e.preventDefault();
|
||||
|
||||
// Get the type and action
|
||||
var _do = currentOptions['type'];
|
||||
var _action = $( e.target ).data("action");
|
||||
if( $.undefined( _do ) || !_do || $.undefined( _action ) || !_action ){
|
||||
Debug.write( "No type, or no action."); return;
|
||||
}
|
||||
|
||||
if( _action == 'delete' ){
|
||||
if( !confirm( ipb.lang['confirm_delete_multiple_mem'] ) ){
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
// Get all MIDs
|
||||
var mids = $("#member_results input:checked").map( function(){
|
||||
return "mid_" + $(this).closest("tr").data("mid") + "=1";
|
||||
}).get();
|
||||
|
||||
if( mids == "" ){ return; }
|
||||
mids = mids.join("&");
|
||||
|
||||
var url = request_url + "&do=do_" + _do + "&type=" + _action + "&" + mids;
|
||||
|
||||
//Debug.write( url );
|
||||
$.ajax( {
|
||||
url: url.replace(/&/g, '&'),
|
||||
type: 'get',
|
||||
success: function(data){
|
||||
if( data['ok'] ){
|
||||
$("#member_results input:checked").parents(".member_controls")
|
||||
.addClass("success")
|
||||
.closest("tr")
|
||||
.fadeOut('slow', function(){
|
||||
$( this ).remove();
|
||||
checkForEmptyTable();
|
||||
});
|
||||
}
|
||||
else if( data['error'] ) {
|
||||
alert( data['error'] );
|
||||
}
|
||||
else {
|
||||
alert( ipb.lang['generic_ajax_error'] );
|
||||
}
|
||||
}
|
||||
});
|
||||
},
|
||||
|
||||
doSpamAction = function(e)
|
||||
{
|
||||
e.preventDefault();
|
||||
var action = $( e.target ).data("action");
|
||||
|
||||
if( action == 'unspam' )
|
||||
{
|
||||
$("#s_initial").hide();
|
||||
$("#s_unspam_confirm").show();
|
||||
$("#s_unspam_yes, #s_unspam_no").click( function(e){
|
||||
doMassAction(e);
|
||||
$( this ).unbind();
|
||||
$("#s_unspam_confirm").hide();
|
||||
$("#s_initial").show();
|
||||
});
|
||||
}
|
||||
else if( action == 'ban' )
|
||||
{
|
||||
$("#s_initial").hide();
|
||||
$("#s_ban_confirm").show();
|
||||
$("#s_ban_yes, #s_ban_no").click( function(e){
|
||||
doMassAction(e);
|
||||
$( this ).unbind();
|
||||
$("#s_ban_confirm").hide();
|
||||
$("#s_initial").show();
|
||||
});
|
||||
}
|
||||
else
|
||||
{
|
||||
doMassAction(e);
|
||||
}
|
||||
},
|
||||
|
||||
// Checks whether the table is empty after performing
|
||||
// member row actions
|
||||
checkForEmptyTable = function()
|
||||
{
|
||||
if( $("#member_results tr").size() == 0 )
|
||||
{
|
||||
$(".check_all").attr("checked", false);
|
||||
$("tfoot tr:visible", table).addClass("disabled");
|
||||
fetchResults( {}, true ); // force cache update
|
||||
}
|
||||
},
|
||||
|
||||
// Handler for checking all checkboxes in the table
|
||||
checkAll = function(e)
|
||||
{
|
||||
$("#member_results input:checkbox").attr("checked", e.target.checked );
|
||||
|
||||
// Enable the mass-action bar if necessary
|
||||
if( e.target.checked && $("#member_results tr").size() ){
|
||||
$("tfoot tr:visible").removeClass("disabled");
|
||||
}
|
||||
else {
|
||||
$("tfoot tr:visible").addClass("disabled");
|
||||
}
|
||||
},
|
||||
|
||||
// Handler when a checkbox is clicked. Removes 'check all' check if necessary.
|
||||
checkOne = function(e)
|
||||
{
|
||||
if( !e.target.checked ){
|
||||
$(".check_all").attr("checked", false);
|
||||
}
|
||||
|
||||
|
||||
if( !$("#member_results input:not(:checked)").size() ){
|
||||
$(".check_all").attr("checked", true);
|
||||
} else {
|
||||
$(".check_all").attr("checked", false);
|
||||
}
|
||||
|
||||
// Enable the mass-action bar if necessary
|
||||
if( $("#member_results tr").size() && $("#member_results input:checked").size() ){
|
||||
$("tfoot tr:visible").removeClass("disabled");
|
||||
}
|
||||
else {
|
||||
$("tfoot tr:visible").addClass("disabled");
|
||||
}
|
||||
},
|
||||
|
||||
// Handler for pagination links
|
||||
hijackPagination = function(e)
|
||||
{
|
||||
e.preventDefault();
|
||||
|
||||
// Find the st value
|
||||
try {
|
||||
var st = e.target.href.match(/\&st=([0-9]+)/)[1];
|
||||
} catch(err) {
|
||||
Debug.write( "No st value found" );
|
||||
return;
|
||||
}
|
||||
|
||||
fetchResults( { st: st } );
|
||||
},
|
||||
|
||||
// if there's a url hash, parse it and load results
|
||||
parseHash = function()
|
||||
{
|
||||
var hash = window.location.hash;
|
||||
var params = $H( getHashParams( hash ) );
|
||||
var options = {};
|
||||
|
||||
if( !params.size() ){
|
||||
return;
|
||||
}
|
||||
|
||||
params.each( function(h){
|
||||
options[ h.key ] = h.value;
|
||||
});
|
||||
|
||||
if( !options['do_results'] ){
|
||||
return;
|
||||
}
|
||||
|
||||
var o = Object.toQueryString( currentOptions );
|
||||
currentOptions = $.extend( currentOptions, options );
|
||||
|
||||
// do stuff
|
||||
$.ajax( {
|
||||
url: ( request_url + "&" + o ).replace(/&/g, '&'),
|
||||
type: 'post',
|
||||
data: options,
|
||||
success: function(data){
|
||||
if( data['error'] )
|
||||
{
|
||||
alert( data['error'] );
|
||||
if( data["__session__expired__log__out__"] ){
|
||||
window.location.reload();
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
$("#member_types").hide();
|
||||
$("#m_search_info").show().find("span").html( data['count'] );
|
||||
isAdvSearching = true;
|
||||
buildResults( data );
|
||||
Debug.write("Done");
|
||||
}
|
||||
}
|
||||
});
|
||||
},
|
||||
|
||||
getHashParams = function( hash )
|
||||
{
|
||||
var hashParams = {};
|
||||
var e,
|
||||
a = /\+/g, // Regex for replacing addition symbol with a space
|
||||
r = /([^&;=]+)=?([^&;]*)/g,
|
||||
d = function (s) { return decodeURIComponent(s.replace(a, " ")); },
|
||||
q = window.location.hash.substring(1);
|
||||
|
||||
while (e = r.exec(q))
|
||||
hashParams[d(e[1])] = d(e[2]);
|
||||
|
||||
return hashParams;
|
||||
},
|
||||
|
||||
// Fetches results from the server or cache using our params object
|
||||
fetchResults = function( options, force )
|
||||
{
|
||||
var newOpts = {};
|
||||
$.each( coreOptions, function( i, v ){
|
||||
newOpts[ v ] = currentOptions[ v ];
|
||||
});
|
||||
currentOptions = newOpts;
|
||||
|
||||
var o = $.extend( {}, currentOptions, options );
|
||||
var hash = Object.toQueryString( o );
|
||||
|
||||
//o['__update'] = 1;
|
||||
|
||||
// Wipe cache?
|
||||
if( force ){
|
||||
resultsCache = {};
|
||||
}
|
||||
|
||||
if( resultsCache[ hash ] )
|
||||
{
|
||||
currentOptions = o;
|
||||
buildResults( resultsCache[hash] );
|
||||
}
|
||||
else
|
||||
{
|
||||
// do stuff
|
||||
$.ajax( {
|
||||
url: request_url.replace(/&/g, '&'),
|
||||
type: 'get',
|
||||
data: o,
|
||||
success: function(data){
|
||||
if( data['error'] )
|
||||
{
|
||||
alert( data['error'] );
|
||||
if( data["__session__expired__log__out__"] ){
|
||||
window.location.reload();
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
currentOptions = o;
|
||||
buildResults( data );
|
||||
resultsCache[ hash ] = data;
|
||||
Debug.write("Done");
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
// Set anchor for back button functionality
|
||||
window.location.hash = hash; /*.replace(/&/g, '/').replace(/\/amp;/g, '&');*/
|
||||
},
|
||||
buildResults = function( results ){
|
||||
|
||||
// Show headers
|
||||
if( $("#mheader_" + currentOptions['type'] + ":hidden").size() )
|
||||
{
|
||||
$(".member_column_titles").hide();
|
||||
$(".sortable", table).removeClass("active");
|
||||
$("#mheader_" + currentOptions['type'] )
|
||||
.show()
|
||||
.find('th[data-key="' + currentOptions['order_by'] + '"]')
|
||||
.addClass("active")
|
||||
.addClass( currentOptions['order_direction'] );
|
||||
|
||||
}
|
||||
// Show footers
|
||||
if( !$("#mfooter_" + currentOptions['type'] + ":visible").size() )
|
||||
{
|
||||
$("tfoot tr", table).hide();
|
||||
$("#mfooter_" + currentOptions['type'] ).show();
|
||||
}
|
||||
|
||||
// Build results and pagination
|
||||
$("tbody#member_results", table).html( results['members'] );
|
||||
$(".pagination").replaceWith( results['pages'] );
|
||||
|
||||
// Check prune/move
|
||||
checkPruneAndMove( currentOptions['type'] );
|
||||
},
|
||||
focusSearch = function(e){
|
||||
clearTimeout( searchTimeout );
|
||||
searchTimeout = setTimeout( runSearch, 300 );
|
||||
},
|
||||
blurSearch = function(e){
|
||||
clearTimeout( searchTimeout );
|
||||
},
|
||||
runSearch = function(){
|
||||
searchTimeout = setTimeout( runSearch, 300 );
|
||||
var curVal = $("#member_search").val();
|
||||
|
||||
if( curVal == lastVal || curVal.length < 3 ){
|
||||
return;
|
||||
}
|
||||
|
||||
fetchResults( { string: curVal, st: 0 } );
|
||||
lastVal = curVal;
|
||||
},
|
||||
|
||||
//-------------------------------------------
|
||||
// MASS PRUNE/MOVE
|
||||
//-------------------------------------------
|
||||
|
||||
preparePruneAndMove = function(){
|
||||
$("#memberList__prune").click( {doType: 'prune'}, doPruneMove );
|
||||
$("#memberList__move").click( {doType: 'move'}, doPruneMove );
|
||||
},
|
||||
|
||||
doPruneMove = function(e){
|
||||
e.preventDefault();
|
||||
|
||||
if( $("#memberList__" + e.data.doType).hasClass("disabled") ){
|
||||
return;
|
||||
}
|
||||
|
||||
var type = ( e.data.doType == 'prune' ) ? 'delete' : 'move';
|
||||
|
||||
var o = currentOptions;
|
||||
delete o['type'];
|
||||
delete o['st'];
|
||||
delete o['order_by'];
|
||||
delete o['order_direction'];
|
||||
var hash = Object.toQueryString( o );
|
||||
|
||||
window.location = $("#memberPruneMoveForm").attr('action') + '&' + hash + '&f_search_type=' + type;
|
||||
},
|
||||
checkPruneAndMove = function( type ){
|
||||
if( type != 'all' ){
|
||||
disablePruneMove();
|
||||
return;
|
||||
}
|
||||
|
||||
// Only enable if we're doing some kind of filtering
|
||||
if( currentOptions['string'] || isAdvSearching ){
|
||||
enablePruneMove();
|
||||
} else {
|
||||
disablePruneMove();
|
||||
}
|
||||
},
|
||||
disablePruneMove = function(){
|
||||
$("#memberList__prune, #memberList__move").addClass("disabled");
|
||||
},
|
||||
enablePruneMove = function(){
|
||||
$("#memberList__prune, #memberList__move").removeClass("disabled");
|
||||
},
|
||||
|
||||
//-------------------------------------------
|
||||
// ADVANCED SEARCH
|
||||
//-------------------------------------------
|
||||
|
||||
prepareAdvancedSearch = function(e){
|
||||
if( !$("#modal").size() ){
|
||||
$("body").append( $("<div />", { id: "modal" } ).hide() );
|
||||
}
|
||||
$("#modal").css( { height: $(document).height() } );
|
||||
// Submit event
|
||||
$("#do_advanced_search").click( doAdvancedSearch );
|
||||
$("#m_search_cancel").click( cancelAdvancedSearch );
|
||||
$("#close_adv_search, #modal").click( hideAdvancedSearch );
|
||||
|
||||
// Resize event
|
||||
$(window).resize( function(){
|
||||
$("#modal:visible").css( { height: $(document).height() } );
|
||||
});
|
||||
},
|
||||
showAdvancedSearch = function(e){
|
||||
if(e){ e.preventDefault(); }
|
||||
$("#modal").fadeIn();
|
||||
$("#m_search_pane").fadeIn();
|
||||
},
|
||||
hideAdvancedSearch = function(e){
|
||||
if(e){ e.preventDefault(); }
|
||||
$("#m_search_pane").fadeOut();
|
||||
$("#modal").fadeOut();
|
||||
},
|
||||
cancelAdvancedSearch = function(e){
|
||||
if(e){ e.preventDefault(); }
|
||||
// Remove advanced search fields
|
||||
var newOpts = {};
|
||||
$.each( coreOptions, function( i, v ){
|
||||
newOpts[ v ] = currentOptions[ v ];
|
||||
});
|
||||
currentOptions = newOpts;
|
||||
|
||||
currentOptions['reset_filters'] = 1;
|
||||
|
||||
$("#m_search_info").hide();
|
||||
$('.information-box').hide();
|
||||
$("#member_types").show();
|
||||
isAdvSearching = false;
|
||||
fetchResults( currentOptions );
|
||||
},
|
||||
doAdvancedSearch = function(e){
|
||||
e.preventDefault();
|
||||
// Get form values
|
||||
var vals = {};
|
||||
$.map( $("#m_search_form").serializeArray(), function( k, i ){
|
||||
vals[ k['name'] ] = k['value'];
|
||||
});
|
||||
|
||||
vals['st'] = 0;
|
||||
vals['__update'] = 1;
|
||||
|
||||
// Remove quick search values
|
||||
$("#member_search").val('');
|
||||
currentOptions['string'] = '';
|
||||
|
||||
var o = Object.toQueryString( currentOptions );
|
||||
currentOptions = $.extend( currentOptions, vals );
|
||||
|
||||
// do stuff
|
||||
$.ajax( {
|
||||
url: ( request_url + "&" + o ).replace(/&/g, '&'),
|
||||
type: 'post',
|
||||
data: vals,
|
||||
success: function(data){
|
||||
if( data['error'] )
|
||||
{
|
||||
alert( data['error'] );
|
||||
if( data["__session__expired__log__out__"] ){
|
||||
window.location.reload();
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
$("#member_types").hide();
|
||||
$("#m_search_info").show().find("span").html( data['count'] );
|
||||
isAdvSearching = true;
|
||||
buildResults( data );
|
||||
Debug.write("Done");
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
hideAdvancedSearch();
|
||||
};
|
||||
|
||||
//-------------------------------------
|
||||
// Make public methods public
|
||||
return {
|
||||
init: init,
|
||||
getOption: getOption,
|
||||
setOption: setOption
|
||||
};
|
||||
}($);
|
||||
|
||||
}(jQuery));
|
||||
Reference in new issue
Block a user