diff --git a/app/controllers/admin/scenarios_controller.rb b/app/controllers/admin/scenarios_controller.rb index 29290fd..25f57d2 100644 --- a/app/controllers/admin/scenarios_controller.rb +++ b/app/controllers/admin/scenarios_controller.rb @@ -6,18 +6,9 @@ def index @page = [ params[:page].to_i, 1 ].max @offset = (@page - 1) * PER_PAGE - scope = Current.organization.scenarios - .includes(:user) - .references(:user) - .order("users.name", "users.email_address", :name) - - if @query.present? - like = "%#{Scenario.sanitize_sql_like(@query.downcase)}%" - scope = scope.where("LOWER(users.name) LIKE :q OR LOWER(users.email_address) LIKE :q", q: like) - end - + scope = Current.organization.scenarios.search_by_user(@query).order(:name) @total = scope.count + @has_more = @offset + PER_PAGE < @total @scenarios = scope.limit(PER_PAGE).offset(@offset) - @has_more = @offset + @scenarios.size < @total end end diff --git a/app/controllers/organization_memberships_controller.rb b/app/controllers/organization_memberships_controller.rb index d4fa8d6..efe7c78 100644 --- a/app/controllers/organization_memberships_controller.rb +++ b/app/controllers/organization_memberships_controller.rb @@ -1,15 +1,25 @@ class OrganizationMembershipsController < ApplicationController + PER_PAGE = 50 + before_action :require_member_management before_action :set_membership, only: :update def index - @memberships = Current.organization.organization_memberships - .includes(:user).order(:created_at) + @query = params[:q].to_s.strip + @roles = Array(params[:roles]).select { |role| OrganizationMembership.roles.key?(role) } + @page = [ params[:page].to_i, 1 ].max + @offset = (@page - 1) * PER_PAGE + + scope = Current.organization.organization_memberships.search_by_user(@query) + scope = scope.where(role: @roles) if @roles.any? + @total = scope.count + @has_more = @offset + PER_PAGE < @total + @memberships = scope.limit(PER_PAGE).offset(@offset) end def update OrganizationMembership::RoleUpdater.new(@membership, actor: Current.user, role: params[:role]).call - redirect_to organization_memberships_path + redirect_to organization_memberships_path(q: params[:q], roles: params[:roles], page: params[:page]) end private diff --git a/app/models/concerns/user_searchable.rb b/app/models/concerns/user_searchable.rb new file mode 100644 index 0000000..3210900 --- /dev/null +++ b/app/models/concerns/user_searchable.rb @@ -0,0 +1,14 @@ +module UserSearchable + extend ActiveSupport::Concern + + included do + scope :search_by_user, ->(query) { + relation = includes(:user).references(:user).order("users.name", "users.email_address") + query = query.to_s.strip + next relation if query.blank? + + like = "%#{sanitize_sql_like(query.downcase)}%" + relation.where("LOWER(users.name) LIKE :q OR LOWER(users.email_address) LIKE :q", q: like) + } + end +end diff --git a/app/models/organization_membership.rb b/app/models/organization_membership.rb index 5c641b3..e4b4488 100644 --- a/app/models/organization_membership.rb +++ b/app/models/organization_membership.rb @@ -1,4 +1,6 @@ class OrganizationMembership < ApplicationRecord + include UserSearchable + belongs_to :user belongs_to :organization diff --git a/app/models/scenario.rb b/app/models/scenario.rb index 17c6bad..34eb10b 100644 --- a/app/models/scenario.rb +++ b/app/models/scenario.rb @@ -1,4 +1,6 @@ class Scenario < ApplicationRecord + include UserSearchable + belongs_to :organization belongs_to :user has_many :allocations, dependent: :destroy diff --git a/app/views/organization_memberships/index.html.erb b/app/views/organization_memberships/index.html.erb index c81ce8a..706fc05 100644 --- a/app/views/organization_memberships/index.html.erb +++ b/app/views/organization_memberships/index.html.erb @@ -17,31 +17,73 @@ <% end %> -
<%= membership.user.display_name %>
- <% if membership.user.name.present? %> -<%= membership.user.email_address %>
- <% end %> - - <%= membership.role.capitalize %> - -<%= membership.user.display_name %>
+ <% if membership.user.name.present? %> +<%= membership.user.email_address %>
+ <% end %> + + <%= membership.role.capitalize %> + +