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? %> + + + + + + + + + + + + <% cards.each do |card| %> + <%= render Admin::Widget::Cards::RowComponent.new(card) %> + <% end %> + +
<%= attribute_name(:title) %><%= attribute_name(:description) %><%= attribute_name(:link_text) %> / <%= attribute_name(:link_url) %><%= t("admin.shared.image") %><%= t("admin.shared.actions") %>
+<% 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 @@ - - - - - - - - - - - - <% cards.each do |card| %> - <%= render "card", card: card %> - <% end %> - -
<%= 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") %>
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 @@ - - - - - - - - - - - - <% 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 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 %>
@@ -49,7 +49,10 @@
- <%= 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