From af2c6fd85e13139be3e3b2329a51c3a35acb3c40 Mon Sep 17 00:00:00 2001 From: erdgeist Date: Wed, 5 Aug 2026 23:56:56 +0200 Subject: Search assets and events, and order events by when they happen --- app/controllers/assets_controller.rb | 8 +++----- app/controllers/events_controller.rb | 7 ++++--- app/models/asset.rb | 14 ++++++++++++++ app/models/event.rb | 18 ++++++++++++++++++ app/views/assets/index.html.erb | 2 ++ app/views/events/index.html.erb | 2 ++ app/views/nodes/_node_list.html.erb | 17 ++++------------- app/views/shared/_search_form.html.erb | 15 +++++++++++++++ 8 files changed, 62 insertions(+), 21 deletions(-) create mode 100644 app/views/shared/_search_form.html.erb (limited to 'app') diff --git a/app/controllers/assets_controller.rb b/app/controllers/assets_controller.rb index 801e0968..f8a7d1e4 100644 --- a/app/controllers/assets_controller.rb +++ b/app/controllers/assets_controller.rb @@ -6,12 +6,10 @@ class AssetsController < ApplicationController before_action :login_required layout 'admin' - + def index - @assets = Asset.order('id DESC').paginate( - :page => params[:page], - :per_page => 20 - ) + scope = params[:q].present? ? Asset.editor_search(params[:q]) : Asset.all + @assets = scope.order("id DESC").paginate(:page => params[:page], :per_page => 20) end # GET /assets/1 diff --git a/app/controllers/events_controller.rb b/app/controllers/events_controller.rb index d581de16..7ace5c1d 100644 --- a/app/controllers/events_controller.rb +++ b/app/controllers/events_controller.rb @@ -10,11 +10,12 @@ class EventsController < ApplicationController # GET /events # GET /events.xml def index - @events = Event.order(:id) + scope = Event.order(Arel.sql("start_time DESC NULLS LAST")) + scope = scope.merge(Event.editor_search(params[:q])) if params[:q].present? respond_to do |format| - format.html { @events = @events.paginate(page: params[:page], per_page: 25) } - format.xml { render :xml => @events } + format.html { @events = scope.paginate(:page => params[:page], :per_page => 25) } + format.xml { render :xml => scope } end end diff --git a/app/models/asset.rb b/app/models/asset.rb index b256b929..4d43b18f 100644 --- a/app/models/asset.rb +++ b/app/models/asset.rb @@ -82,4 +82,18 @@ class Asset < ApplicationRecord destroy! end end + + def self.editor_search(term) + words = term.to_s.split(/\s+/).reject(&:blank?) + return none if words.empty? + + words.inject(all) do |scope, word| + like = "%#{sanitize_sql_like(word)}%" + scope.where( + "assets.name ILIKE :t OR assets.creator ILIKE :t OR " \ + "assets.upload_file_name ILIKE :t OR assets.source_url ILIKE :t OR " \ + "assets.upload_content_type ILIKE :t", :t => like + ) + end + end end diff --git a/app/models/event.rb b/app/models/event.rb index 792ab448..e7823617 100644 --- a/app/models/event.rb +++ b/app/models/event.rb @@ -54,6 +54,24 @@ class Event < ApplicationRecord destroyed end + def self.editor_search(term) + words = term.to_s.split(/\s+/).reject(&:blank?) + return none if words.empty? + + words.inject(all) do |scope, word| + like = "%#{sanitize_sql_like(word)}%" + tagged = ActsAsTaggableOn::Tagging + .where(:taggable_type => base_class.name) + .joins(:tag).where("tags.name ILIKE ?", like) + .select(:taggable_id) + scope.where( + "events.title ILIKE :t OR events.description ILIKE :t OR " \ + "events.location ILIKE :t OR events.url ILIKE :t OR " \ + "events.id IN (:tagged)", :t => like, :tagged => tagged + ) + end + end + private def generate_occurrences Occurrence.generate self diff --git a/app/views/assets/index.html.erb b/app/views/assets/index.html.erb index af11f54f..d2c5d6cc 100644 --- a/app/views/assets/index.html.erb +++ b/app/views/assets/index.html.erb @@ -4,6 +4,8 @@ :label => t(".create_asset"), :options => [[t(".create_asset"), new_asset_path]] %> +<%= render "shared/search_form", :placeholder => t(".search_placeholder") %> + <%= will_paginate @assets %> diff --git a/app/views/events/index.html.erb b/app/views/events/index.html.erb index c4f0a7f9..14790526 100644 --- a/app/views/events/index.html.erb +++ b/app/views/events/index.html.erb @@ -4,6 +4,8 @@ :label => t(".create_event"), :options => [[t(".create_event"), new_event_path]] %> +<%= render "shared/search_form", :placeholder => t(".search_placeholder") %> + <%= will_paginate @events %>
diff --git a/app/views/nodes/_node_list.html.erb b/app/views/nodes/_node_list.html.erb index f3101058..55f396b7 100644 --- a/app/views/nodes/_node_list.html.erb +++ b/app/views/nodes/_node_list.html.erb @@ -1,16 +1,7 @@ -<%= form_tag url_for(controller: params[:controller], action: params[:action]), method: :get, class: "node_search_form" do %> - <% Array(params[:kinds]).each do |kind| %> - <%= hidden_field_tag "kinds[]", kind %> - <% end %> - <%= hidden_field_tag :tags, params[:tags] if params[:tags].present? %> - <%= text_field_tag :q, params[:q], placeholder: t(".search_placeholder") %> - <%= button_tag type: "submit", class: "action_button" do %> - <%= icon("search", library: "tabler", "aria-hidden": true) %> <%= t("admin.common.search") %> - <% end %> - <% if params[:q].present? || params[:kinds].present? || params[:tags].present? %> - <%= link_to t("admin.common.reset"), url_for(controller: params[:controller], action: params[:action]) %> - <% end %> -<% end %> +<%= render "shared/search_form", + :placeholder => t(".search_placeholder"), + :hidden => Array(params[:kinds]).map { |k| ["kinds[]", k] } + + (params[:tags].present? ? [["tags", params[:tags]]] : []) %> <%= will_paginate @nodes %>
diff --git a/app/views/shared/_search_form.html.erb b/app/views/shared/_search_form.html.erb new file mode 100644 index 00000000..bff6dfaa --- /dev/null +++ b/app/views/shared/_search_form.html.erb @@ -0,0 +1,15 @@ +<%= form_tag url_for(:controller => params[:controller], :action => params[:action]), + :method => :get, :class => "search_form" do %> + <% Array(local_assigns[:hidden]).each do |field_name, value| %> + <%= hidden_field_tag field_name, value %> + <% end %> + <%= text_field_tag :q, params[:q], :placeholder => placeholder %> + <%= button_tag :type => "submit", :class => "action_button" do %> + <%= icon("search", library: "tabler", "aria-hidden": true) %> + <%= t("admin.common.search") %> + <% end %> + <% if params[:q].present? || Array(local_assigns[:hidden]).any? %> + <%= link_to t("admin.common.reset"), + url_for(:controller => params[:controller], :action => params[:action]) %> + <% end %> +<% end %> -- cgit v1.3