From 3b2bfc46cf8cf872d44ea8981a1b258d1ebccbd3 Mon Sep 17 00:00:00 2001 From: MaiteHdezRivas Date: Thu, 19 May 2016 12:47:50 +0200 Subject: [PATCH] Admin option to add banners and show banners --- app/assets/images/banners/banner1.png | Bin 0 -> 7918 bytes app/assets/images/banners/banner2.png | Bin 0 -> 10257 bytes app/assets/images/banners/banner3.png | Bin 0 -> 10350 bytes app/assets/images/banners/banner4.png | Bin 0 -> 10258 bytes .../javascripts/advanced_search.js.coffee | 2 + app/assets/javascripts/application.js | 2 + app/assets/javascripts/banners.js.coffee | 25 +++++ app/assets/stylesheets/admin.scss | 1 + app/assets/stylesheets/application.scss | 1 + app/assets/stylesheets/banners.scss | 69 ++++++++++++ .../stylesheets/datepicker_overrides.scss | 2 +- app/assets/stylesheets/variables.scss | 1 + app/controllers/admin/banners_controller.rb | 56 ++++++++++ app/controllers/admin/settings_controller.rb | 8 +- .../concerns/commentable_actions.rb | 2 + app/helpers/banners_helper.rb | 5 + app/models/abilities/administrator.rb | 1 + app/models/abilities/banner.rb | 20 ++++ app/models/banner.rb | 20 ++++ app/models/setting.rb | 22 ++++ app/views/admin/_menu.html.erb | 7 ++ app/views/admin/banners/_errors.html.erb | 15 +++ app/views/admin/banners/_form.html.erb | 69 ++++++++++++ app/views/admin/banners/edit.html.erb | 13 +++ app/views/admin/banners/index.html.erb | 45 ++++++++ app/views/admin/banners/new.html.erb | 13 +++ app/views/admin/settings/index.html.erb | 34 ++++++ app/views/debates/index.html.erb | 4 + app/views/proposals/index.html.erb | 4 + app/views/shared/_banner.html.erb | 9 ++ config/i18n-tasks.yml | 1 + config/locales/admin.en.yml | 36 ++++++ config/locales/admin.es.yml | 34 ++++++ config/routes.rb | 4 + db/dev_seeds.rb | 18 +++ db/migrate/20160518141543_create_banners.rb | 18 +++ db/schema.rb | 55 ++++++++- db/seeds.rb | 11 ++ spec/factories.rb | 10 ++ spec/features/admin/banners_spec.rb | 105 ++++++++++++++++++ spec/models/setting_spec.rb | 24 ++++ 41 files changed, 760 insertions(+), 6 deletions(-) create mode 100644 app/assets/images/banners/banner1.png create mode 100644 app/assets/images/banners/banner2.png create mode 100644 app/assets/images/banners/banner3.png create mode 100644 app/assets/images/banners/banner4.png create mode 100644 app/assets/javascripts/banners.js.coffee create mode 100644 app/assets/stylesheets/banners.scss create mode 100644 app/controllers/admin/banners_controller.rb create mode 100644 app/helpers/banners_helper.rb create mode 100644 app/models/abilities/banner.rb create mode 100644 app/models/banner.rb create mode 100644 app/views/admin/banners/_errors.html.erb create mode 100644 app/views/admin/banners/_form.html.erb create mode 100644 app/views/admin/banners/edit.html.erb create mode 100644 app/views/admin/banners/index.html.erb create mode 100644 app/views/admin/banners/new.html.erb create mode 100644 app/views/shared/_banner.html.erb create mode 100644 db/migrate/20160518141543_create_banners.rb create mode 100644 spec/features/admin/banners_spec.rb diff --git a/app/assets/images/banners/banner1.png b/app/assets/images/banners/banner1.png new file mode 100644 index 0000000000000000000000000000000000000000..eff1cb9d78cca22e091b1e1b282994fb0ae28ce4 GIT binary patch literal 7918 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 literal 0 HcmV?d00001 diff --git a/app/assets/images/banners/banner2.png b/app/assets/images/banners/banner2.png new file mode 100644 index 0000000000000000000000000000000000000000..5b31f5a3a80b60701f7f070fff8a6b3d8d2c6bc2 GIT binary patch literal 10257 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 Y(m2=dosp8vpPx# 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�CNUDYd?a}_bv3@3IV1X-#Yw(q-M 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 literal 0 HcmV?d00001 diff --git a/app/assets/javascripts/advanced_search.js.coffee b/app/assets/javascripts/advanced_search.js.coffee index a5e657633..b38efb874 100644 --- a/app/assets/javascripts/advanced_search.js.coffee +++ b/app/assets/javascripts/advanced_search.js.coffee @@ -23,6 +23,8 @@ App.AdvancedSearch = $('.js-calendar').datepicker regional: locale maxDate: "+0d" + $('.js-calendar-full').datepicker + regional: locale initialize: -> App.AdvancedSearch.init_calendar() diff --git a/app/assets/javascripts/application.js b/app/assets/javascripts/application.js index e24d144bb..a1b8dd70a 100644 --- a/app/assets/javascripts/application.js +++ b/app/assets/javascripts/application.js @@ -44,6 +44,7 @@ //= require tracks //= require valuation_spending_proposal_form //= require embed_video +//= require banners var initialize_modules = function() { App.Comments.initialize(); @@ -63,6 +64,7 @@ var initialize_modules = function() { App.Tracks.initialize(); App.ValuationSpendingProposalForm.initialize(); App.EmbedVideo.initialize(); + App.Banners.initialize(); }; $(function(){ diff --git a/app/assets/javascripts/banners.js.coffee b/app/assets/javascripts/banners.js.coffee new file mode 100644 index 000000000..ec00abe95 --- /dev/null +++ b/app/assets/javascripts/banners.js.coffee @@ -0,0 +1,25 @@ +App.Banners = + + update_banner: (selector, text) -> + $(selector).html(text) + + update_style: (selector, style) -> + $(selector).removeClass($(selector).attr("class"), true) + .addClass(style, true) + + initialize: -> + $('[data-js-banner-title]').on + change: -> + App.Banners.update_banner("#js-banner-title", $(this).val()) + + $('[data-js-banner-description]').on + change: -> + App.Banners.update_banner("#js-banner-description", $(this).val()) + + $("#banner_style").on + change: -> + App.Banners.update_style("#js-banner-style", $(this).val()) + + $("#banner_image").on + change: -> + App.Banners.update_style("#js-banner-image", $(this).val()) diff --git a/app/assets/stylesheets/admin.scss b/app/assets/stylesheets/admin.scss index 48642841d..0def1c8a5 100644 --- a/app/assets/stylesheets/admin.scss +++ b/app/assets/stylesheets/admin.scss @@ -106,6 +106,7 @@ body.admin { a { color: white\9 !important; + color: red\9 !important; } ul { diff --git a/app/assets/stylesheets/application.scss b/app/assets/stylesheets/application.scss index 71e74c251..92ae33b74 100644 --- a/app/assets/stylesheets/application.scss +++ b/app/assets/stylesheets/application.scss @@ -13,3 +13,4 @@ @import "annotator_overrides"; @import "jquery-ui/datepicker"; @import "datepicker_overrides"; +@import "banners"; diff --git a/app/assets/stylesheets/banners.scss b/app/assets/stylesheets/banners.scss new file mode 100644 index 000000000..a14ce6257 --- /dev/null +++ b/app/assets/stylesheets/banners.scss @@ -0,0 +1,69 @@ +// Place all the styles related to the banner controller here. +// They will automatically be included in application.css. +// You can use Sass (SCSS) here: http://sass-lang.com/ + +// 01. Banners +// - - - - - - - - - - - - - - - - - - - - - - - - - + +.banner-style-one { + background-color: $brand; +} + +.banner-style-two { + background-color: $budget; +} + +.banner-style-three { + background-color: #33DADF; +} + +@media (min-width: $medium-breakpoint) { + + .banner-img-one { + background-image: image-url('banners/banner1.png'); + } + + .banner-img-two { + background-image: image-url('banners/banner2.png'); + } + + .banner-img-three { + background-image: image-url('banners/banner3.png'); + } +} + +.banner-img-one, .banner-img-two, .banner-img-three { + background-position: bottom right; + background-repeat: no-repeat; +} + +.banner-style-one, .banner-style-two, .banner-style-three { + margin: 0; + margin-bottom: $line-height; + + h2, h3, a { + color: #eaeaf2; + } + + h2 { + padding: $line-height/2; + padding-bottom: 0; + } + + h3 { + padding: $line-height/2; + padding-top: 0; + } + + a:hover h2, a:hover h3 { + color: #eaeaf2 !important; + text-decoration: none; + } + + @media (min-width: $medium-breakpoint) { + + h3 { + width: 80%; + } + } +} \ No newline at end of file diff --git a/app/assets/stylesheets/datepicker_overrides.scss b/app/assets/stylesheets/datepicker_overrides.scss index abab720e0..9e6419243 100644 --- a/app/assets/stylesheets/datepicker_overrides.scss +++ b/app/assets/stylesheets/datepicker_overrides.scss @@ -51,7 +51,7 @@ border-right: 1px solid $dark; tr th { - color: white; + color: $dark; } } diff --git a/app/assets/stylesheets/variables.scss b/app/assets/stylesheets/variables.scss index 5d59ebf8f..9c621fbd2 100644 --- a/app/assets/stylesheets/variables.scss +++ b/app/assets/stylesheets/variables.scss @@ -77,6 +77,7 @@ $budget: #454372; $budget-hover: #7571BF; $highlight: #E7F2FC; +$highlight-dark: #33DADF; $featured: #FED900; $footer-bg: #DEE0E2; diff --git a/app/controllers/admin/banners_controller.rb b/app/controllers/admin/banners_controller.rb new file mode 100644 index 000000000..dbf683b9a --- /dev/null +++ b/app/controllers/admin/banners_controller.rb @@ -0,0 +1,56 @@ +class Admin::BannersController < Admin::BaseController + + has_filters %w{all with_active with_inactive}, only: :index + + before_action :find_banner, only: [:edit, :update, :destroy] + before_action :banner_styles, only: [:edit, :new, :create, :update] + before_action :banner_imgs, only: [:edit, :new, :create, :update] + + respond_to :html, :js + + load_and_authorize_resource + + def index + @banners = Banner.send(@current_filter).page(params[:page]) + end + + def create + @banner = Banner.new(banner_params) + if @banner.save + redirect_to admin_banners_path + else + render :new + end + end + + def update + @banner.assign_attributes(banner_params) + if @banner.update(banner_params) + redirect_to admin_banners_path + else + render :edit + end + end + + def destroy + @banner.destroy + redirect_to admin_banners_path + end + + private + def banner_params + params.require(:banner).permit(:title, :description, :target_url, :style, :image, :post_started_at, :post_ended_at) + end + + def find_banner + @banner = Banner.find(params[:id]) + end + + def banner_styles + @banner_styles = Setting.all.banner_style.map { |banner_style| [banner_style.value, banner_style.key.split('.')[1]] } + end + + def banner_imgs + @banner_imgs = Setting.all.banner_img.map { |banner_img| [banner_img.value, banner_img.key.split('.')[1]] } + end +end \ No newline at end of file diff --git a/app/controllers/admin/settings_controller.rb b/app/controllers/admin/settings_controller.rb index 387f38177..17bd364f3 100644 --- a/app/controllers/admin/settings_controller.rb +++ b/app/controllers/admin/settings_controller.rb @@ -1,9 +1,11 @@ class Admin::SettingsController < Admin::BaseController def index - all_settings = (Setting.all).group_by { |s| s.feature_flag? } - @settings = all_settings[false] - @feature_flags = all_settings[true] + all_settings = (Setting.all).group_by { |s| s.type } + @settings = all_settings['common'] + @feature_flags = all_settings['feature'] + @banner_styles = all_settings['banner-style'] + @banner_imgs = all_settings['banner-img'] end def update diff --git a/app/controllers/concerns/commentable_actions.rb b/app/controllers/concerns/commentable_actions.rb index de2a2276a..3a79238ea 100644 --- a/app/controllers/concerns/commentable_actions.rb +++ b/app/controllers/concerns/commentable_actions.rb @@ -11,6 +11,8 @@ module CommentableActions index_customization if index_customization.present? @tag_cloud = tag_cloud + @banners = Banner.with_active + set_resource_votes(@resources) set_resources_instance end diff --git a/app/helpers/banners_helper.rb b/app/helpers/banners_helper.rb new file mode 100644 index 000000000..548513c7d --- /dev/null +++ b/app/helpers/banners_helper.rb @@ -0,0 +1,5 @@ +module BannersHelper + def has_banners + @banners.count > 0 + end +end \ No newline at end of file diff --git a/app/models/abilities/administrator.rb b/app/models/abilities/administrator.rb index 6b77c130d..0dfce6d3e 100644 --- a/app/models/abilities/administrator.rb +++ b/app/models/abilities/administrator.rb @@ -42,6 +42,7 @@ module Abilities can :manage, Annotation can [:read, :update, :destroy, :summary], SpendingProposal + can [:search, :edit, :update, :create, :index, :destroy], Banner end end end diff --git a/app/models/abilities/banner.rb b/app/models/abilities/banner.rb new file mode 100644 index 000000000..db8f10635 --- /dev/null +++ b/app/models/abilities/banner.rb @@ -0,0 +1,20 @@ +class Banner < ActiveRecord::Base + + acts_as_paranoid column: :hidden_at + include ActsAsParanoidAliases + + validates :title, presence: true, + length: { minimum: 2 } + validates :description, presence: true + validates :target_url, presence: true + validates :style, presence: true + validates :image, presence: true + validates :post_started_at, presence: true + validates :post_ended_at, presence: true + + scope :with_active, -> {where("post_started_at <= ?", Time.now). + where("post_ended_at >= ?", Time.now) } + + scope :with_inactive,-> {where("post_started_at > ? or post_ended_at < ?", Time.now, Time.now) } + +end \ No newline at end of file diff --git a/app/models/banner.rb b/app/models/banner.rb new file mode 100644 index 000000000..db8f10635 --- /dev/null +++ b/app/models/banner.rb @@ -0,0 +1,20 @@ +class Banner < ActiveRecord::Base + + acts_as_paranoid column: :hidden_at + include ActsAsParanoidAliases + + validates :title, presence: true, + length: { minimum: 2 } + validates :description, presence: true + validates :target_url, presence: true + validates :style, presence: true + validates :image, presence: true + validates :post_started_at, presence: true + validates :post_ended_at, presence: true + + scope :with_active, -> {where("post_started_at <= ?", Time.now). + where("post_ended_at >= ?", Time.now) } + + scope :with_inactive,-> {where("post_started_at > ? or post_ended_at < ?", Time.now, Time.now) } + +end \ No newline at end of file diff --git a/app/models/setting.rb b/app/models/setting.rb index 40659ed74..9010abba5 100644 --- a/app/models/setting.rb +++ b/app/models/setting.rb @@ -2,6 +2,20 @@ class Setting < ActiveRecord::Base validates :key, presence: true, uniqueness: true default_scope { order(id: :asc) } + scope :banner_style, -> { where("key ilike ?", "banner-style.%")} + scope :banner_img, -> { where("key ilike ?", "banner-img.%")} + + def type + if feature_flag? + 'feature' + elsif banner_style? + 'banner-style' + elsif banner_img? + 'banner-img' + else + 'common' + end + end def feature_flag? key.start_with?('feature.') @@ -11,6 +25,14 @@ class Setting < ActiveRecord::Base feature_flag? && value.present? end + def banner_style? + key.start_with?('banner-style.') + end + + def banner_img? + key.start_with?('banner-img.') + end + class << self def [](key) where(key: key).pluck(:value).first.presence diff --git a/app/views/admin/_menu.html.erb b/app/views/admin/_menu.html.erb index bf0382dbd..f8437906f 100644 --- a/app/views/admin/_menu.html.erb +++ b/app/views/admin/_menu.html.erb @@ -43,6 +43,13 @@ <% end %> +
  • > + <%= link_to admin_banners_path do %> + + <%= t("admin.menu.banner") %> + <% end %> +
  • +
  • > <%= link_to admin_users_path do %> diff --git a/app/views/admin/banners/_errors.html.erb b/app/views/admin/banners/_errors.html.erb new file mode 100644 index 000000000..e50720971 --- /dev/null +++ b/app/views/admin/banners/_errors.html.erb @@ -0,0 +1,15 @@ + +<% if @banner.errors.any? %> + +
    + + + + <%= @banner.errors.count %> + <%= t("admin.banners.errors.form.error", count: @banner.errors.count) %> + +
    + +<% end %> \ No newline at end of file diff --git a/app/views/admin/banners/_form.html.erb b/app/views/admin/banners/_form.html.erb new file mode 100644 index 000000000..dce669777 --- /dev/null +++ b/app/views/admin/banners/_form.html.erb @@ -0,0 +1,69 @@ +<%= form_for [:admin, @banner] do |f| %> + + <%= render 'errors' %> + +
    +
    + <%= f.label :style, t("admin.banners.banner.style") %> + <%= f.select :style, options_for_select(@banner_styles, @banner.style),:include_blank => '-', + label: false,placeholder: t("admin.banners.banner.style") %> +
    +
    + <%= f.label :image, t("admin.banners.banner.image") %> + <%= f.select :image, options_for_select(@banner_imgs, @banner.image),:include_blank => '-', + label: false, placeholder: t("admin.banners.banner.image") %> +
    +
    + <%= f.label :title, t("admin.banners.banner.title") %> + <%= f.text_field :title, placeholder: t("admin.banners.banner.title"), label: false, + data: {js_banner_title: "js_banner_title"} %> +
    + +
    + <%= f.label :description, t("admin.banners.banner.description") %> + <%= f.text_field :description, + label: false, + data: {js_banner_description: "js_banner_description"}, + placeholder: t("admin.banners.banner.description") %> +
    + +
    + <%= f.label :target_url, t("admin.banners.banner.target_url") %> + <%= f.text_field :target_url, + label: false, + placeholder: t("admin.banners.banner.target_url") %> +
    + <% date_started_at = @banner.post_started_at.present? ? I18n.localize(@banner.post_started_at) : "" %> +
    + <%= f.label :post_started_at, t("admin.banners.banner.post_started_at") %> + <%= f.text_field :post_started_at, + label: false, + placeholder: t("admin.banners.banner.post_started_at"), + value: date_started_at, + class: "js-calendar-full", + id: "post_started_at" %> +
    + <% date_ended_at = @banner.post_ended_at.present? ? I18n.localize(@banner.post_ended_at) : ""%> +
    + <%= f.label :post_ended_at, t("admin.banners.banner.post_ended_at") %> + <%= f.text_field :post_ended_at, + label: false, + placeholder: t("admin.banners.banner.post_ended_at"), + value: date_ended_at, + class: "js-calendar-full", + id: "post_ended_at" %> +
    + +
    + <%= f.submit(class: "button", value: t("admin.banners.edit.form.submit_button")) %> +
    +
    +
    +
    + <%= link_to @banner.target_url do %> +

    <%= @banner.title %>

    +

    <%= @banner.description %>

    + <% end %> +
    +
    +<% end %> \ No newline at end of file diff --git a/app/views/admin/banners/edit.html.erb b/app/views/admin/banners/edit.html.erb new file mode 100644 index 000000000..9f2ad0ac0 --- /dev/null +++ b/app/views/admin/banners/edit.html.erb @@ -0,0 +1,13 @@ + \ No newline at end of file diff --git a/app/views/admin/banners/index.html.erb b/app/views/admin/banners/index.html.erb new file mode 100644 index 000000000..84395f644 --- /dev/null +++ b/app/views/admin/banners/index.html.erb @@ -0,0 +1,45 @@ +<%= link_to t("admin.banners.index.create"), + new_admin_banner_path, class: "button large success float-right" %> + +

    <%= t("admin.banners.index.title") %>

    + +<%= render 'shared/filter_subnav', i18n_namespace: "admin.banners.index" %> + +

    <%= page_entries_info @banners %>

    + + + <% @banners.each do |banner| %> + + + + + + <% end %> +
    +
    +
    + <%= link_to banner.target_url do %> +

    <%= banner.title %>

    +

    <%= banner.description %>

    + <% end %> +
    +
    + + <%= t("admin.banners.banner.post_started_at")%> <%= banner.post_started_at %> +  |  + <%= t("admin.banners.banner.post_ended_at")%> <%= banner.post_ended_at%> +
    + <%= link_to edit_admin_banner_path(banner), + class: 'edit-banner button' do %> + + <%= t("admin.banners.index.edit") %> + <% end %> + + <%= link_to admin_banner_path(banner), method: :delete, + class: 'delete' do %> + + <%= t("admin.banners.index.delete") %> + <% end %> +
    + +<%= paginate @banners %> \ No newline at end of file diff --git a/app/views/admin/banners/new.html.erb b/app/views/admin/banners/new.html.erb new file mode 100644 index 000000000..41a48084d --- /dev/null +++ b/app/views/admin/banners/new.html.erb @@ -0,0 +1,13 @@ + \ No newline at end of file diff --git a/app/views/admin/settings/index.html.erb b/app/views/admin/settings/index.html.erb index b18a1eb39..44aa09026 100644 --- a/app/views/admin/settings/index.html.erb +++ b/app/views/admin/settings/index.html.erb @@ -32,3 +32,37 @@
  • <% end %> + +<% if @banner_styles.present? %> +

    <%= t("admin.settings.index.banners") %>

    + +
      + <% @banner_styles.each do |setting| %> +
    • + <%= t("settings.#{setting.key}") %> + + <%= form_for(setting, url: admin_setting_path(setting), html: { id: "edit_#{dom_id(setting)}"}) do |f| %> + <%= f.text_area :value, label: false, id: dom_id(setting), lines: 1 %> + <%= f.submit(t('admin.settings.index.update_setting'), class: "button small success") %> + <% end %> +
    • + <% end %> +
    +<% end %> + +<% if @banner_imgs.present?%> +

    <%= t("admin.settings.index.banner_imgs") %>

    + +
      + <% @banner_imgs.each do |setting| %> +
    • + <%= t("settings.#{setting.key}") %> + + <%= form_for(setting, url: admin_setting_path(setting), html: { id: "edit_#{dom_id(setting)}"}) do |f| %> + <%= f.text_area :value, label: false, id: dom_id(setting), lines: 1 %> + <%= f.submit(t('admin.settings.index.update_setting'), class: "button small success") %> + <% end %> +
    • + <% end %> +
    +<% end %> diff --git a/app/views/debates/index.html.erb b/app/views/debates/index.html.erb index ab0a137c7..6809782b1 100644 --- a/app/views/debates/index.html.erb +++ b/app/views/debates/index.html.erb @@ -25,6 +25,10 @@ <% end %> + <% if has_banners %> + <%= render "shared/banner" %> + <% end %> + <% unless @tag_filter || @search_terms || !has_featured? %> <%= render "featured_debates" %> <% end %> diff --git a/app/views/proposals/index.html.erb b/app/views/proposals/index.html.erb index 67ee98f67..6f6516890 100644 --- a/app/views/proposals/index.html.erb +++ b/app/views/proposals/index.html.erb @@ -27,6 +27,10 @@ <% end %> + <% if has_banners %> + <%= render "shared/banner" %> + <% end %> + <% if @featured_proposals.present? %>