diff --git a/public/language/en-GB/admin/manage/users.json b/public/language/en-GB/admin/manage/users.json index 2712dece9d..d0d95b380f 100644 --- a/public/language/en-GB/admin/manage/users.json +++ b/public/language/en-GB/admin/manage/users.json @@ -20,16 +20,10 @@ "add-group": "Add Group", "invite": "Invite", "new": "New User", - - "pills.latest": "Latest Users", + "filter-by": "Filter by", "pills.unvalidated": "Not Validated", - "pills.no-posts": "No Posts", - "pills.top-posters": "Top Posters", - "pills.top-rep": "Most Reputation", - "pills.inactive": "Inactive", - "pills.flagged": "Most Flagged", + "pills.validated": "Validated", "pills.banned": "Banned", - "pills.search": "User Search", "50-per-page": "50 per page", "100-per-page": "100 per page", diff --git a/public/src/admin/manage/users.js b/public/src/admin/manage/users.js index 0cf21718d7..9d0fa707c3 100644 --- a/public/src/admin/manage/users.js +++ b/public/src/admin/manage/users.js @@ -6,13 +6,6 @@ define('admin/manage/users', [ var Users = {}; Users.init = function () { - var navPills = $('.nav-pills li'); - var pathname = window.location.pathname; - if (!navPills.find('a[href^="' + pathname + '"]').length || pathname === config.relative_path + '/admin/manage/users') { - pathname = config.relative_path + '/admin/manage/users/latest'; - } - navPills.removeClass('active').find('a[href^="' + pathname + '"]').parent().addClass('active'); - $('#results-per-page').val(ajaxify.data.resultsPerPage).on('change', function () { var query = utils.params(); query.resultsPerPage = $('#results-per-page').val(); @@ -411,6 +404,7 @@ define('admin/manage/users', [ handleInvite(); handleSort(); + handleFilter(); }; function handleSearch() { @@ -505,6 +499,7 @@ define('admin/manage/users', [ return decodeURIComponent($.param(params)); } + function handleSort() { $('.users-table thead th').on('click', function () { var $this = $(this); @@ -525,5 +520,43 @@ define('admin/manage/users', [ }); } + function handleFilter() { + function getFilters() { + var filters = []; + $('#filter-by').find('[data-filter-by]').each(function () { + if ($(this).find('.fa-check').length) { + filters.push($(this).attr('data-filter-by')); + } + }); + return filters; + } + + var currentFilters = getFilters(); + $('#filter-by').on('click', 'li', function () { + var $this = $(this); + $this.find('i').toggleClass('fa-check', !$this.find('i').hasClass('fa-check')); + return false; + }); + + $('#filter-by').on('hidden.bs.dropdown', function () { + var filters = getFilters(); + var changed = filters.length !== currentFilters.length; + if (filters.length === currentFilters.length) { + filters.forEach(function (filter, i) { + if (filter !== currentFilters[i]) { + changed = true; + } + }); + } + currentFilters = getFilters(); + if (changed) { + var params = utils.params(); + params.filter = filters; + var qs = buildSearchQuery(params); + ajaxify.go('admin/manage/users?' + qs); + } + }); + } + return Users; }); diff --git a/src/controllers/admin/users.js b/src/controllers/admin/users.js index e86adb213d..a908c445fb 100644 --- a/src/controllers/admin/users.js +++ b/src/controllers/admin/users.js @@ -229,6 +229,10 @@ function render(req, res, data) { data.adminInviteOnly = registrationType === 'admin-invite-only'; data['sort_' + data.sortBy] = true; data['searchBy_' + validator.escape(String(req.query.searchBy))] = true; + const filterBy = Array.isArray(req.query.filter) ? req.query.filter : [req.query.filter]; + filterBy.forEach(function (filter) { + data['filterBy_' + validator.escape(String(filter))] = true; + }); res.render('admin/manage/users', data); } diff --git a/src/views/admin/manage/users.tpl b/src/views/admin/manage/users.tpl index 68b479875d..bb08b56ecb 100644 --- a/src/views/admin/manage/users.tpl +++ b/src/views/admin/manage/users.tpl @@ -23,10 +23,24 @@