From 7c85daac3fca1270653712b44864efac644b83f0 Mon Sep 17 00:00:00 2001 From: taitus Date: Fri, 27 Oct 2023 10:56:20 +0200 Subject: [PATCH] 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". --- app/models/widget/card.rb | 4 +++- spec/models/widget/card_spec.rb | 9 +++++++++ spec/system/home_spec.rb | 15 +++++++++++++++ 3 files changed, 27 insertions(+), 1 deletion(-) diff --git a/app/models/widget/card.rb b/app/models/widget/card.rb index bd5ed98ea..a07920b35 100644 --- a/app/models/widget/card.rb +++ b/app/models/widget/card.rb @@ -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? diff --git a/spec/models/widget/card_spec.rb b/spec/models/widget/card_spec.rb index f953fcb1e..776b7f2aa 100644 --- a/spec/models/widget/card_spec.rb +++ b/spec/models/widget/card_spec.rb @@ -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 diff --git a/spec/system/home_spec.rb b/spec/system/home_spec.rb index 3234d9178..2efff1af1 100644 --- a/spec/system/home_spec.rb +++ b/spec/system/home_spec.rb @@ -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")