Merge pull request #4320 from consul/sdg_banners

Make it possible to add banners to the SDG section
This commit is contained in:
Javi Martín
2021-01-20 18:49:22 +01:00
committed by GitHub
23 changed files with 125 additions and 51 deletions

View File

@@ -1,5 +1,7 @@
<% provide(:title) { title } %> <% provide(:title) { title } %>
<%= render Shared::BannerComponent.new("sdg") %>
<div class="sdg-goals-index"> <div class="sdg-goals-index">
<%= link_list(*goal_links, class: "sdg-goal-list") %> <%= link_list(*goal_links, class: "sdg-goal-list") %>

View File

@@ -0,0 +1,5 @@
<% if banner %>
<div class="banner" style="background-color:<%= banner.background_color %>;">
<%= sanitize link, attributes: %w[href style] %>
</div>
<% end %>

View File

@@ -0,0 +1,24 @@
class Shared::BannerComponent < ApplicationComponent
attr_reader :banner_or_section
def initialize(banner_or_section)
@banner_or_section = banner_or_section
end
def banner
@banner ||= if banner_or_section.respond_to?(:sections)
banner_or_section
else
Banner.in_section(banner_or_section).with_active.sample
end
end
private
def link
link_to banner.target_url do
tag.h2(banner.title, style: "color:#{banner.font_color}") +
tag.h3(banner.description, style: "color:#{banner.font_color}")
end
end
end

View File

@@ -17,7 +17,6 @@ class BudgetsController < ApplicationController
def index def index
@finished_budgets = @budgets.finished.order(created_at: :desc) @finished_budgets = @budgets.finished.order(created_at: :desc)
@budgets_coordinates = current_budget_map_locations @budgets_coordinates = current_budget_map_locations
@banners = Banner.in_section("budgets").with_active
end end
private private

View File

@@ -16,7 +16,6 @@ module CommentableActions
index_customization index_customization
@tag_cloud = tag_cloud @tag_cloud = tag_cloud
@banners = Banner.in_section(section(resource_model.name)).with_active
set_resource_votes(@resources) set_resource_votes(@resources)
@@ -110,15 +109,6 @@ module CommentableActions
nil nil
end end
def section(resource_name)
case resource_name
when "Proposal"
"proposals"
when "Debate"
"debates"
end
end
def featured_proposals def featured_proposals
@featured_proposals ||= [] @featured_proposals ||= []
end end

View File

@@ -6,7 +6,6 @@ class PagesController < ApplicationController
def show def show
@custom_page = SiteCustomization::Page.published.find_by(slug: params[:id]) @custom_page = SiteCustomization::Page.published.find_by(slug: params[:id])
@banners = Banner.in_section("help_page").with_active
if @custom_page.present? if @custom_page.present?
@cards = @custom_page.cards @cards = @custom_page.cards

View File

@@ -11,7 +11,6 @@ class WelcomeController < ApplicationController
@header = Widget::Card.header.first @header = Widget::Card.header.first
@feeds = Widget::Feed.active @feeds = Widget::Feed.active
@cards = Widget::Card.body @cards = Widget::Card.body
@banners = Banner.in_section("homepage").with_active
@remote_translations = detect_remote_translations(@feeds, @remote_translations = detect_remote_translations(@feeds,
@recommended_debates, @recommended_debates,
@recommended_proposals) @recommended_proposals)

View File

@@ -1,12 +0,0 @@
module BannersHelper
def has_banners?
@banners.present? && @banners.count > 0
end
def banner_target_link(banner)
link_to banner.target_url do
tag.h2(banner.title, style: "color:#{banner.font_color}") +
tag.h3(banner.description, style: "color:#{banner.font_color}")
end
end
end

View File

@@ -79,6 +79,6 @@
</div> </div>
<div class="row"> <div class="row">
<%= render "shared/banner", banner: @banner %> <%= render Shared::BannerComponent.new(@banner) %>
</div> </div>
<% end %> <% end %>

View File

@@ -30,7 +30,7 @@
<tr> <tr>
<td colspan="3"> <td colspan="3">
<span class="help-text"><%= t("admin.banners.index.preview") %></span> <span class="help-text"><%= t("admin.banners.index.preview") %></span>
<%= render "shared/banner", banner: banner %> <%= render Shared::BannerComponent.new(banner) %>
</td> </td>
</tr> </tr>
</tbody> </tbody>

View File

@@ -1,4 +1,4 @@
<%= render "shared/banner" %> <%= render Shared::BannerComponent.new("budgets") %>
<% provide :title do %><%= t("budgets.index.title") %><% end %> <% provide :title do %><%= t("budgets.index.title") %><% end %>

View File

@@ -40,7 +40,7 @@
<div class="row"> <div class="row">
<div id="debates" class="debates-list small-12 medium-9 column"> <div id="debates" class="debates-list small-12 medium-9 column">
<%= render "shared/banner" %> <%= render Shared::BannerComponent.new("debates") %>
<% unless @search_terms || !has_featured? %> <% unless @search_terms || !has_featured? %>
<%= render "featured_debates" %> <%= render "featured_debates" %>

View File

@@ -3,7 +3,7 @@
<%= render "shared/canonical", href: help_url %> <%= render "shared/canonical", href: help_url %>
<% end %> <% end %>
<%= render "shared/banner" %> <%= render Shared::BannerComponent.new("help_page") %>
<div class="jumbo light"> <div class="jumbo light">
<div class="row"> <div class="row">

View File

@@ -49,7 +49,7 @@
<div class="row"> <div class="row">
<div id="proposals" class="proposals-list small-12 medium-9 column"> <div id="proposals" class="proposals-list small-12 medium-9 column">
<%= render "shared/banner" %> <%= render Shared::BannerComponent.new("proposals") %>
<% if show_featured_proposals? %> <% if show_featured_proposals? %>
<div id="featured-proposals" class="row featured-proposals"> <div id="featured-proposals" class="row featured-proposals">

View File

@@ -1,6 +0,0 @@
<% if has_banners? || controller.class == Admin::BannersController %>
<% banner ||= @banners.sample %>
<div class="banner" style="background-color:<%= banner.background_color %>;">
<%= sanitize banner_target_link(banner), attributes: %w[href style] %>
</div>
<% end %>

View File

@@ -4,7 +4,7 @@
<%= render "shared/canonical", href: root_url %> <%= render "shared/canonical", href: root_url %>
<% end %> <% end %>
<%= render "shared/banner" %> <%= render Shared::BannerComponent.new("homepage") %>
<% provide :social_media_meta_tags do %> <% provide :social_media_meta_tags do %>
<%= render "shared/social_media_meta_tags", <%= render "shared/social_media_meta_tags",

View File

@@ -35,6 +35,7 @@ en:
proposals: Proposals proposals: Proposals
budgets: Participatory budgeting budgets: Participatory budgeting
help_page: Help page help_page: Help page
sdg: SDG
edit: edit:
editing: Edit banner editing: Edit banner
form: form:

View File

@@ -35,6 +35,7 @@ es:
proposals: Propuestas proposals: Propuestas
budgets: Presupuestos participativos budgets: Presupuestos participativos
help_page: Página de ayuda help_page: Página de ayuda
sdg: ODS
edit: edit:
editing: Editar el banner editing: Editar el banner
form: form:

View File

@@ -19,10 +19,4 @@ section "Creating banners" do
end end
end end
section "Creating web sections" do load Rails.root.join("db", "web_sections.rb")
WebSection.create!(name: "homepage")
WebSection.create!(name: "debates")
WebSection.create!(name: "proposals")
WebSection.create!(name: "budgets")
WebSection.create!(name: "help_page")
end

View File

@@ -7,12 +7,7 @@ if Administrator.count == 0 && !Rails.env.test?
end end
Setting.reset_defaults Setting.reset_defaults
load Rails.root.join("db", "web_sections.rb")
WebSection.where(name: "homepage").first_or_create!
WebSection.where(name: "debates").first_or_create!
WebSection.where(name: "proposals").first_or_create!
WebSection.where(name: "budgets").first_or_create!
WebSection.where(name: "help_page").first_or_create!
# Default custom pages # Default custom pages
load Rails.root.join("db", "pages.rb") load Rails.root.join("db", "pages.rb")

3
db/web_sections.rb Normal file
View File

@@ -0,0 +1,3 @@
%w[homepage debates proposals budgets help_page sdg].each do |section|
WebSection.where(name: section).first_or_create!
end

View File

@@ -9,6 +9,7 @@ namespace :db do
task load_sdg: :environment do task load_sdg: :environment do
ApplicationLogger.new.info "Adding Sustainable Development Goals content" ApplicationLogger.new.info "Adding Sustainable Development Goals content"
load(Rails.root.join("db", "sdg.rb")) load(Rails.root.join("db", "sdg.rb"))
WebSection.where(name: "sdg").first_or_create!
end end
desc "Calculates the TSV column for all polls and legislation processes" desc "Calculates the TSV column for all polls and legislation processes"

View File

@@ -0,0 +1,79 @@
require "rails_helper"
describe Shared::BannerComponent, type: :component do
it "renders given a banner" do
render_inline Shared::BannerComponent.new(create(:banner, title: "Vote now!"))
expect(page.find(".banner")).to have_content "Vote now!"
end
it "renders given a section" do
create(:banner, web_sections: [WebSection.find_by!(name: "debates")], title: "Debate banner")
create(:banner, web_sections: [WebSection.find_by!(name: "proposals")], title: "Proposal banner")
render_inline Shared::BannerComponent.new("debates")
expect(page.find(".banner")).to have_content "Debate banner"
expect(page).not_to have_content "Proposal banner"
end
context "several banners available in the same section" do
before do
create(:banner,
web_sections: [WebSection.find_by!(name: "debates")],
title: "First banner",
description: "First description",
target_url: "/first_target"
)
create(:banner,
web_sections: [WebSection.find_by!(name: "debates")],
title: "Second banner",
description: "Second description",
target_url: "/second_target"
)
end
it "only renders one banner" do
render_inline Shared::BannerComponent.new("debates")
expect(page).to have_css ".banner", count: 1
end
it "consistently renders one banner" do
render_inline Shared::BannerComponent.new("debates")
if page.has_content?("First banner")
expect(page).to have_content "First description"
expect(page).to have_css "[href='/first_target']"
expect(page).not_to have_content "Second banner"
else
expect(page).to have_content "Second description"
expect(page).to have_css "[href='/second_target']"
end
end
it "only renders active banners" do
Banner.first.update!(post_ended_at: 1.day.ago)
render_inline Shared::BannerComponent.new("debates")
expect(page).to have_content "Second banner"
expect(page).not_to have_content "First banner"
end
it "does not render anything with no active banners" do
Banner.all.each { |banner| banner.update!(post_ended_at: 1.day.ago) }
render_inline Shared::BannerComponent.new("debates")
expect(page).not_to have_css ".banner"
end
end
it "does not render anything given nil" do
render_inline Shared::BannerComponent.new(nil)
expect(page).not_to have_css ".banner"
end
end