Add option to configure feed items displayed in homepage

This commit is contained in:
rgarcia
2018-05-29 19:58:04 +02:00
parent 7c17eea6a3
commit b672a4550d
12 changed files with 90 additions and 44 deletions

View File

@@ -2,7 +2,8 @@ class Admin::HomepageController < Admin::BaseController
def show
load_header
load_settings
load_feeds
load_recommendations
load_cards
end
@@ -12,14 +13,16 @@ class Admin::HomepageController < Admin::BaseController
@header = ::Widget::Card.header
end
def load_settings
settings = /feature.homepage.widgets/
@settings = Setting.select {|setting| setting.key =~ /#{settings}/ }
@settings << Setting.where(key: 'feature.user.recommendations').first
def load_recommendations
@recommendations = Setting.where(key: 'feature.user.recommendations').first
end
def load_cards
@cards = ::Widget::Card.body
end
def load_feeds
@feeds = Widget::Feed.order("created_at")
end
end

View File

@@ -0,0 +1,16 @@
class Admin::Widget::FeedsController < Admin::BaseController
def update
@feed = ::Widget::Feed.find(params[:id])
@feed.update(feed_params)
render nothing: true
end
private
def feed_params
params.require(:widget_feed).permit(:limit)
end
end

7
app/helpers/settings.rb Normal file
View File

@@ -0,0 +1,7 @@
module SettingsHelper
def setting_for_widget(widget)
Setting.where(key: 'feature.user.recommendations').first
end
end

View File

@@ -3,14 +3,18 @@ class Widget::Feed < ActiveRecord::Base
KINDS = %w(proposals debates processes)
def active?(kind)
Setting["feature.homepage.widgets.feeds.#{kind}"].present?
def active?
setting.value.present?
end
def setting
Setting.where(key: "feature.homepage.widgets.feeds.#{kind}").first
end
def self.active
KINDS.collect do |kind|
feed = new(kind: kind)
feed if feed.active?(kind)
feed = find_or_create_by(kind: kind)
feed if feed.active?
end.compact
end
@@ -30,8 +34,4 @@ class Widget::Feed < ActiveRecord::Base
Legislation::Process.open.limit(limit)
end
def limit
3
end
end

View File

@@ -0,0 +1,9 @@
<div id="<%= dom_id(feed) %>">
<%= t("admin.homepage.feeds.#{feed.kind}") %><br/>
<%= render "setting", setting: feed.setting %>
<%= form_for [:admin, feed], remote: true do |f| %>
<%= f.select :limit, (1..10), {}, class: "js-submit-on-change" %>
<% end %>
</div>

View File

@@ -37,12 +37,13 @@
</div>
<hr>
<% @settings.each do |setting| %>
<div class="callout">
<h3 class="inline-block"><%= t("settings.#{setting.key}") %></h3>
<div class="float-right">
<%= render "setting", setting: setting %>
</div>
</div>
<% @feeds.each do |feed| %>
<%= render "feed", feed: feed %>
<% end %>
<div class="callout">
<h3 class="inline-block"><%= t("settings.#{@recommendations.key}") %></h3>
<div class="float-right">
<%= render "setting", setting: @recommendations %>
</div>
</div>

View File

@@ -1229,6 +1229,10 @@ en:
description: Description
link_text: Link text
link_url: Link URL
feeds:
proposals: Proposals
debates: Debates
processes: Processes
new:
header_title: New header
submit_header: Create header

View File

@@ -1229,6 +1229,10 @@ es:
description: Descripción
link_text: Texto del enlace
link_url: URL del enlace
feeds:
proposals: Propuestas
debates: Debates
processes: Procesos
new:
header_title: Nuevo encabezado
submit_header: Crear encabezado

View File

@@ -180,9 +180,10 @@ namespace :admin do
resources :content_blocks, except: [:show]
end
resource :homepage, controller: :homepage
resource :homepage, controller: :homepage, only: [:show]
namespace :widget do
resources :cards
resources :feeds, only: [:update]
end
end

View File

@@ -2,6 +2,7 @@ class CreateWidgetFeeds < ActiveRecord::Migration
def change
create_table :widget_feeds do |t|
t.string :kind
t.integer :limit, default: 3
t.timestamps null: false
end
end

View File

@@ -1236,8 +1236,9 @@ ActiveRecord::Schema.define(version: 20180519132610) do
create_table "widget_feeds", force: :cascade do |t|
t.string "kind"
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
t.integer "limit", default: 3
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
end
add_foreign_key "administrators", "users"

View File

@@ -12,9 +12,10 @@ feature 'Homepage' do
Setting['feature.user.recommendations'] = false
end
let(:proposals_setting) { Setting.where(key: 'feature.homepage.widgets.feeds.proposals').first }
let(:debates_setting) { Setting.where(key: 'feature.homepage.widgets.feeds.debates').first }
let(:processes_setting) { Setting.where(key: 'feature.homepage.widgets.feeds.processes').first }
let!(:proposals_feed) { create(:widget_feed, kind: "proposals") }
let!(:debates_feed) { create(:widget_feed, kind: "debates") }
let!(:processes_feed) { create(:widget_feed, kind: "processes") }
let(:user_recommendations) { Setting.where(key: 'feature.user.recommendations').first }
let(:user) { create(:user) }
@@ -23,48 +24,46 @@ feature 'Homepage' do
context "Feeds" do
scenario "Proposals" do
scenario "Proposals", :js do
5.times { create(:proposal) }
visit admin_homepage_path
within("#setting_#{proposals_setting.id}") do
click_button "Enable"
end
expect(page).to have_content "Value updated"
within("#widget_feed_#{proposals_feed.id}") do
select '1', from: 'widget_feed_limit'
accept_confirm { click_button "Enable" }
end
visit root_path
expect(page).to have_content "Most active proposals"
expect(page).to have_css(".proposal", count: 3)
expect(page).to have_css(".proposal", count: 1)
end
scenario "Debates" do
scenario "Debates", :js do
5.times { create(:debate) }
visit admin_homepage_path
within("#setting_#{debates_setting.id}") do
click_button "Enable"
within("#widget_feed_#{debates_feed.id}") do
select '2', from: 'widget_feed_limit'
accept_confirm { click_button "Enable" }
end
expect(page).to have_content "Value updated"
visit root_path
expect(page).to have_content "Most active debates"
expect(page).to have_css(".debate", count: 3)
expect(page).to have_css(".debate", count: 2)
end
scenario "Processes" do
scenario "Processes", :js do
5.times { create(:legislation_process) }
visit admin_homepage_path
within("#setting_#{processes_setting.id}") do
click_button "Enable"
within("#widget_feed_#{processes_feed.id}") do
select '3', from: 'widget_feed_limit'
accept_confirm { click_button "Enable" }
end
expect(page).to have_content "Value updated"
visit root_path
expect(page).to have_content "Open processes"