diff --git a/app/assets/stylesheets/layout.scss b/app/assets/stylesheets/layout.scss
index 88738c072..b37405d63 100644
--- a/app/assets/stylesheets/layout.scss
+++ b/app/assets/stylesheets/layout.scss
@@ -2728,7 +2728,8 @@ table {
// 24. Homepage
// ------------
-.home-page {
+.home-page,
+.custom-page {
a {
diff --git a/app/controllers/admin/site_customization/cards_controller.rb b/app/controllers/admin/site_customization/cards_controller.rb
new file mode 100644
index 000000000..c0d06018e
--- /dev/null
+++ b/app/controllers/admin/site_customization/cards_controller.rb
@@ -0,0 +1,9 @@
+class Admin::SiteCustomization::CardsController < Admin::SiteCustomization::BaseController
+ skip_authorization_check
+
+ def index
+ @page = ::SiteCustomization::Page.find(params[:page_id])
+ @cards = @page.cards
+ end
+
+end
diff --git a/app/controllers/admin/widget/cards_controller.rb b/app/controllers/admin/widget/cards_controller.rb
index 519d5ff94..d106c9e60 100644
--- a/app/controllers/admin/widget/cards_controller.rb
+++ b/app/controllers/admin/widget/cards_controller.rb
@@ -2,14 +2,17 @@ class Admin::Widget::CardsController < Admin::BaseController
include Translatable
def new
- @card = ::Widget::Card.new(header: header_card?)
+ if header_card?
+ @card = ::Widget::Card.new(header: header_card?)
+ else
+ @card = ::Widget::Card.new(site_customization_page_id: params[:page_id])
+ end
end
def create
@card = ::Widget::Card.new(card_params)
if @card.save
- notice = "Success"
- redirect_to admin_homepage_url, notice: notice
+ redirect_to_customization_page_cards_or_homepage
else
render :new
end
@@ -22,8 +25,7 @@ class Admin::Widget::CardsController < Admin::BaseController
def update
@card = ::Widget::Card.find(params[:id])
if @card.update(card_params)
- notice = "Updated"
- redirect_to admin_homepage_url, notice: notice
+ redirect_to_customization_page_cards_or_homepage
else
render :edit
end
@@ -33,8 +35,7 @@ class Admin::Widget::CardsController < Admin::BaseController
@card = ::Widget::Card.find(params[:id])
@card.destroy
- notice = "Removed"
- redirect_to admin_homepage_url, notice: notice
+ redirect_to_customization_page_cards_or_homepage
end
private
@@ -43,7 +44,7 @@ class Admin::Widget::CardsController < Admin::BaseController
image_attributes = [:id, :title, :attachment, :cached_attachment, :user_id, :_destroy]
params.require(:widget_card).permit(
- :link_url, :button_text, :button_url, :alignment, :header,
+ :link_url, :button_text, :button_url, :alignment, :header, :site_customization_page_id,
translation_params(Widget::Card),
image_attributes: image_attributes
)
@@ -53,6 +54,20 @@ class Admin::Widget::CardsController < Admin::BaseController
params[:header_card].present?
end
+ def redirect_to_customization_page_cards_or_homepage
+ notice = t("admin.site_customization.pages.cards.#{params[:action]}.notice")
+
+ if @card.site_customization_page_id
+ redirect_to admin_site_customization_page_cards_path(page), notice: notice
+ else
+ redirect_to admin_homepage_url, notice: notice
+ end
+ end
+
+ def page
+ ::SiteCustomization::Page.find(@card.site_customization_page_id)
+ end
+
def resource
Widget::Card.find(params[:id])
end
diff --git a/app/controllers/pages_controller.rb b/app/controllers/pages_controller.rb
index 489ea9dcf..eae9e7509 100644
--- a/app/controllers/pages_controller.rb
+++ b/app/controllers/pages_controller.rb
@@ -9,6 +9,7 @@ class PagesController < ApplicationController
@banners = Banner.in_section('help_page').with_active
if @custom_page.present?
+ @cards = @custom_page.cards
render action: :custom_page
else
render action: params[:id]
diff --git a/app/helpers/admin_helper.rb b/app/helpers/admin_helper.rb
index 55825aba0..06e8c3eb7 100644
--- a/app/helpers/admin_helper.rb
+++ b/app/helpers/admin_helper.rb
@@ -54,11 +54,15 @@ module AdminHelper
end
def menu_customization?
- ["pages", "banners", "information_texts"].include?(controller_name) || menu_homepage?
+ ["pages", "banners", "information_texts"].include?(controller_name) || menu_homepage? || menu_pages?
end
def menu_homepage?
- ["homepage", "cards"].include?(controller_name)
+ ["homepage", "cards"].include?(controller_name) && params[:page_id].nil?
+ end
+
+ def menu_pages?
+ ["pages", "cards"].include?(controller_name) && params[:page_id].present?
end
def official_level_options
diff --git a/app/models/site_customization/page.rb b/app/models/site_customization/page.rb
index 9940e66d9..9d3c6b37e 100644
--- a/app/models/site_customization/page.rb
+++ b/app/models/site_customization/page.rb
@@ -1,5 +1,6 @@
class SiteCustomization::Page < ActiveRecord::Base
VALID_STATUSES = %w(draft published)
+ has_many :cards, class_name: 'Widget::Card', foreign_key: 'site_customization_page_id'
translates :title, touch: true
translates :subtitle, touch: true
diff --git a/app/models/widget/card.rb b/app/models/widget/card.rb
index 4a7733e24..bc7da86d2 100644
--- a/app/models/widget/card.rb
+++ b/app/models/widget/card.rb
@@ -1,5 +1,6 @@
class Widget::Card < ActiveRecord::Base
include Imageable
+ belongs_to :page, class_name: 'SiteCustomization::Page', foreign_key: 'site_customization_page_id'
# table_name must be set before calls to 'translates'
self.table_name = "widget_cards"
@@ -15,6 +16,12 @@ class Widget::Card < ActiveRecord::Base
end
def self.body
- where(header: false).order(:created_at)
+ where(header: false, site_customization_page_id: nil).order(:created_at)
end
+
+ #add widget cards to custom pages
+ def self.page(page_id)
+ where(site_customization_page_id: page_id)
+ end
+
end
diff --git a/app/views/admin/_menu.html.erb b/app/views/admin/_menu.html.erb
index c6ea68172..acc59b45a 100644
--- a/app/views/admin/_menu.html.erb
+++ b/app/views/admin/_menu.html.erb
@@ -122,7 +122,7 @@
<%= link_to t("admin.menu.site_customization.homepage"), admin_homepage_path %>
-
>
+ >
<%= link_to t("admin.menu.site_customization.pages"), admin_site_customization_pages_path %>
diff --git a/app/views/admin/site_customization/cards/_card.html.erb b/app/views/admin/site_customization/cards/_card.html.erb
new file mode 100644
index 000000000..2271f87a1
--- /dev/null
+++ b/app/views/admin/site_customization/cards/_card.html.erb
@@ -0,0 +1,30 @@
+
+
+ <%= card.label %>
+ <%= card.title %>
+ |
+ <%= card.description %> |
+
+ <%= card.link_text %>
+ <%= card.link_url %>
+ |
+
+
+
+ <% if card.image.present? %>
+ <%= link_to t("admin.shared.show_image"), card.image_url(:large),
+ title: card.image.title, target: "_blank" %>
+ <% end %>
+ |
+
+ <%= link_to t("admin.actions.edit"),
+ edit_admin_widget_card_path(card, page_id: params[:page_id]),
+ class: "button hollow" %>
+
+ <%= link_to t("admin.actions.delete"),
+ admin_widget_card_path(card, page_id: params[:page_id]),
+ method: :delete,
+ data: { confirm: t('admin.actions.confirm') },
+ class: "button hollow alert" %>
+ |
+
diff --git a/app/views/admin/site_customization/cards/_cards.html.erb b/app/views/admin/site_customization/cards/_cards.html.erb
new file mode 100644
index 000000000..be538c0d0
--- /dev/null
+++ b/app/views/admin/site_customization/cards/_cards.html.erb
@@ -0,0 +1,16 @@
+
+
+
+ | <%= t("admin.site_customization.pages.cards.title") %> |
+ <%= t("admin.site_customization.pages.cards.description") %> |
+ <%= t("admin.site_customization.pages.cards.link_text") %> / <%= t("admin.site_customization.pages.cards.link_url") %> |
+ <%= t("admin.shared.image") %> |
+ <%= t("admin.shared.actions") %> |
+
+
+
+ <% cards.each do |card| %>
+ <%= render "card", card: card %>
+ <% end %>
+
+
diff --git a/app/views/admin/site_customization/cards/index.html.erb b/app/views/admin/site_customization/cards/index.html.erb
new file mode 100644
index 000000000..1256f7017
--- /dev/null
+++ b/app/views/admin/site_customization/cards/index.html.erb
@@ -0,0 +1,21 @@
+<% provide :title do %>
+ <%= t("admin.header.title") %> - <%= t("admin.menu.site_customization.pages") %> - <%= @page.title %>
+<% end %>
+<%= back_link_to admin_site_customization_pages_path %>
+
+
+ <%= @page.title %> <%= t("admin.site_customization.pages.cards.cards_title") %>
+
+
+ <%= link_to t("admin.site_customization.pages.cards.create_card"),
+ new_admin_widget_card_path(page_id: params[:page_id]), class: "button" %>
+
+
+ <% if @cards.present? %>
+ <%= render "cards", cards: @cards %>
+ <% else %>
+
+ <%= t("admin.site_customization.pages.cards.no_cards") %>
+
+ <% end %>
+
diff --git a/app/views/admin/site_customization/pages/index.html.erb b/app/views/admin/site_customization/pages/index.html.erb
index 5ff7cb5b7..bf1b24569 100644
--- a/app/views/admin/site_customization/pages/index.html.erb
+++ b/app/views/admin/site_customization/pages/index.html.erb
@@ -13,6 +13,7 @@
| <%= t("admin.site_customization.pages.page.title") %> |
<%= t("admin.site_customization.pages.page.slug") %> |
+ <%= t("admin.site_customization.pages.page.cards_title") %> |
<%= t("admin.site_customization.pages.page.created_at") %> |
<%= t("admin.site_customization.pages.page.updated_at") %> |
<%= t("admin.site_customization.pages.page.status") %> |
@@ -26,6 +27,10 @@
<%= link_to page.title, edit_admin_site_customization_page_path(page) %>
<%= page.slug %> |
+
+ <%= link_to t("admin.site_customization.pages.page.see_cards"), admin_site_customization_page_cards_path(page),
+ class: "button hollow expanded" %>
+ |
<%= I18n.l page.created_at, format: :short %> |
<%= I18n.l page.created_at, format: :short %> |
<%= t("admin.site_customization.pages.page.status_#{page.status}") %> |
diff --git a/app/views/admin/widget/cards/_form.html.erb b/app/views/admin/widget/cards/_form.html.erb
index d9e6a955a..c461b4942 100644
--- a/app/views/admin/widget/cards/_form.html.erb
+++ b/app/views/admin/widget/cards/_form.html.erb
@@ -21,6 +21,7 @@
<%= f.hidden_field :header, value: @card.header? %>
+ <%= f.hidden_field :site_customization_page_id, value: @card.site_customization_page_id %>
diff --git a/app/views/pages/_card.html.erb b/app/views/pages/_card.html.erb
new file mode 100644
index 000000000..18e642a5b
--- /dev/null
+++ b/app/views/pages/_card.html.erb
@@ -0,0 +1,16 @@
+
+ <%= link_to card.link_url do %>
+
+
+ <% if card.image.present? %>
+ <%= image_tag(card.image_url(:large), alt: card.image.title) %>
+ <% end %>
+
+ <%= card.label %>
+ <%= card.title %>
+
+
+
<%= card.description %>
+
<%= card.link_text %>
+ <% end %>
+
diff --git a/app/views/pages/_cards.html.erb b/app/views/pages/_cards.html.erb
new file mode 100644
index 000000000..d579e6e75
--- /dev/null
+++ b/app/views/pages/_cards.html.erb
@@ -0,0 +1,7 @@
+
<%= t("welcome.cards.title") %>
+
+
+ <% @cards.find_each do |card| %>
+ <%= render "card", card: card %>
+ <% end %>
+
diff --git a/app/views/pages/custom_page.html.erb b/app/views/pages/custom_page.html.erb
index 61e167549..2af339117 100644
--- a/app/views/pages/custom_page.html.erb
+++ b/app/views/pages/custom_page.html.erb
@@ -1,3 +1,4 @@
+<%= content_for :body_class, "custom-page" %>
<% provide :title do %><%= @custom_page.title %><% end %>
@@ -16,4 +17,11 @@
<%= render '/shared/print' %>
<% end %>
+
+ <% if @cards.any? %>
+
+ <%= render "cards" %>
+
+ <% end %>
+
diff --git a/config/locales/en/admin.yml b/config/locales/en/admin.yml
index 0b51d9556..4d3495493 100644
--- a/config/locales/en/admin.yml
+++ b/config/locales/en/admin.yml
@@ -1448,6 +1448,23 @@ en:
status_published: Published
title: Title
slug: Slug
+ cards_title: Cards
+ see_cards: See Cards
+ cards:
+ cards_title: cards
+ create_card: Create card
+ no_cards: There are no cards.
+ title: Title
+ description: Description
+ link_text: Link text
+ link_url: Link URL
+ create:
+ notice: "Success"
+ update:
+ notice: "Updated"
+ destroy:
+ notice: "Removed"
+
homepage:
title: Homepage
description: The active modules appear in the homepage in the same order as here.
diff --git a/config/locales/es/admin.yml b/config/locales/es/admin.yml
index dc8e66fb0..8a1ca7315 100644
--- a/config/locales/es/admin.yml
+++ b/config/locales/es/admin.yml
@@ -1448,6 +1448,16 @@ es:
status_published: Publicada
title: Título
slug: Slug
+ cards_title: Tarjetas
+ see_cards: Ver tarjetas
+ cards:
+ cards_title: tarjetas
+ create_card: Crear tarjeta
+ no_cards: No hay tarjetas.
+ title: Título
+ description: Descripción
+ link_text: Texto del enlace
+ link_url: URL del enlace
homepage:
title: Título
description: Los módulos activos aparecerán en la homepage en el mismo orden que aquí.
diff --git a/config/routes/admin.rb b/config/routes/admin.rb
index 52740e9d6..65c343aba 100644
--- a/config/routes/admin.rb
+++ b/config/routes/admin.rb
@@ -217,7 +217,9 @@ namespace :admin do
resources :geozones, only: [:index, :new, :create, :edit, :update, :destroy]
namespace :site_customization do
- resources :pages, except: [:show]
+ resources :pages, except: [:show] do
+ resources :cards, only: [:index]
+ end
resources :images, only: [:index, :update, :destroy]
resources :content_blocks, except: [:show]
delete '/heading_content_blocks/:id', to: 'content_blocks#delete_heading_content_block', as: 'delete_heading_content_block'
diff --git a/db/migrate/20181218164126_add_site_customization_page_to_widget_cards.rb b/db/migrate/20181218164126_add_site_customization_page_to_widget_cards.rb
new file mode 100644
index 000000000..f4dad35fc
--- /dev/null
+++ b/db/migrate/20181218164126_add_site_customization_page_to_widget_cards.rb
@@ -0,0 +1,5 @@
+class AddSiteCustomizationPageToWidgetCards < ActiveRecord::Migration
+ def change
+ add_reference :widget_cards, :site_customization_page, index: true
+ end
+end
\ No newline at end of file
diff --git a/db/schema.rb b/db/schema.rb
index 0d5ed3d1a..830ca56de 100644
--- a/db/schema.rb
+++ b/db/schema.rb
@@ -1520,11 +1520,14 @@ ActiveRecord::Schema.define(version: 20190103132925) do
t.string "link_text"
t.string "link_url"
t.string "label"
- t.boolean "header", default: false
- t.datetime "created_at", null: false
- t.datetime "updated_at", null: false
+ t.boolean "header", default: false
+ t.datetime "created_at", null: false
+ t.datetime "updated_at", null: false
+ t.integer "site_customization_page_id"
end
+ add_index "widget_cards", ["site_customization_page_id"], name: "index_widget_cards_on_site_customization_page_id", using: :btree
+
create_table "widget_feeds", force: :cascade do |t|
t.string "kind"
t.integer "limit", default: 3
diff --git a/spec/features/admin/widgets/cards_spec.rb b/spec/features/admin/widgets/cards_spec.rb
index 97571bf32..27f6a4d2b 100644
--- a/spec/features/admin/widgets/cards_spec.rb
+++ b/spec/features/admin/widgets/cards_spec.rb
@@ -130,6 +130,58 @@ feature 'Cards' do
end
end
+ context "Page card" do
+ let!(:custom_page) { create(:site_customization_page) }
+
+ scenario "Create", :js do
+ visit admin_site_customization_pages_path
+ click_link "See Cards"
+ click_link "Create card"
+
+ fill_in "Title", with: "Card for a custom page"
+ click_button "Create card"
+
+ expect(page).to have_current_path admin_site_customization_page_cards_path(custom_page)
+ expect(page).to have_content "Card for a custom page"
+ end
+
+ scenario "Edit", :js do
+ create(:widget_card, page: custom_page, title: "Original title")
+
+ visit admin_site_customization_page_cards_path(custom_page)
+
+ expect(page).to have_content("Original title")
+
+ click_link "Edit"
+
+ within(".translatable-fields") do
+ fill_in "Title", with: "Updated title"
+ end
+
+ click_button "Save card"
+
+ expect(page).to have_current_path admin_site_customization_page_cards_path(custom_page)
+ expect(page).to have_content "Updated title"
+ expect(page).not_to have_content "Original title"
+ end
+
+ scenario "Destroy", :js do
+ create(:widget_card, page: custom_page, title: "Card title")
+
+ visit admin_site_customization_page_cards_path(custom_page)
+
+ expect(page).to have_content("Card title")
+
+ accept_confirm do
+ click_link "Delete"
+ end
+
+ expect(page).to have_current_path admin_site_customization_page_cards_path(custom_page)
+ expect(page).not_to have_content "Card title"
+ end
+
+ end
+
end
pending "add image expectactions"
diff --git a/spec/features/site_customization/custom_pages_spec.rb b/spec/features/site_customization/custom_pages_spec.rb
index 662388ef2..b3b478698 100644
--- a/spec/features/site_customization/custom_pages_spec.rb
+++ b/spec/features/site_customization/custom_pages_spec.rb
@@ -135,6 +135,15 @@ feature "Custom Pages" do
expect(page).to have_selector("h1", text: "Another custom page")
expect(page).to have_content("Subtitle for custom page")
end
+
+ scenario "Show widget cards for that page" do
+ custom_page = create(:site_customization_page, :published)
+ create(:widget_card, page: custom_page, title: "Card Highlights")
+
+ visit custom_page.url
+
+ expect(page).to have_content "Card Highlights"
+ end
end
end
end
diff --git a/spec/models/widget/card_spec.rb b/spec/models/widget/card_spec.rb
index 70c13eafa..b9816f213 100644
--- a/spec/models/widget/card_spec.rb
+++ b/spec/models/widget/card_spec.rb
@@ -26,11 +26,27 @@ describe Widget::Card do
it "returns cards for the homepage body" do
header = create(:widget_card, header: true)
- card1 = create(:widget_card, header: false, title: "Card 1")
- card2 = create(:widget_card, header: false, title: "Card 2")
- card3 = create(:widget_card, header: false, title: "Card 3")
+ card1 = create(:widget_card, header: false)
+ card2 = create(:widget_card, header: false)
+ page_card = create(:widget_card, header: false, page: create(:site_customization_page))
- expect(Widget::Card.body).to eq([card1, card2, card3])
+ expect(Widget::Card.body).to include(card1)
+ expect(Widget::Card.body).to include(card2)
+ expect(Widget::Card.body).not_to include(header)
+ expect(Widget::Card.body).not_to include(page_card)
+ end
+ end
+
+ describe "#custom page" do
+
+ it "return cards for the custom pages" do
+ header = create(:widget_card, header: true)
+ card = create(:widget_card, header: false)
+ card1 = create(:widget_card, header: false, title: "Card 1", site_customization_page_id: 1)
+ card2 = create(:widget_card, header: false, title: "Card 2", site_customization_page_id: 1)
+ card3 = create(:widget_card, header: false, title: "Card 3", site_customization_page_id: 1)
+
+ expect(Widget::Card.page(1)).to eq([card1, card2, card3])
end
end