Skip to content

Commit

Permalink
Update meetings order (#78)
Browse files Browse the repository at this point in the history
* Update meetings order

* add override to checksum list

Co-authored-by: Ivan Vergés <ivan@platoniq.net>
  • Loading branch information
aitorlb and microstudi committed Apr 21, 2021
1 parent 31a7604 commit ff92bdd
Show file tree
Hide file tree
Showing 4 changed files with 98 additions and 1 deletion.
13 changes: 13 additions & 0 deletions app/decorators/decidim/meetings/meetings_controller_decorator.rb
Original file line number Diff line number Diff line change
@@ -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
42 changes: 42 additions & 0 deletions app/services/decidim/meetings/meeting_sort.rb
Original file line number Diff line number Diff line change
@@ -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
4 changes: 3 additions & 1 deletion spec/lib/overrides_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -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"
}
},
{
Expand Down
40 changes: 40 additions & 0 deletions spec/services/meeting_sort_spec.rb
Original file line number Diff line number Diff line change
@@ -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

0 comments on commit ff92bdd

Please sign in to comment.