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})