Allow sorting widget_cards on homepage
Note that we keep :created_at order as complement to new :order field. We do this so that current installations will not notice any change in the sorting of their cards when upgrading, as the default "order" field will always be 1, so it will continue to sort by the "created_at".
This commit is contained in:
@@ -12,12 +12,14 @@ class Widget::Card < ApplicationRecord
|
||||
validates :link_url, presence: true, if: -> { !header? || link_text.present? }
|
||||
validates :order, numericality: { greater_than_or_equal_to: 1 }
|
||||
|
||||
scope :sort_by_order, -> { order(:order, :created_at) }
|
||||
|
||||
def self.header
|
||||
where(header: true)
|
||||
end
|
||||
|
||||
def self.body
|
||||
where(header: false, cardable_id: nil).order(:created_at)
|
||||
where(header: false, cardable_id: nil).sort_by_order
|
||||
end
|
||||
|
||||
def header_or_sdg_header?
|
||||
|
||||
@@ -86,5 +86,14 @@ describe Widget::Card do
|
||||
expect(Widget::Card.body).not_to include(header)
|
||||
expect(Widget::Card.body).not_to include(page_card)
|
||||
end
|
||||
|
||||
it "returns cards sorted by defined order, then by 'created_at' when order is equal" do
|
||||
card1 = create(:widget_card, order: 1)
|
||||
card2 = create(:widget_card, order: 3)
|
||||
card3 = create(:widget_card, order: 2)
|
||||
card4 = create(:widget_card, order: 3)
|
||||
|
||||
expect(Widget::Card.body).to eq [card1, card3, card2, card4]
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
@@ -143,6 +143,21 @@ describe "Home" do
|
||||
expect(page).not_to have_css(".title", text: "Featured")
|
||||
end
|
||||
|
||||
scenario "cards are first sorted by 'order' field, then by 'created_at' when order is equal" do
|
||||
create(:widget_card, title: "Card one", order: 1)
|
||||
create(:widget_card, title: "Card two", order: 3)
|
||||
create(:widget_card, title: "Card three", order: 2)
|
||||
create(:widget_card, title: "Card four", order: 3)
|
||||
|
||||
visit root_path
|
||||
|
||||
within(".cards-container") do
|
||||
expect("CARD ONE").to appear_before("CARD THREE")
|
||||
expect("CARD THREE").to appear_before("CARD TWO")
|
||||
expect("CARD TWO").to appear_before("CARD FOUR")
|
||||
end
|
||||
end
|
||||
|
||||
describe "Header Card" do
|
||||
scenario "if there is header card with link, the link content is rendered" do
|
||||
create(:widget_card, :header, link_text: "Link text", link_url: "consul.dev")
|
||||
|
||||
Reference in New Issue
Block a user