diff --git a/app/assets/javascripts/admin/controllers/admin-users-list-show.js.es6 b/app/assets/javascripts/admin/controllers/admin-users-list-show.js.es6 index f80222cdc5a..630c1c113e7 100644 --- a/app/assets/javascripts/admin/controllers/admin-users-list-show.js.es6 +++ b/app/assets/javascripts/admin/controllers/admin-users-list-show.js.es6 @@ -87,8 +87,8 @@ export default Ember.Controller.extend(CanCheckEmails, { ); }, - showEmails: function() { - this.set("showEmails", true); + toggleEmailVisibility: function() { + this.toggleProperty("showEmails"); this._refreshUsers(); } } diff --git a/app/assets/javascripts/admin/routes/admin-users-list-show.js.es6 b/app/assets/javascripts/admin/routes/admin-users-list-show.js.es6 index fba32bec282..0b72b80e626 100644 --- a/app/assets/javascripts/admin/routes/admin-users-list-show.js.es6 +++ b/app/assets/javascripts/admin/routes/admin-users-list-show.js.es6 @@ -18,7 +18,6 @@ export default Discourse.Route.extend({ order: transition.to.queryParams.order, ascending: transition.to.queryParams.ascending, query: params.filter, - showEmails: false, refreshing: false }); diff --git a/app/assets/javascripts/admin/templates/users-list-show.hbs b/app/assets/javascripts/admin/templates/users-list-show.hbs index 4e353674029..708f1ef6761 100644 --- a/app/assets/javascripts/admin/templates/users-list-show.hbs +++ b/app/assets/javascripts/admin/templates/users-list-show.hbs @@ -8,12 +8,16 @@

{{title}}

{{#if canCheckEmails}} - + {{#if showEmails}} + + {{else}} + + {{/if}} {{/if}}
{{text-field value=listFilter placeholder=searchHint}} - +
{{#conditional-loading-spinner condition=refreshing}} @@ -23,9 +27,9 @@ {{#if showApproval}} {{input type="checkbox" checked=selectAll}} {{/if}} - {{i18n 'username'}} - {{i18n 'email'}} - {{i18n 'admin.users.last_emailed'}} + {{admin-directory-toggle field="username" i18nKey='username' order=order ascending=ascending}} + {{admin-directory-toggle field="email" i18nKey='email' order=order ascending=ascending}} + {{admin-directory-toggle field="last_emailed" i18nKey='admin.users.last_emailed' order=order ascending=ascending}} {{admin-directory-toggle field="seen" i18nKey='last_seen' order=order ascending=ascending}} {{admin-directory-toggle field="topics_viewed" i18nKey="admin.user.topics_entered" order=order ascending=ascending}} {{admin-directory-toggle field="posts_read" i18nKey="admin.user.posts_read_count" order=order ascending=ascending}} diff --git a/app/assets/stylesheets/common/admin/admin_base.scss b/app/assets/stylesheets/common/admin/admin_base.scss index d040fbe3840..9a508919afb 100644 --- a/app/assets/stylesheets/common/admin/admin_base.scss +++ b/app/assets/stylesheets/common/admin/admin_base.scss @@ -435,7 +435,7 @@ $mobile-breakpoint: 700px; display: flex; flex-wrap: wrap; align-items: flex-start; - .show-emails { + .show-emails, .hide-emails { margin-left: auto; } } diff --git a/config/locales/client.en.yml b/config/locales/client.en.yml index 41049f3e4a7..c4b55c5ccae 100644 --- a/config/locales/client.en.yml +++ b/config/locales/client.en.yml @@ -3788,6 +3788,7 @@ en: id_not_found: "Sorry, that user id doesn't exist in our system." active: "Activated" show_emails: "Show Emails" + hide_emails: "Hide Emails" nav: new: "New" active: "Active" diff --git a/test/javascripts/acceptance/admin-users-list-test.js.es6 b/test/javascripts/acceptance/admin-users-list-test.js.es6 index 0a2b5c4ad78..2d457d0d704 100644 --- a/test/javascripts/acceptance/admin-users-list-test.js.es6 +++ b/test/javascripts/acceptance/admin-users-list-test.js.es6 @@ -9,6 +9,52 @@ QUnit.test("lists users", async assert => { assert.ok(!exists(".user:eq(0) .email small"), "escapes email"); }); +QUnit.test("sorts users", async assert => { + await visit("/admin/users/list/active"); + + assert.ok(exists(".users-list .user")); + + await click(".users-list .sortable:nth-child(1)"); + + assert.ok( + find(".users-list .user:nth-child(1) .username") + .text() + .includes("eviltrout"), + "list should be sorted by username" + ); + + await click(".users-list .sortable:nth-child(1)"); + + assert.ok( + find(".users-list .user:nth-child(1) .username") + .text() + .includes("discobot"), + "list should be sorted ascending by username" + ); +}); + +QUnit.test("toggles email visibility", async assert => { + await visit("/admin/users/list/active"); + + assert.ok(exists(".users-list .user")); + + await click(".show-emails"); + + assert.equal( + find(".users-list .user:nth-child(1) .email").text(), + "eviltrout@example.com", + "shows the emails" + ); + + await click(".hide-emails"); + + assert.equal( + find(".users-list .user:nth-child(1) .email").text(), + "", + "hides the emails" + ); +}); + QUnit.test("switching tabs", async assert => { const activeUser = "eviltrout@example.com"; const suspectUser = "sam@example.com"; diff --git a/test/javascripts/helpers/create-pretender.js.es6 b/test/javascripts/helpers/create-pretender.js.es6 index 5cda6c828e1..abc6ed548b3 100644 --- a/test/javascripts/helpers/create-pretender.js.es6 +++ b/test/javascripts/helpers/create-pretender.js.es6 @@ -448,14 +448,32 @@ export default function() { overridden: true }; - this.get("/admin/users/list/active.json", () => { - return response(200, [ + this.get("/admin/users/list/active.json", request => { + let store = [ { id: 1, username: "eviltrout", email: "eviltrout@example.com" + }, + { + id: 3, + username: "discobot", + email: "discobot_email" } - ]); + ]; + const ascending = request.queryParams.ascending; + const order = request.queryParams.order; + + if (order) { + store = store.sort(function(a, b) { + return a[order] - b[order]; + }); + } + if (ascending) { + store = store.reverse(); + } + + return response(200, store); }); this.get("/admin/users/list/suspect.json", () => {