diff --git a/app/controllers/users_controller.rb b/app/controllers/users_controller.rb index 10f38317..d53fd8f5 100644 --- a/app/controllers/users_controller.rb +++ b/app/controllers/users_controller.rb @@ -3,7 +3,7 @@ class UsersController < ApplicationController before_action :set_user, only: %i[ edit update destroy ] def index - @users = User.all + @users = User.all.search_with_params(user_search_params) end def new @@ -52,4 +52,9 @@ def set_user def user_params params.expect(user: [ :email, :password, :is_admin ]) end + + def user_search_params + return {} unless params[:search].present? + params.expect(search: [ :email, :is_admin, :order ]) + end end diff --git a/app/javascript/controllers/search_controller.js b/app/javascript/controllers/search_controller.js new file mode 100644 index 00000000..a630dce6 --- /dev/null +++ b/app/javascript/controllers/search_controller.js @@ -0,0 +1,15 @@ +import { Controller } from "@hotwired/stimulus"; +import { useDebounce } from "stimulus-use"; + +export default class extends Controller { + static targets = ["search"]; + static debounces = ["submit"]; + + connect() { + useDebounce(this, { wait: 300 }); + } + + submit() { + this.searchTarget.requestSubmit(); + } +} diff --git a/app/models/concerns/searcheable.rb b/app/models/concerns/searcheable.rb index 7aacf6ea..f353a249 100644 --- a/app/models/concerns/searcheable.rb +++ b/app/models/concerns/searcheable.rb @@ -33,8 +33,10 @@ def sort_order(order_from_params) order_from_params end + end - def search_with_params(params) + included do + scope :search_with_params, ->(params) do self .then { |scope| params[:state].present? ? scope.by_state(params[:state]) : scope } .then { |scope| params[:provider_id].present? ? scope.by_provider(params[:provider_id]) : scope } @@ -42,7 +44,7 @@ def search_with_params(params) .then { |scope| params[:year].present? ? scope.by_year(params[:year]) : scope } .then { |scope| params[:month].present? ? scope.by_month(params[:month]) : scope } .then { |scope| params[:query].present? ? scope.search(params[:query]) : scope } - .then { |scope| scope.order(created_at: sort_order(params[:order])) } + .then { |scope| params[:order].present? ? scope.order(created_at: sort_order(params[:order].to_sym)) : scope } end end end diff --git a/app/models/user.rb b/app/models/user.rb index 172df009..0e35ab8e 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -24,6 +24,13 @@ class User < ApplicationRecord validates :email, presence: true, uniqueness: true, format: URI::MailTo::EMAIL_REGEXP validates :password_digest, presence: true + scope :search_with_params, ->(params) do + self + .then { |scope| params[:email].present? ? scope.where("email ILIKE ?", "%#{params[:email]}%") : scope } + .then { |scope| params[:is_admin].present? ? scope.where(is_admin: params[:is_admin]) : scope } + .then { |scope| scope.order(created_at: params[:order]&.to_sym || :desc) } + end + def topics Topic.where(provider_id: providers.pluck(:id)) end diff --git a/app/views/users/index.html.erb b/app/views/users/index.html.erb index 53d21f9c..5c790e0d 100644 --- a/app/views/users/index.html.erb +++ b/app/views/users/index.html.erb @@ -1,5 +1,42 @@