Add option to configure feed items displayed in homepage
This commit is contained in:
@@ -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
|
||||
16
app/controllers/admin/widget/feeds_controller.rb
Normal file
16
app/controllers/admin/widget/feeds_controller.rb
Normal 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
7
app/helpers/settings.rb
Normal file
@@ -0,0 +1,7 @@
|
||||
module SettingsHelper
|
||||
|
||||
def setting_for_widget(widget)
|
||||
Setting.where(key: 'feature.user.recommendations').first
|
||||
end
|
||||
|
||||
end
|
||||
@@ -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
|
||||
9
app/views/admin/homepage/_feed.html.erb
Normal file
9
app/views/admin/homepage/_feed.html.erb
Normal 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>
|
||||
@@ -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>
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -1236,6 +1236,7 @@ ActiveRecord::Schema.define(version: 20180519132610) do
|
||||
|
||||
create_table "widget_feeds", force: :cascade do |t|
|
||||
t.string "kind"
|
||||
t.integer "limit", default: 3
|
||||
t.datetime "created_at", null: false
|
||||
t.datetime "updated_at", null: false
|
||||
end
|
||||
|
||||
@@ -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"
|
||||
|
||||
Reference in New Issue
Block a user