From ff92bdd88475ecc8b33dc295e29fbbbb28063154 Mon Sep 17 00:00:00 2001 From: Aitor Lopez Beltran Date: Wed, 21 Apr 2021 18:33:32 +0200 Subject: [PATCH] Update meetings order (#78) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Update meetings order * add override to checksum list Co-authored-by: Ivan Vergés --- .../meetings/meetings_controller_decorator.rb | 13 ++++++ app/services/decidim/meetings/meeting_sort.rb | 42 +++++++++++++++++++ spec/lib/overrides_spec.rb | 4 +- spec/services/meeting_sort_spec.rb | 40 ++++++++++++++++++ 4 files changed, 98 insertions(+), 1 deletion(-) create mode 100644 app/decorators/decidim/meetings/meetings_controller_decorator.rb create mode 100644 app/services/decidim/meetings/meeting_sort.rb create mode 100644 spec/services/meeting_sort_spec.rb diff --git a/app/decorators/decidim/meetings/meetings_controller_decorator.rb b/app/decorators/decidim/meetings/meetings_controller_decorator.rb new file mode 100644 index 00000000..448d4cda --- /dev/null +++ b/app/decorators/decidim/meetings/meetings_controller_decorator.rb @@ -0,0 +1,13 @@ +# frozen_string_literal: true + +Decidim::Meetings::MeetingsController.class_eval do + private + + def meetings + @meetings ||= paginate(ordered_results) + end + + def ordered_results + Decidim::Meetings::MeetingSort.new(search.results.not_hidden).sort + end +end diff --git a/app/services/decidim/meetings/meeting_sort.rb b/app/services/decidim/meetings/meeting_sort.rb new file mode 100644 index 00000000..4177ee15 --- /dev/null +++ b/app/services/decidim/meetings/meeting_sort.rb @@ -0,0 +1,42 @@ +# frozen_string_literal: true + +module Decidim + module Meetings + class MeetingSort + def initialize(collection) + @collection = collection + end + + attr_reader :collection + + def sort + meetings.reorder(new_order) + end + + private + + def meetings + Meeting.where(id: collection) + end + + def new_order + Arel.sql("POSITION(id::text IN '#{sorted_ids.join(",")}')") + end + + def sorted_ids + [ + *upcoming_meetings_sorted.ids, + *past_meetings_sorted.ids + ] + end + + def upcoming_meetings_sorted + meetings.upcoming.order(start_time: :asc) + end + + def past_meetings_sorted + meetings.past.order(start_time: :desc) + end + end + end +end diff --git a/spec/lib/overrides_spec.rb b/spec/lib/overrides_spec.rb index f5858e60..e5a24a06 100644 --- a/spec/lib/overrides_spec.rb +++ b/spec/lib/overrides_spec.rb @@ -33,7 +33,9 @@ package: "decidim-meetings", files: { # cells - "/app/views/decidim/meetings/registration_mailer/confirmation.html.erb" => "8b1da026a6cada495fa7c1c921e62bee" + "/app/views/decidim/meetings/registration_mailer/confirmation.html.erb" => "8b1da026a6cada495fa7c1c921e62bee", + # Meetings natural order, to remove when available as a feature of decidim + "/app/controllers/decidim/meetings/meetings_controller.rb" => "e8fd8b7006d32781aa89b85559ab86c7" } }, { diff --git a/spec/services/meeting_sort_spec.rb b/spec/services/meeting_sort_spec.rb new file mode 100644 index 00000000..7f3b6c62 --- /dev/null +++ b/spec/services/meeting_sort_spec.rb @@ -0,0 +1,40 @@ +# frozen_string_literal: true + +require "rails_helper" + +module Decidim::Meetings + describe MeetingSort do + let(:component) { create(:component, manifest_name: "meetings") } + let(:upcoming_meeting_1) { create(:meeting, :upcoming, component: component, start_time: 1.year.from_now) } + let(:upcoming_meeting_2) { create(:meeting, :upcoming, component: component, start_time: 2.years.from_now) } + let(:past_meeting_1) { create(:meeting, :past, component: component, start_time: 1.year.ago) } + let(:past_meeting_2) { create(:meeting, :past, component: component, start_time: 2.years.ago) } + let(:meetings) do + [ + past_meeting_2, + upcoming_meeting_2, + past_meeting_1, + upcoming_meeting_1 + ] + end + + describe "#sort" do + subject { described_class.new(meetings).sort } + + let(:actual_ids) { subject.map(&:id) } + let(:expected_ids) { expected_meetings.map(&:id) } + let(:expected_meetings) do + [ + upcoming_meeting_1, + upcoming_meeting_2, + past_meeting_1, + past_meeting_2 + ] + end + + it "returns meetings in expected order" do + expect(actual_ids).to match(expected_ids) + end + end + end +end