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 @@ + + + + + + + + + + + + <% cards.each do |card| %> + <%= render "card", card: card %> + <% end %> + +
    <%= 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") %>
    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