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:
taitus
2023-10-27 10:56:20 +02:00
parent 6059aab674
commit 7c85daac3f
3 changed files with 27 additions and 1 deletions

View File

@@ -12,12 +12,14 @@ class Widget::Card < ApplicationRecord
validates :link_url, presence: true, if: -> { !header? || link_text.present? } validates :link_url, presence: true, if: -> { !header? || link_text.present? }
validates :order, numericality: { greater_than_or_equal_to: 1 } validates :order, numericality: { greater_than_or_equal_to: 1 }
scope :sort_by_order, -> { order(:order, :created_at) }
def self.header def self.header
where(header: true) where(header: true)
end end
def self.body def self.body
where(header: false, cardable_id: nil).order(:created_at) where(header: false, cardable_id: nil).sort_by_order
end end
def header_or_sdg_header? def header_or_sdg_header?

View File

@@ -86,5 +86,14 @@ describe Widget::Card do
expect(Widget::Card.body).not_to include(header) expect(Widget::Card.body).not_to include(header)
expect(Widget::Card.body).not_to include(page_card) expect(Widget::Card.body).not_to include(page_card)
end 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
end end

View File

@@ -143,6 +143,21 @@ describe "Home" do
expect(page).not_to have_css(".title", text: "Featured") expect(page).not_to have_css(".title", text: "Featured")
end 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 describe "Header Card" do
scenario "if there is header card with link, the link content is rendered" 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") create(:widget_card, :header, link_text: "Link text", link_url: "consul.dev")