diff --git a/app/views/admin/homepage/_card.html.erb b/app/components/admin/widget/cards/row_component.html.erb
similarity index 100%
rename from app/views/admin/homepage/_card.html.erb
rename to app/components/admin/widget/cards/row_component.html.erb
diff --git a/app/components/admin/widget/cards/row_component.rb b/app/components/admin/widget/cards/row_component.rb
new file mode 100644
index 000000000..fed569949
--- /dev/null
+++ b/app/components/admin/widget/cards/row_component.rb
@@ -0,0 +1,7 @@
+class Admin::Widget::Cards::RowComponent < ApplicationComponent
+ attr_reader :card
+
+ def initialize(card)
+ @card = card
+ end
+end
diff --git a/app/components/admin/widget/cards/table_component.html.erb b/app/components/admin/widget/cards/table_component.html.erb
new file mode 100644
index 000000000..d7fc9e579
--- /dev/null
+++ b/app/components/admin/widget/cards/table_component.html.erb
@@ -0,0 +1,22 @@
+<% if cards.any? %>
+
+
+
+ | <%= attribute_name(:title) %> |
+ <%= attribute_name(:description) %> |
+ <%= attribute_name(:link_text) %> / <%= attribute_name(:link_url) %> |
+ <%= t("admin.shared.image") %> |
+ <%= t("admin.shared.actions") %> |
+
+
+
+ <% cards.each do |card| %>
+ <%= render Admin::Widget::Cards::RowComponent.new(card) %>
+ <% end %>
+
+
+<% else %>
+
+ <%= no_cards_message %>
+
+<% end %>
diff --git a/app/components/admin/widget/cards/table_component.rb b/app/components/admin/widget/cards/table_component.rb
new file mode 100644
index 000000000..eba23de30
--- /dev/null
+++ b/app/components/admin/widget/cards/table_component.rb
@@ -0,0 +1,14 @@
+class Admin::Widget::Cards::TableComponent < ApplicationComponent
+ attr_reader :cards, :no_cards_message
+
+ def initialize(cards, no_cards_message:)
+ @cards = cards
+ @no_cards_message = no_cards_message
+ end
+
+ private
+
+ def attribute_name(attribute)
+ ::Widget::Card.human_attribute_name(attribute)
+ end
+end
diff --git a/app/components/sdg/goals/show_component.html.erb b/app/components/sdg/goals/show_component.html.erb
index 788e1319a..44dfebc21 100644
--- a/app/components/sdg/goals/show_component.html.erb
+++ b/app/components/sdg/goals/show_component.html.erb
@@ -9,11 +9,11 @@
- <%= render Widgets::Feeds::ParticipationComponent.new(feeds) %>
+ <%= render Widget::Feeds::ParticipationComponent.new(feeds) %>
<% if processes_feed %>
- <%= render Widgets::Feeds::FeedComponent.new(processes_feed) %>
+ <%= render Widget::Feeds::FeedComponent.new(processes_feed) %>
<% end %>
diff --git a/app/components/widgets/feeds/debate_component.html.erb b/app/components/widget/feeds/debate_component.html.erb
similarity index 100%
rename from app/components/widgets/feeds/debate_component.html.erb
rename to app/components/widget/feeds/debate_component.html.erb
diff --git a/app/components/widgets/feeds/debate_component.rb b/app/components/widget/feeds/debate_component.rb
similarity index 56%
rename from app/components/widgets/feeds/debate_component.rb
rename to app/components/widget/feeds/debate_component.rb
index 28d726811..908348c56 100644
--- a/app/components/widgets/feeds/debate_component.rb
+++ b/app/components/widget/feeds/debate_component.rb
@@ -1,4 +1,4 @@
-class Widgets::Feeds::DebateComponent < ApplicationComponent
+class Widget::Feeds::DebateComponent < ApplicationComponent
attr_reader :debate
def initialize(debate)
diff --git a/app/components/widgets/feeds/feed_component.html.erb b/app/components/widget/feeds/feed_component.html.erb
similarity index 100%
rename from app/components/widgets/feeds/feed_component.html.erb
rename to app/components/widget/feeds/feed_component.html.erb
diff --git a/app/components/widgets/feeds/feed_component.rb b/app/components/widget/feeds/feed_component.rb
similarity index 72%
rename from app/components/widgets/feeds/feed_component.rb
rename to app/components/widget/feeds/feed_component.rb
index cf476382a..847202350 100644
--- a/app/components/widgets/feeds/feed_component.rb
+++ b/app/components/widget/feeds/feed_component.rb
@@ -1,4 +1,4 @@
-class Widgets::Feeds::FeedComponent < ApplicationComponent
+class Widget::Feeds::FeedComponent < ApplicationComponent
attr_reader :feed
delegate :kind, to: :feed
@@ -15,11 +15,11 @@ class Widgets::Feeds::FeedComponent < ApplicationComponent
def item_component_class
case kind
when "proposals"
- Widgets::Feeds::ProposalComponent
+ Widget::Feeds::ProposalComponent
when "debates"
- Widgets::Feeds::DebateComponent
+ Widget::Feeds::DebateComponent
when "processes"
- Widgets::Feeds::ProcessComponent
+ Widget::Feeds::ProcessComponent
end
end
diff --git a/app/components/widgets/feeds/participation_component.html.erb b/app/components/widget/feeds/participation_component.html.erb
similarity index 75%
rename from app/components/widgets/feeds/participation_component.html.erb
rename to app/components/widget/feeds/participation_component.html.erb
index f19bd0e4f..e20bd6f34 100644
--- a/app/components/widgets/feeds/participation_component.html.erb
+++ b/app/components/widget/feeds/participation_component.html.erb
@@ -1,7 +1,7 @@
<% feeds.each do |feed| %>
<% if feed_proposals?(feed) || feed_debates?(feed) %>
- <%= render Widgets::Feeds::FeedComponent.new(feed) %>
+ <%= render Widget::Feeds::FeedComponent.new(feed) %>
<% end %>
<% end %>
diff --git a/app/components/widgets/feeds/participation_component.rb b/app/components/widget/feeds/participation_component.rb
similarity index 76%
rename from app/components/widgets/feeds/participation_component.rb
rename to app/components/widget/feeds/participation_component.rb
index f90b731c3..995e7bea0 100644
--- a/app/components/widgets/feeds/participation_component.rb
+++ b/app/components/widget/feeds/participation_component.rb
@@ -1,4 +1,4 @@
-class Widgets::Feeds::ParticipationComponent < ApplicationComponent
+class Widget::Feeds::ParticipationComponent < ApplicationComponent
attr_reader :feeds
def initialize(feeds)
diff --git a/app/components/widgets/feeds/process_component.html.erb b/app/components/widget/feeds/process_component.html.erb
similarity index 100%
rename from app/components/widgets/feeds/process_component.html.erb
rename to app/components/widget/feeds/process_component.html.erb
diff --git a/app/components/widgets/feeds/process_component.rb b/app/components/widget/feeds/process_component.rb
similarity index 57%
rename from app/components/widgets/feeds/process_component.rb
rename to app/components/widget/feeds/process_component.rb
index 5d9f79f0f..ab8065663 100644
--- a/app/components/widgets/feeds/process_component.rb
+++ b/app/components/widget/feeds/process_component.rb
@@ -1,4 +1,4 @@
-class Widgets::Feeds::ProcessComponent < ApplicationComponent
+class Widget::Feeds::ProcessComponent < ApplicationComponent
attr_reader :process
def initialize(process)
diff --git a/app/components/widgets/feeds/proposal_component.html.erb b/app/components/widget/feeds/proposal_component.html.erb
similarity index 100%
rename from app/components/widgets/feeds/proposal_component.html.erb
rename to app/components/widget/feeds/proposal_component.html.erb
diff --git a/app/components/widgets/feeds/proposal_component.rb b/app/components/widget/feeds/proposal_component.rb
similarity index 58%
rename from app/components/widgets/feeds/proposal_component.rb
rename to app/components/widget/feeds/proposal_component.rb
index 243bb0649..cbb6ae39b 100644
--- a/app/components/widgets/feeds/proposal_component.rb
+++ b/app/components/widget/feeds/proposal_component.rb
@@ -1,4 +1,4 @@
-class Widgets::Feeds::ProposalComponent < ApplicationComponent
+class Widget::Feeds::ProposalComponent < ApplicationComponent
attr_reader :proposal
def initialize(proposal)
diff --git a/app/controllers/admin/dashboard/base_controller.rb b/app/controllers/admin/dashboard/base_controller.rb
index ccbee35ae..55f0fa082 100644
--- a/app/controllers/admin/dashboard/base_controller.rb
+++ b/app/controllers/admin/dashboard/base_controller.rb
@@ -1,9 +1,2 @@
class Admin::Dashboard::BaseController < Admin::BaseController
- helper_method :namespace
-
- private
-
- def namespace
- "admin"
- end
end
diff --git a/app/controllers/admin/legislation/base_controller.rb b/app/controllers/admin/legislation/base_controller.rb
index 22badf745..047180ab3 100644
--- a/app/controllers/admin/legislation/base_controller.rb
+++ b/app/controllers/admin/legislation/base_controller.rb
@@ -2,12 +2,4 @@ class Admin::Legislation::BaseController < Admin::BaseController
include FeatureFlags
feature_flag :legislation
-
- helper_method :namespace
-
- private
-
- def namespace
- "admin"
- end
end
diff --git a/app/controllers/admin/local_census_records/base_controller.rb b/app/controllers/admin/local_census_records/base_controller.rb
index a506e0cdf..cdfbc818f 100644
--- a/app/controllers/admin/local_census_records/base_controller.rb
+++ b/app/controllers/admin/local_census_records/base_controller.rb
@@ -1,9 +1,2 @@
class Admin::LocalCensusRecords::BaseController < Admin::BaseController
- helper_method :namespace
-
- private
-
- def namespace
- "admin"
- end
end
diff --git a/app/controllers/admin/poll/base_controller.rb b/app/controllers/admin/poll/base_controller.rb
index 2d0a2e9d1..05423f15e 100644
--- a/app/controllers/admin/poll/base_controller.rb
+++ b/app/controllers/admin/poll/base_controller.rb
@@ -2,12 +2,4 @@ class Admin::Poll::BaseController < Admin::BaseController
include FeatureFlags
feature_flag :polls
-
- helper_method :namespace
-
- private
-
- def namespace
- "admin"
- end
end
diff --git a/app/controllers/admin/site_customization/base_controller.rb b/app/controllers/admin/site_customization/base_controller.rb
index fb3dcccc7..68228ea0d 100644
--- a/app/controllers/admin/site_customization/base_controller.rb
+++ b/app/controllers/admin/site_customization/base_controller.rb
@@ -1,9 +1,2 @@
class Admin::SiteCustomization::BaseController < Admin::BaseController
- helper_method :namespace
-
- private
-
- def namespace
- "admin"
- end
end
diff --git a/app/controllers/admin/site_customization/cards_controller.rb b/app/controllers/admin/site_customization/cards_controller.rb
index f377283fc..0e2e2f190 100644
--- a/app/controllers/admin/site_customization/cards_controller.rb
+++ b/app/controllers/admin/site_customization/cards_controller.rb
@@ -1,8 +1,15 @@
class Admin::SiteCustomization::CardsController < Admin::SiteCustomization::BaseController
- skip_authorization_check
+ include Admin::Widget::CardsActions
+ load_and_authorize_resource :page, class: "::SiteCustomization::Page"
+ load_and_authorize_resource :card, through: :page, class: "Widget::Card"
+ helper_method :index_path
def index
- @page = ::SiteCustomization::Page.find(params[:page_id])
- @cards = @page.cards
end
+
+ private
+
+ def index_path
+ admin_site_customization_page_widget_cards_path(@page)
+ end
end
diff --git a/app/controllers/admin/widget/cards_controller.rb b/app/controllers/admin/widget/cards_controller.rb
index 097babad3..64ea72bb5 100644
--- a/app/controllers/admin/widget/cards_controller.rb
+++ b/app/controllers/admin/widget/cards_controller.rb
@@ -1,74 +1,11 @@
class Admin::Widget::CardsController < Admin::BaseController
- include Translatable
- include ImageAttributes
-
- def new
- 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
- redirect_to_customization_page_cards_or_homepage
- else
- render :new
- end
- end
-
- def edit
- @card = ::Widget::Card.find(params[:id])
- end
-
- def update
- @card = ::Widget::Card.find(params[:id])
- if @card.update(card_params)
- redirect_to_customization_page_cards_or_homepage
- else
- render :edit
- end
- end
-
- def destroy
- @card = ::Widget::Card.find(params[:id])
- @card.destroy!
-
- redirect_to_customization_page_cards_or_homepage
- end
+ include Admin::Widget::CardsActions
+ load_and_authorize_resource :card, class: "Widget::Card"
+ helper_method :index_path
private
- def card_params
- params.require(:widget_card).permit(
- :link_url, :button_text, :button_url, :alignment, :header, :site_customization_page_id,
- :columns,
- translation_params(Widget::Card),
- image_attributes: image_attributes
- )
- end
-
- def header_card?
- 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_path, notice: notice
- end
- end
-
- def page
- ::SiteCustomization::Page.find(@card.site_customization_page_id)
- end
-
- def resource
- Widget::Card.find(params[:id])
+ def index_path
+ admin_homepage_path
end
end
diff --git a/app/controllers/concerns/admin/widget/cards_actions.rb b/app/controllers/concerns/admin/widget/cards_actions.rb
new file mode 100644
index 000000000..b089ca1a0
--- /dev/null
+++ b/app/controllers/concerns/admin/widget/cards_actions.rb
@@ -0,0 +1,59 @@
+module Admin::Widget::CardsActions
+ extend ActiveSupport::Concern
+ include Translatable
+ include ImageAttributes
+
+ def new
+ @card.header = header_card?
+ render template: "#{cards_view_path}/new"
+ end
+
+ def create
+ if @card.save
+ redirect_to_index
+ else
+ render template: "#{cards_view_path}/new"
+ end
+ end
+
+ def edit
+ render template: "#{cards_view_path}/edit"
+ end
+
+ def update
+ if @card.update(card_params)
+ redirect_to_index
+ else
+ render template: "#{cards_view_path}/edit"
+ end
+ end
+
+ def destroy
+ @card.destroy!
+ redirect_to_index
+ end
+
+ private
+
+ def card_params
+ params.require(:widget_card).permit(
+ :link_url, :button_text, :button_url, :alignment, :header, :columns,
+ translation_params(Widget::Card),
+ image_attributes: image_attributes
+ )
+ end
+
+ def header_card?
+ params[:header_card].present?
+ end
+
+ def redirect_to_index
+ notice = t("admin.site_customization.pages.cards.#{params[:action]}.notice")
+
+ redirect_to index_path, notice: notice
+ end
+
+ def cards_view_path
+ "admin/widget/cards"
+ end
+end
diff --git a/app/controllers/officing/ballot_sheets_controller.rb b/app/controllers/officing/ballot_sheets_controller.rb
index ec1d74002..afc885f61 100644
--- a/app/controllers/officing/ballot_sheets_controller.rb
+++ b/app/controllers/officing/ballot_sheets_controller.rb
@@ -3,8 +3,6 @@ class Officing::BallotSheetsController < Officing::BaseController
before_action :load_poll
before_action :load_officer_assignments, only: [:new, :create]
- helper_method :namespace
-
def index
load_ballot_sheets
end
@@ -31,10 +29,6 @@ class Officing::BallotSheetsController < Officing::BaseController
private
- def namespace
- "officing"
- end
-
def load_poll
@poll = Poll.find(params[:poll_id])
end
diff --git a/app/models/abilities/administrator.rb b/app/models/abilities/administrator.rb
index e93e68e96..b70c7f4d0 100644
--- a/app/models/abilities/administrator.rb
+++ b/app/models/abilities/administrator.rb
@@ -88,6 +88,7 @@ module Abilities
can :manage, SiteCustomization::Page
can :manage, SiteCustomization::Image
can :manage, SiteCustomization::ContentBlock
+ can :manage, Widget::Card
can :access, :ckeditor
can :manage, Ckeditor::Picture
diff --git a/app/models/widget.rb b/app/models/widget.rb
new file mode 100644
index 000000000..bc6f4acb1
--- /dev/null
+++ b/app/models/widget.rb
@@ -0,0 +1,5 @@
+module Widget
+ def self.table_name_prefix
+ "widget_"
+ end
+end
diff --git a/app/models/widget/card.rb b/app/models/widget/card.rb
index 64a840231..0b8ce68a3 100644
--- a/app/models/widget/card.rb
+++ b/app/models/widget/card.rb
@@ -5,15 +5,14 @@ class Widget::Card < ApplicationRecord
foreign_key: "site_customization_page_id",
inverse_of: :cards
- # table_name must be set before calls to 'translates'
- self.table_name = "widget_cards"
-
translates :label, touch: true
translates :title, touch: true
translates :description, touch: true
translates :link_text, touch: true
include Globalizable
+ validates_translation :title, presence: true
+
def self.header
where(header: true)
end
diff --git a/app/models/widget/feed.rb b/app/models/widget/feed.rb
index d90cdee2d..e7dcaa467 100644
--- a/app/models/widget/feed.rb
+++ b/app/models/widget/feed.rb
@@ -1,6 +1,4 @@
class Widget::Feed < ApplicationRecord
- self.table_name = "widget_feeds"
-
KINDS = %w[proposals debates processes].freeze
def active?
diff --git a/app/views/admin/homepage/_cards.html.erb b/app/views/admin/homepage/_cards.html.erb
deleted file mode 100644
index 6cc301bd1..000000000
--- a/app/views/admin/homepage/_cards.html.erb
+++ /dev/null
@@ -1,16 +0,0 @@
-
-
-
- | <%= t("admin.homepage.cards.title") %> |
- <%= t("admin.homepage.cards.description") %> |
- <%= t("admin.homepage.cards.link_text") %> / <%= t("admin.homepage.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/homepage/show.html.erb b/app/views/admin/homepage/show.html.erb
index b931feff5..3c933c961 100644
--- a/app/views/admin/homepage/show.html.erb
+++ b/app/views/admin/homepage/show.html.erb
@@ -9,13 +9,10 @@
<%= link_to t("admin.homepage.create_header"), new_admin_widget_card_path(header_card: true), class: "button" %>
- <% if @header.present? %>
- <%= render "cards", cards: @header %>
- <% else %>
-
- <%= t("admin.homepage.no_header") %>
-
- <% end %>
+ <%= render Admin::Widget::Cards::TableComponent.new(
+ @header,
+ no_cards_message: t("admin.homepage.no_header")
+ ) %>
@@ -27,13 +24,10 @@
<%= link_to t("admin.homepage.create_card"), new_admin_widget_card_path, class: "button" %>
- <% if @cards.present? %>
- <%= render "cards", cards: @cards %>
- <% else %>
-
- <%= t("admin.homepage.no_cards") %>
-
- <% end %>
+ <%= render Admin::Widget::Cards::TableComponent.new(
+ @cards,
+ no_cards_message: t("admin.homepage.no_cards")
+ ) %>
diff --git a/app/views/admin/site_customization/cards/_card.html.erb b/app/views/admin/site_customization/cards/_card.html.erb
deleted file mode 100644
index 578b3c01a..000000000
--- a/app/views/admin/site_customization/cards/_card.html.erb
+++ /dev/null
@@ -1,24 +0,0 @@
-
-
- <%= 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 %>
- |
-
- <%= render Admin::TableActionsComponent.new(card,
- edit_path: edit_admin_widget_card_path(card, page_id: params[:page_id])
- ) %>
- |
-
diff --git a/app/views/admin/site_customization/cards/_cards.html.erb b/app/views/admin/site_customization/cards/_cards.html.erb
deleted file mode 100644
index be538c0d0..000000000
--- a/app/views/admin/site_customization/cards/_cards.html.erb
+++ /dev/null
@@ -1,16 +0,0 @@
-
-
-
- | <%= 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
index 32ccf8fb3..1957744ff 100644
--- a/app/views/admin/site_customization/cards/index.html.erb
+++ b/app/views/admin/site_customization/cards/index.html.erb
@@ -8,14 +8,11 @@
<%= link_to t("admin.site_customization.pages.cards.create_card"),
- new_admin_widget_card_path(page_id: params[:page_id]), class: "button" %>
+ new_admin_site_customization_page_widget_card_path(@page), class: "button" %>
- <% if @cards.present? %>
- <%= render "cards", cards: @cards %>
- <% else %>
-
- <%= t("admin.site_customization.pages.cards.no_cards") %>
-
- <% end %>
+ <%= render Admin::Widget::Cards::TableComponent.new(
+ @cards,
+ no_cards_message: t("admin.site_customization.pages.cards.no_cards")
+ ) %>
diff --git a/app/views/admin/site_customization/pages/index.html.erb b/app/views/admin/site_customization/pages/index.html.erb
index 6d0d8f6e9..08a7956f8 100644
--- a/app/views/admin/site_customization/pages/index.html.erb
+++ b/app/views/admin/site_customization/pages/index.html.erb
@@ -30,7 +30,7 @@
<%= render Admin::TableActionsComponent.new(page) do |actions| %>
<%= actions.link_to t("admin.site_customization.pages.page.see_cards"),
- admin_site_customization_page_cards_path(page),
+ admin_site_customization_page_widget_cards_path(page),
class: "cards-link" %>
<% if page.status == "published" %>
diff --git a/app/views/admin/widget/cards/_form.html.erb b/app/views/admin/widget/cards/_form.html.erb
index ab0762859..9b0ef8c34 100644
--- a/app/views/admin/widget/cards/_form.html.erb
+++ b/app/views/admin/widget/cards/_form.html.erb
@@ -1,6 +1,7 @@
<%= render "shared/globalize_locales", resource: @card %>
-<%= translatable_form_for [:admin, @card] do |f| %>
+<%= translatable_form_for [:admin, @page, @card] do |f| %>
+ <%= render "shared/errors", resource: @card %>
<%= f.translatable_fields do |translations_form| %>
@@ -41,7 +42,6 @@
<%= f.hidden_field :header, value: @card.header? %>
- <%= f.hidden_field :site_customization_page_id, value: @card.site_customization_page_id %>
- <%= f.submit(t("admin.homepage.#{action_name}.#{@card.header? ? "submit_header" : "submit_card"}"), class: "button success") %>
+ <%= f.submit(
+ t("admin.homepage.#{admin_submit_action(@card)}.#{@card.header? ? "submit_header" : "submit_card"}"),
+ class: "button success"
+ ) %>
<% end %>
diff --git a/app/views/admin/widget/cards/edit.html.erb b/app/views/admin/widget/cards/edit.html.erb
index fd7260ba7..f4f751fd1 100644
--- a/app/views/admin/widget/cards/edit.html.erb
+++ b/app/views/admin/widget/cards/edit.html.erb
@@ -1,3 +1,5 @@
+<%= back_link_to index_path %>
+
<% if @card.header? %>
<%= t("admin.homepage.edit.header_title") %>
@@ -6,4 +8,4 @@
<% end %>
-<%= render "form" %>
+<%= render "admin/widget/cards/form" %>
diff --git a/app/views/admin/widget/cards/new.html.erb b/app/views/admin/widget/cards/new.html.erb
index 9e7ee40b2..f15f0172e 100644
--- a/app/views/admin/widget/cards/new.html.erb
+++ b/app/views/admin/widget/cards/new.html.erb
@@ -1,3 +1,5 @@
+<%= back_link_to index_path %>
+
<% if @card.header? %>
<%= t("admin.homepage.new.header_title") %>
@@ -6,4 +8,4 @@
<% end %>
-<%= render "form" %>
+<%= render "admin/widget/cards/form" %>
diff --git a/app/views/welcome/_feeds.html.erb b/app/views/welcome/_feeds.html.erb
index e200d2c42..acd2f3e1f 100644
--- a/app/views/welcome/_feeds.html.erb
+++ b/app/views/welcome/_feeds.html.erb
@@ -1 +1 @@
-<%= render Widgets::Feeds::ParticipationComponent.new(@feeds) %>
+<%= render Widget::Feeds::ParticipationComponent.new(@feeds) %>
diff --git a/app/views/welcome/_processes.html.erb b/app/views/welcome/_processes.html.erb
index d6d3ee1ae..f4afb8bbf 100644
--- a/app/views/welcome/_processes.html.erb
+++ b/app/views/welcome/_processes.html.erb
@@ -1,7 +1,7 @@
<% @feeds.each do |feed| %>
<% if feed_processes?(feed) %>
- <%= render Widgets::Feeds::FeedComponent.new(feed) %>
+ <%= render Widget::Feeds::FeedComponent.new(feed) %>
<% end %>
<% end %>
diff --git a/config/locales/en/admin.yml b/config/locales/en/admin.yml
index 26355ac7d..81348ecf6 100644
--- a/config/locales/en/admin.yml
+++ b/config/locales/en/admin.yml
@@ -1519,10 +1519,6 @@ en:
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
columns_help: "Width of the card in number of columns. On mobile screens it's always a width of 100%."
create:
notice: "Card created successfully!"
@@ -1539,11 +1535,6 @@ en:
cards_title: Cards
create_card: Create card
no_cards: There are no cards.
- cards:
- title: Title
- description: Description
- link_text: Link text
- link_url: Link URL
feeds:
proposals: Proposals
debates: Debates
diff --git a/config/locales/es/admin.yml b/config/locales/es/admin.yml
index f9b6340de..5e54a3f0f 100644
--- a/config/locales/es/admin.yml
+++ b/config/locales/es/admin.yml
@@ -1518,10 +1518,6 @@ es:
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
columns_help: "Ancho de la tarjeta en número de columnas. En pantallas móviles siempre es un ancho del 100%."
create:
notice: "¡Tarjeta creada con éxito!"
@@ -1538,11 +1534,6 @@ es:
cards_title: Tarjetas
create_card: Crear tarjeta
no_cards: No hay tarjetas.
- cards:
- title: Título
- description: Descripción
- link_text: Texto del enlace
- link_url: URL del enlace
feeds:
proposals: Propuestas
debates: Debates
diff --git a/config/routes/admin.rb b/config/routes/admin.rb
index 632a91a64..4bc1f098f 100644
--- a/config/routes/admin.rb
+++ b/config/routes/admin.rb
@@ -227,7 +227,7 @@ namespace :admin do
namespace :site_customization do
resources :pages, except: [:show] do
- resources :cards, only: [:index]
+ resources :cards, except: [:show], as: :widget_cards
end
resources :images, only: [:index, :update, :destroy]
resources :content_blocks, except: [:show]
@@ -270,6 +270,10 @@ resolve "Audit" do |audit|
[*resource_hierarchy_for(audit.associated || audit.auditable), audit]
end
+resolve "Widget::Card" do |card, options|
+ [*resource_hierarchy_for(card.page), card]
+end
+
resolve "Budget::Group" do |group, options|
[group.budget, :group, options.merge(id: group)]
end
diff --git a/spec/components/widgets/feeds/feed_component_spec.rb b/spec/components/widget/feeds/feed_component_spec.rb
similarity index 74%
rename from spec/components/widgets/feeds/feed_component_spec.rb
rename to spec/components/widget/feeds/feed_component_spec.rb
index 2e0d990e9..6eed7ef2a 100644
--- a/spec/components/widgets/feeds/feed_component_spec.rb
+++ b/spec/components/widget/feeds/feed_component_spec.rb
@@ -1,9 +1,9 @@
require "rails_helper"
-describe Widgets::Feeds::FeedComponent, type: :component do
+describe Widget::Feeds::FeedComponent, type: :component do
it "renders a message when there are no items" do
feed = double(kind: "debates", items: [])
- component = Widgets::Feeds::FeedComponent.new(feed)
+ component = Widget::Feeds::FeedComponent.new(feed)
render_inline component
@@ -15,7 +15,7 @@ describe Widgets::Feeds::FeedComponent, type: :component do
let(:feed) { Widget::Feed.new(kind: "debates") }
it "points to the debates path for homepage debates feeds" do
- component = Widgets::Feeds::FeedComponent.new(feed)
+ component = Widget::Feeds::FeedComponent.new(feed)
render_inline component
@@ -23,7 +23,7 @@ describe Widgets::Feeds::FeedComponent, type: :component do
end
it "points to the debates filtered by goal for goal feeds" do
- component = Widgets::Feeds::FeedComponent.new(SDG::Widget::Feed.new(feed, SDG::Goal[6]))
+ component = Widget::Feeds::FeedComponent.new(SDG::Widget::Feed.new(feed, SDG::Goal[6]))
render_inline component
@@ -35,7 +35,7 @@ describe Widgets::Feeds::FeedComponent, type: :component do
let(:feed) { Widget::Feed.new(kind: "proposals") }
it "points to the proposals path for homepage proposals feeds" do
- component = Widgets::Feeds::FeedComponent.new(feed)
+ component = Widget::Feeds::FeedComponent.new(feed)
render_inline component
@@ -43,7 +43,7 @@ describe Widgets::Feeds::FeedComponent, type: :component do
end
it "points to the proposals filtered by goal for goal feeds" do
- component = Widgets::Feeds::FeedComponent.new(SDG::Widget::Feed.new(feed, SDG::Goal[6]))
+ component = Widget::Feeds::FeedComponent.new(SDG::Widget::Feed.new(feed, SDG::Goal[6]))
render_inline component
@@ -55,7 +55,7 @@ describe Widgets::Feeds::FeedComponent, type: :component do
let(:feed) { Widget::Feed.new(kind: "processes") }
it "points to the legislation processes path for homepage processes feeds" do
- component = Widgets::Feeds::FeedComponent.new(feed)
+ component = Widget::Feeds::FeedComponent.new(feed)
render_inline component
@@ -63,7 +63,7 @@ describe Widgets::Feeds::FeedComponent, type: :component do
end
it "points to the legislation processes path for goal processes feeds" do
- component = Widgets::Feeds::FeedComponent.new(SDG::Widget::Feed.new(feed, SDG::Goal[6]))
+ component = Widget::Feeds::FeedComponent.new(SDG::Widget::Feed.new(feed, SDG::Goal[6]))
render_inline component
diff --git a/spec/models/abilities/administrator_spec.rb b/spec/models/abilities/administrator_spec.rb
index 873768d87..fd7f7a718 100644
--- a/spec/models/abilities/administrator_spec.rb
+++ b/spec/models/abilities/administrator_spec.rb
@@ -112,4 +112,6 @@ describe Abilities::Administrator do
it { should be_able_to(:read, SDG::Manager) }
it { should be_able_to(:create, SDG::Manager) }
it { should be_able_to(:destroy, SDG::Manager) }
+
+ it { should be_able_to(:manage, Widget::Card) }
end
diff --git a/spec/models/widget/card_spec.rb b/spec/models/widget/card_spec.rb
index 8f925fefd..e7b01ddfe 100644
--- a/spec/models/widget/card_spec.rb
+++ b/spec/models/widget/card_spec.rb
@@ -9,6 +9,10 @@ describe Widget::Card do
it "is valid" do
expect(card).to be_valid
end
+
+ it "is not valid without a title" do
+ expect(build(:widget_card, title: "")).not_to be_valid
+ end
end
describe "#header" do
diff --git a/spec/routing/polymorphic_routes_spec.rb b/spec/routing/polymorphic_routes_spec.rb
index 8ab22512b..729e16d66 100644
--- a/spec/routing/polymorphic_routes_spec.rb
+++ b/spec/routing/polymorphic_routes_spec.rb
@@ -164,6 +164,19 @@ describe "Polymorphic routes" do
expect(admin_polymorphic_path(shift)).to eq(admin_booth_shift_path(booth, shift))
end
+ it "routes widget cards" do
+ card = create(:widget_card)
+
+ expect(admin_polymorphic_path(card)).to eq(admin_widget_card_path(card))
+ end
+
+ it "routes site customization page widget cards" do
+ page = create(:site_customization_page)
+ card = create(:widget_card, page: page)
+
+ expect(admin_polymorphic_path(card)).to eq admin_site_customization_page_widget_card_path(page, card)
+ end
+
it "supports routes for actions like edit" do
proposal = create(:proposal)
milestone = create(:milestone, milestoneable: proposal)
diff --git a/spec/support/common_actions/notifications.rb b/spec/support/common_actions/notifications.rb
index 4db1cc833..572a4d3c8 100644
--- a/spec/support/common_actions/notifications.rb
+++ b/spec/support/common_actions/notifications.rb
@@ -56,7 +56,7 @@ module Notifications
def error_message(resource_model = nil)
resource_model ||= "(.*)"
field_check_message = "Please check the marked fields to know how to correct them:"
- /\d errors? prevented this #{resource_model} from being saved. #{field_check_message}/
+ /\d errors? prevented this #{resource_model} from being saved.(\n| )#{field_check_message}/
end
def fill_in_admin_notification_form(options = {})
diff --git a/spec/system/admin/widgets/cards_spec.rb b/spec/system/admin/widgets/cards_spec.rb
index 969a9b0ca..444968b7d 100644
--- a/spec/system/admin/widgets/cards_spec.rb
+++ b/spec/system/admin/widgets/cards_spec.rb
@@ -5,6 +5,8 @@ describe "Cards", :admin do
visit admin_homepage_path
click_link "Create card"
+ expect(page).to have_link("Go back", href: admin_homepage_path)
+
fill_in "Label (optional)", with: "Card label"
fill_in "Title", with: "Card text"
fill_in "Description", with: "Card description"
@@ -27,6 +29,15 @@ describe "Cards", :admin do
end
end
+ scenario "Create with errors", :js do
+ visit admin_homepage_path
+ click_link "Create card"
+ click_button "Create card"
+
+ expect(page).to have_text error_message
+ expect(page).to have_button "Create card"
+ end
+
scenario "Index" do
3.times { create(:widget_card) }
@@ -65,6 +76,8 @@ describe "Cards", :admin do
click_link "Edit"
end
+ expect(page).to have_link("Go back", href: admin_homepage_path)
+
within(".translatable-fields") do
fill_in "Label (optional)", with: "Card label updated"
fill_in "Title", with: "Card text updated"
@@ -130,6 +143,15 @@ describe "Cards", :admin do
end
end
+ scenario "Create with errors", :js do
+ visit admin_homepage_path
+ click_link "Create header"
+ click_button "Create header"
+
+ expect(page).to have_text error_message
+ expect(page).to have_button "Create header"
+ end
+
context "Page card" do
let!(:custom_page) { create(:site_customization_page, :published) }
@@ -142,10 +164,13 @@ describe "Cards", :admin do
click_link "Create card"
+ expect(page).to have_link("Go back",
+ href: admin_site_customization_page_widget_cards_path(custom_page))
+
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_current_path admin_site_customization_page_widget_cards_path(custom_page)
expect(page).to have_content "Card for a custom page"
end
@@ -181,19 +206,22 @@ describe "Cards", :admin do
scenario "Edit", :js do
create(:widget_card, page: custom_page, title: "Original title")
- visit admin_site_customization_page_cards_path(custom_page)
+ visit admin_site_customization_page_widget_cards_path(custom_page)
expect(page).to have_content("Original title")
click_link "Edit"
+ expect(page).to have_link("Go back",
+ href: admin_site_customization_page_widget_cards_path(custom_page))
+
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_current_path admin_site_customization_page_widget_cards_path(custom_page)
expect(page).to have_content "Updated title"
expect(page).not_to have_content "Original title"
end
@@ -201,7 +229,7 @@ describe "Cards", :admin do
scenario "Destroy", :js do
create(:widget_card, page: custom_page, title: "Card title")
- visit admin_site_customization_page_cards_path(custom_page)
+ visit admin_site_customization_page_widget_cards_path(custom_page)
expect(page).to have_content("Card title")
@@ -209,7 +237,7 @@ describe "Cards", :admin do
click_link "Delete"
end
- expect(page).to have_current_path admin_site_customization_page_cards_path(custom_page)
+ expect(page).to have_current_path admin_site_customization_page_widget_cards_path(custom_page)
expect(page).not_to have_content "Card title"
end
end
|