diff --git a/app/controllers/admin/users_controller.rb b/app/controllers/admin/users_controller.rb index f63df27eebd1f92382b82bb298b32cc06739e9d1..baad9095b70832695c6e2fce8e01ff6727032e77 100644 --- a/app/controllers/admin/users_controller.rb +++ b/app/controllers/admin/users_controller.rb @@ -4,6 +4,7 @@ class Admin::UsersController < Admin::ApplicationController def index @users = User.filter(params[:filter]) @users = @users.search(params[:name]) if params[:name].present? + @users = @users.sort(@sort = params[:sort]) @users = @users.alphabetically.page(params[:page]) end diff --git a/app/finders/snippets_finder.rb b/app/finders/snippets_finder.rb index fda375aca2ff0813ac7ab078a51a88dc8e0d8a03..b29ab6cf40b929b76e20d1f3f14d3ed711fd9511 100644 --- a/app/finders/snippets_finder.rb +++ b/app/finders/snippets_finder.rb @@ -30,18 +30,18 @@ class SnippetsFinder snippets = user.snippets.fresh.non_expired if user == current_user - snippets = case scope - when 'are_internal' then - snippets.are_internal - when 'are_private' then - snippets.are_private - when 'are_public' then - snippets.are_public - else - snippets - end + case scope + when 'are_internal' then + snippets.are_internal + when 'are_private' then + snippets.are_private + when 'are_public' then + snippets.are_public + else + snippets + end else - snippets = snippets.public_and_internal + snippets.public_and_internal end end diff --git a/app/models/user.rb b/app/models/user.rb index c90f24624266a897e5817e80360f849838d75b0a..c6baa7ee70445776e26c79f32a87dd32346b55d7 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -196,6 +196,16 @@ class User < ActiveRecord::Base end end + def sort(method) + case method.to_s + when 'recent_sign_in' then reorder('users.last_sign_in_at DESC') + when 'oldest_sign_in' then reorder('users.last_sign_in_at ASC') + when 'recently_created' then reorder('users.created_at DESC') + when 'late_created' then reorder('users.created_at ASC') + else reorder("users.name ASC") + end + end + def find_for_commit(email, name) # Prefer email match over name match User.where(email: email).first || diff --git a/app/views/admin/users/index.html.haml b/app/views/admin/users/index.html.haml index 5c2664e14fe5a71d3c6e4e09d427ea3065052b0a..92c619738a23dcdec8574c8789588a21d1d0039b 100644 --- a/app/views/admin/users/index.html.haml +++ b/app/views/admin/users/index.html.haml @@ -32,6 +32,26 @@ .panel-heading Users (#{@users.total_count}) .panel-head-actions + .dropdown.inline + %a.dropdown-toggle.btn{href: '#', "data-toggle" => "dropdown"} + %span.light sort: + - if @sort.present? + = @sort.humanize + - else + Name + %b.caret + %ul.dropdown-menu + %li + = link_to admin_users_path(sort: nil) do + Name + = link_to admin_users_path(sort: 'recent_sign_in') do + Recent sign in + = link_to admin_users_path(sort: 'oldest_sign_in') do + Oldest sign in + = link_to admin_users_path(sort: 'recently_created') do + Recently created + = link_to admin_users_path(sort: 'late_created') do + Late created = link_to 'New User', new_admin_user_path, class: "btn btn-new" %ul.well-list - @users.each do |user| diff --git a/spec/models/user_spec.rb b/spec/models/user_spec.rb index 0250014bc21cc4aa200e09d748621c9767e6bb81..8c79bf5f3c2bbaa6f25061e7f6daaccd9aa26f88 100644 --- a/spec/models/user_spec.rb +++ b/spec/models/user_spec.rb @@ -429,4 +429,32 @@ describe User do expect(user.starred?(project)).to be_false end end + + describe "#sort" do + before do + User.delete_all + @user = create :user, created_at: Date.today, last_sign_in_at: Date.today, name: 'Alpha' + @user1 = create :user, created_at: Date.today - 1, last_sign_in_at: Date.today - 1, name: 'Omega' + end + + it "sorts users as recently_signed_in" do + User.sort('recent_sign_in').first.should == @user + end + + it "sorts users as late_signed_in" do + User.sort('oldest_sign_in').first.should == @user1 + end + + it "sorts users as recently_created" do + User.sort('recently_created').first.should == @user + end + + it "sorts users as late_created" do + User.sort('late_created').first.should == @user1 + end + + it "sorts users by name when nil is passed" do + User.sort(nil).first.should == @user + end + end end