diff --git a/app/components/saved_scenarios/filters/filter_component.html.erb b/app/components/saved_scenarios/filters/filter_component.html.erb
new file mode 100644
index 00000000..8749174f
--- /dev/null
+++ b/app/components/saved_scenarios/filters/filter_component.html.erb
@@ -0,0 +1,11 @@
+<% area_codes.each do |area_code, count|%>
+
+ <%= form.check_box :"area_codes[#{area_code}]",
+ class: "rounded-md mr-5 border-midnight-400 !checked:bg-midnight-920 text-midnight-920",
+ data: { action: "input->search-form#search" }
+ %>
+ <%= form.label :area_codes, t("areas.#{area_code}") + " (#{count})",
+ class: "text-sm text-midnight-450"
+ %>
+
+<%end%>
diff --git a/app/components/saved_scenarios/filters/filter_component.rb b/app/components/saved_scenarios/filters/filter_component.rb
new file mode 100644
index 00000000..cf564e39
--- /dev/null
+++ b/app/components/saved_scenarios/filters/filter_component.rb
@@ -0,0 +1,6 @@
+module SavedScenarios::Filters
+ class FilterComponent < ApplicationComponent
+ option :form
+ option :area_codes
+ end
+end
diff --git a/app/controllers/saved_scenarios_controller.rb b/app/controllers/saved_scenarios_controller.rb
index 879d098f..4e7ee4fc 100644
--- a/app/controllers/saved_scenarios_controller.rb
+++ b/app/controllers/saved_scenarios_controller.rb
@@ -18,7 +18,8 @@ class SavedScenariosController < ApplicationController
# GET /saved_scenarios
def index
- @pagy_saved_scenarios, @saved_scenarios = pagy_countless(user_saved_scenarios)
+ @pagy_saved_scenarios, @saved_scenarios = pagy_countless(ordered_user_saved_scenarios)
+ @area_codes = user_saved_scenarios.group(:area_code).count.sort_by { |_k, v| v }.reverse
respond_to do |format|
format.html
@@ -34,6 +35,7 @@ def list
.viewable_by?(current_user)
.available
.includes(:featured_scenario, :users)
+ .order("updated_at DESC")
@pagy_saved_scenarios, @saved_scenarios = pagy(filtered)
@@ -173,7 +175,10 @@ def user_saved_scenarios
.saved_scenarios
.available
.includes(:featured_scenario, :users)
- .order("updated_at DESC")
+ end
+
+ def ordered_user_saved_scenarios
+ user_saved_scenarios.order("updated_at DESC")
end
# Use callbacks to share common setup or constraints between actions.
diff --git a/app/models/saved_scenario.rb b/app/models/saved_scenario.rb
index b6506c69..16da9520 100644
--- a/app/models/saved_scenario.rb
+++ b/app/models/saved_scenario.rb
@@ -14,7 +14,7 @@ class SavedScenario < ApplicationRecord
AUTO_DELETES_AFTER = 60.days
# Used by Fiterable Concern
- FILTER_PARAMS = %i[title].freeze
+ FILTER_PARAMS = [ :title, area_codes: {} ].freeze
has_one :featured_scenario, dependent: :destroy
has_many :saved_scenario_users, dependent: :destroy
@@ -34,7 +34,6 @@ class SavedScenario < ApplicationRecord
# Returns all saved scenarios whose areas are avaliable.
def self.available
- # kept.where(area_code: Engine::Area.keys)
kept
end
@@ -44,7 +43,10 @@ def self.available
def self.filter(filters)
scenarios = order(created_at: :desc)
+ area_codes = filters["area_codes"]&.filter_map { |area, picked| area if picked == "1" }
+
scenarios = scenarios.by_title(filters["title"]) if filters["title"].present?
+ scenarios = scenarios.where(area_code: area_codes) if area_codes.present?
scenarios
end
@@ -74,7 +76,7 @@ def scenario=(x)
end
def as_json(*)
- json = super(except: ["version_id", "tmp_description"])
+ json = super(except: [ "version_id", "tmp_description" ])
json.merge(
"version" => version.tag,
"title" => localized_title(:en),
diff --git a/app/views/saved_scenarios/_block_right_with_filters.html.erb b/app/views/saved_scenarios/_block_right_with_filters.html.erb
index b26fa1a6..e1fbd9e6 100644
--- a/app/views/saved_scenarios/_block_right_with_filters.html.erb
+++ b/app/views/saved_scenarios/_block_right_with_filters.html.erb
@@ -14,6 +14,9 @@
%>
<%= heroicon 'magnifying-glass', options: {class: 'w-5 h-5 ml-2 my-auto'} %>
+
+ <%= render(SavedScenarios::Filters::FilterComponent.new(form: form, area_codes: area_codes))%>
+
<% end %>
<% end %>
diff --git a/app/views/saved_scenarios/index.html.haml b/app/views/saved_scenarios/index.html.haml
index 36bad620..c16e3ac4 100644
--- a/app/views/saved_scenarios/index.html.haml
+++ b/app/views/saved_scenarios/index.html.haml
@@ -1,7 +1,7 @@
- content_for :title, "#{t('saved_scenarios.title')} - #{t('meta.title')}"
- content_for :menu_title, t('saved_scenarios.title')
-= render(partial: "block_right_with_filters", locals: { has_saved_scenarios: @saved_scenarios.present? })
+= render(partial: "block_right_with_filters", locals: { has_saved_scenarios: @saved_scenarios.present?, area_codes: @area_codes})
- if @saved_scenarios.present?
= render(partial: "saved_scenarios", locals: {pagy_saved_scenarios: @pagy_saved_scenarios, saved_scenarios: @saved_scenarios})