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
|
def show
|
||||||
load_header
|
load_header
|
||||||
load_settings
|
load_feeds
|
||||||
|
load_recommendations
|
||||||
load_cards
|
load_cards
|
||||||
end
|
end
|
||||||
|
|
||||||
@@ -12,14 +13,16 @@ class Admin::HomepageController < Admin::BaseController
|
|||||||
@header = ::Widget::Card.header
|
@header = ::Widget::Card.header
|
||||||
end
|
end
|
||||||
|
|
||||||
def load_settings
|
def load_recommendations
|
||||||
settings = /feature.homepage.widgets/
|
@recommendations = Setting.where(key: 'feature.user.recommendations').first
|
||||||
@settings = Setting.select {|setting| setting.key =~ /#{settings}/ }
|
|
||||||
@settings << Setting.where(key: 'feature.user.recommendations').first
|
|
||||||
end
|
end
|
||||||
|
|
||||||
def load_cards
|
def load_cards
|
||||||
@cards = ::Widget::Card.body
|
@cards = ::Widget::Card.body
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def load_feeds
|
||||||
|
@feeds = Widget::Feed.order("created_at")
|
||||||
|
end
|
||||||
|
|
||||||
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)
|
KINDS = %w(proposals debates processes)
|
||||||
|
|
||||||
def active?(kind)
|
def active?
|
||||||
Setting["feature.homepage.widgets.feeds.#{kind}"].present?
|
setting.value.present?
|
||||||
|
end
|
||||||
|
|
||||||
|
def setting
|
||||||
|
Setting.where(key: "feature.homepage.widgets.feeds.#{kind}").first
|
||||||
end
|
end
|
||||||
|
|
||||||
def self.active
|
def self.active
|
||||||
KINDS.collect do |kind|
|
KINDS.collect do |kind|
|
||||||
feed = new(kind: kind)
|
feed = find_or_create_by(kind: kind)
|
||||||
feed if feed.active?(kind)
|
feed if feed.active?
|
||||||
end.compact
|
end.compact
|
||||||
end
|
end
|
||||||
|
|
||||||
@@ -30,8 +34,4 @@ class Widget::Feed < ActiveRecord::Base
|
|||||||
Legislation::Process.open.limit(limit)
|
Legislation::Process.open.limit(limit)
|
||||||
end
|
end
|
||||||
|
|
||||||
def limit
|
|
||||||
3
|
|
||||||
end
|
|
||||||
|
|
||||||
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>
|
</div>
|
||||||
|
|
||||||
<hr>
|
<hr>
|
||||||
|
<% @feeds.each do |feed| %>
|
||||||
<% @settings.each do |setting| %>
|
<%= render "feed", feed: feed %>
|
||||||
<div class="callout">
|
|
||||||
<h3 class="inline-block"><%= t("settings.#{setting.key}") %></h3>
|
|
||||||
<div class="float-right">
|
|
||||||
<%= render "setting", setting: setting %>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<% end %>
|
<% 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
|
description: Description
|
||||||
link_text: Link text
|
link_text: Link text
|
||||||
link_url: Link URL
|
link_url: Link URL
|
||||||
|
feeds:
|
||||||
|
proposals: Proposals
|
||||||
|
debates: Debates
|
||||||
|
processes: Processes
|
||||||
new:
|
new:
|
||||||
header_title: New header
|
header_title: New header
|
||||||
submit_header: Create header
|
submit_header: Create header
|
||||||
|
|||||||
@@ -1229,6 +1229,10 @@ es:
|
|||||||
description: Descripción
|
description: Descripción
|
||||||
link_text: Texto del enlace
|
link_text: Texto del enlace
|
||||||
link_url: URL del enlace
|
link_url: URL del enlace
|
||||||
|
feeds:
|
||||||
|
proposals: Propuestas
|
||||||
|
debates: Debates
|
||||||
|
processes: Procesos
|
||||||
new:
|
new:
|
||||||
header_title: Nuevo encabezado
|
header_title: Nuevo encabezado
|
||||||
submit_header: Crear encabezado
|
submit_header: Crear encabezado
|
||||||
|
|||||||
@@ -180,9 +180,10 @@ namespace :admin do
|
|||||||
resources :content_blocks, except: [:show]
|
resources :content_blocks, except: [:show]
|
||||||
end
|
end
|
||||||
|
|
||||||
resource :homepage, controller: :homepage
|
resource :homepage, controller: :homepage, only: [:show]
|
||||||
|
|
||||||
namespace :widget do
|
namespace :widget do
|
||||||
resources :cards
|
resources :cards
|
||||||
|
resources :feeds, only: [:update]
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -2,6 +2,7 @@ class CreateWidgetFeeds < ActiveRecord::Migration
|
|||||||
def change
|
def change
|
||||||
create_table :widget_feeds do |t|
|
create_table :widget_feeds do |t|
|
||||||
t.string :kind
|
t.string :kind
|
||||||
|
t.integer :limit, default: 3
|
||||||
t.timestamps null: false
|
t.timestamps null: false
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -1236,8 +1236,9 @@ ActiveRecord::Schema.define(version: 20180519132610) do
|
|||||||
|
|
||||||
create_table "widget_feeds", force: :cascade do |t|
|
create_table "widget_feeds", force: :cascade do |t|
|
||||||
t.string "kind"
|
t.string "kind"
|
||||||
t.datetime "created_at", null: false
|
t.integer "limit", default: 3
|
||||||
t.datetime "updated_at", null: false
|
t.datetime "created_at", null: false
|
||||||
|
t.datetime "updated_at", null: false
|
||||||
end
|
end
|
||||||
|
|
||||||
add_foreign_key "administrators", "users"
|
add_foreign_key "administrators", "users"
|
||||||
|
|||||||
@@ -12,9 +12,10 @@ feature 'Homepage' do
|
|||||||
Setting['feature.user.recommendations'] = false
|
Setting['feature.user.recommendations'] = false
|
||||||
end
|
end
|
||||||
|
|
||||||
let(:proposals_setting) { Setting.where(key: 'feature.homepage.widgets.feeds.proposals').first }
|
let!(:proposals_feed) { create(:widget_feed, kind: "proposals") }
|
||||||
let(:debates_setting) { Setting.where(key: 'feature.homepage.widgets.feeds.debates').first }
|
let!(:debates_feed) { create(:widget_feed, kind: "debates") }
|
||||||
let(:processes_setting) { Setting.where(key: 'feature.homepage.widgets.feeds.processes').first }
|
let!(:processes_feed) { create(:widget_feed, kind: "processes") }
|
||||||
|
|
||||||
let(:user_recommendations) { Setting.where(key: 'feature.user.recommendations').first }
|
let(:user_recommendations) { Setting.where(key: 'feature.user.recommendations').first }
|
||||||
let(:user) { create(:user) }
|
let(:user) { create(:user) }
|
||||||
|
|
||||||
@@ -23,48 +24,46 @@ feature 'Homepage' do
|
|||||||
|
|
||||||
context "Feeds" do
|
context "Feeds" do
|
||||||
|
|
||||||
scenario "Proposals" do
|
scenario "Proposals", :js do
|
||||||
5.times { create(:proposal) }
|
5.times { create(:proposal) }
|
||||||
|
|
||||||
visit admin_homepage_path
|
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
|
visit root_path
|
||||||
|
|
||||||
expect(page).to have_content "Most active proposals"
|
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
|
end
|
||||||
|
|
||||||
scenario "Debates" do
|
scenario "Debates", :js do
|
||||||
5.times { create(:debate) }
|
5.times { create(:debate) }
|
||||||
|
|
||||||
visit admin_homepage_path
|
visit admin_homepage_path
|
||||||
within("#setting_#{debates_setting.id}") do
|
within("#widget_feed_#{debates_feed.id}") do
|
||||||
click_button "Enable"
|
select '2', from: 'widget_feed_limit'
|
||||||
|
accept_confirm { click_button "Enable" }
|
||||||
end
|
end
|
||||||
|
|
||||||
expect(page).to have_content "Value updated"
|
|
||||||
|
|
||||||
visit root_path
|
visit root_path
|
||||||
|
|
||||||
expect(page).to have_content "Most active debates"
|
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
|
end
|
||||||
|
|
||||||
scenario "Processes" do
|
scenario "Processes", :js do
|
||||||
5.times { create(:legislation_process) }
|
5.times { create(:legislation_process) }
|
||||||
|
|
||||||
visit admin_homepage_path
|
visit admin_homepage_path
|
||||||
within("#setting_#{processes_setting.id}") do
|
within("#widget_feed_#{processes_feed.id}") do
|
||||||
click_button "Enable"
|
select '3', from: 'widget_feed_limit'
|
||||||
|
accept_confirm { click_button "Enable" }
|
||||||
end
|
end
|
||||||
|
|
||||||
expect(page).to have_content "Value updated"
|
|
||||||
|
|
||||||
visit root_path
|
visit root_path
|
||||||
|
|
||||||
expect(page).to have_content "Open processes"
|
expect(page).to have_content "Open processes"
|
||||||
|
|||||||
Reference in New Issue
Block a user