radiant-banner_rotator-extension 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (43) hide show
  1. data/.gitmodules +3 -0
  2. data/HELP.textile +87 -0
  3. data/README.textile +68 -0
  4. data/Rakefile +136 -0
  5. data/VERSION +1 -0
  6. data/app/controllers/admin/banners_controller.rb +61 -0
  7. data/app/helpers/admin/banners_helper.rb +62 -0
  8. data/app/models/banner.rb +101 -0
  9. data/app/models/banner_placement.rb +7 -0
  10. data/app/views/admin/banners/_form.html.haml +76 -0
  11. data/app/views/admin/banners/_modify_banner.html.haml +8 -0
  12. data/app/views/admin/banners/deactivate.html.haml +10 -0
  13. data/app/views/admin/banners/edit.html.haml +8 -0
  14. data/app/views/admin/banners/index.html.haml +118 -0
  15. data/app/views/admin/banners/new.html.haml +5 -0
  16. data/app/views/admin/banners/remove.html.haml +12 -0
  17. data/app/views/admin/pages/_banner_info.html.haml +28 -0
  18. data/app/views/admin/pages/_banners_column.html.haml +11 -0
  19. data/app/views/admin/pages/_banners_column_header.html.haml +9 -0
  20. data/banner_rotator_extension.rb +41 -0
  21. data/config/initializers/radiant_config.rb +3 -0
  22. data/config/locales/en.yml +34 -0
  23. data/config/routes.rb +5 -0
  24. data/db/migrate/001_create_banners.rb +31 -0
  25. data/db/migrate/002_change_banners_default.rb +9 -0
  26. data/db/migrate/003_add_description.rb +9 -0
  27. data/lib/banner_rotator/page_extensions.rb +47 -0
  28. data/lib/banner_rotator/tags.rb +67 -0
  29. data/lib/tasks/banner_rotator_extension_tasks.rake +29 -0
  30. data/public/images/admin/deactivate.png +0 -0
  31. data/public/images/admin/pictures.png +0 -0
  32. data/public/images/admin/text_list_numbers.png +0 -0
  33. data/public/javascripts/lowpro.js +320 -0
  34. data/spec/controllers/admin_banners_controller_spec.rb +231 -0
  35. data/spec/datasets/banners_dataset.rb +26 -0
  36. data/spec/helpers/admin/banners_helper_spec.rb +9 -0
  37. data/spec/models/banner_placement_spec.rb +44 -0
  38. data/spec/models/banner_spec.rb +47 -0
  39. data/spec/models/page_extensions_spec.rb +25 -0
  40. data/spec/models/tags_spec.rb +69 -0
  41. data/spec/spec.opts +6 -0
  42. data/spec/spec_helper.rb +36 -0
  43. metadata +124 -0
@@ -0,0 +1,7 @@
1
+ class BannerPlacement < ActiveRecord::Base
2
+ belongs_to :page
3
+ belongs_to :banner
4
+ validates_presence_of :page_id, :banner_id, :weight
5
+ validates_inclusion_of :weight, :in => 1..10, :allow_nil => true
6
+ validates_uniqueness_of :page_id, :scope => :banner_id
7
+ end
@@ -0,0 +1,76 @@
1
+ - include_javascript 'lowpro'
2
+
3
+ - content_for :page_scripts, banner_edit_javascripts
4
+
5
+ %p#placement_select_template{:style => 'display:none'}
6
+ = select_tag "banner[placements][][page_id]", options_for_select(pages_for_select)
7
+ = select_tag "banner[placements][][weight]", options_for_select((1..10).to_a), :title => 'weight'
8
+ = link_to_function 'Remove', 'this.up().remove();', :class => 'delete-link'
9
+
10
+ - form_for [:admin, @banner], :html => {'data-onsubmit_status' => onsubmit_status(@banner)} do |f|
11
+ / = f.hidden_field :lock_version # for optimistic locking. Not yet implemented for banners
12
+ = render_region :form_top, :locals => {:f => f}
13
+ .form-area
14
+ - render_region :form, :locals => {:f => f} do |form|
15
+ - form.edit_title do
16
+ %p.title
17
+ %label
18
+ %span.inline_label= t('name')
19
+ = f.text_field :name, :class => 'textbox activate', :size => 32, :maxlength => 100, :style => "width: 85%;"
20
+ - form.edit_content do
21
+ %p
22
+ %label
23
+ %span.inline_label= t('description')
24
+ ~ f.text_field :description, :class => 'textbox'
25
+ %p
26
+ %label
27
+ %span.inline_label= t('banner_rotator.background_image')
28
+ = f.text_field :background_image, :class => 'textbox'
29
+ %p
30
+ %label
31
+ %span.inline_label= t('banner_rotator.foreground_image')
32
+ = f.text_field :foreground_image, :class => 'textbox'
33
+ %p
34
+ %label
35
+ %span.inline_label= t('banner_rotator.link_url')
36
+ = f.text_field :link_url, :class => 'textbox'
37
+ %p
38
+ %label
39
+ %span.inline_label=t('banner_rotator.target')
40
+ = f.select :link_target, ['_top', '_blank']
41
+ = t('banner_rotator.text.banners.target_instruction')
42
+ %p
43
+ %label
44
+ %span.inline_label= t('banner_rotator.image_style')
45
+ ~ f.text_field :image_style, :class => 'textbox activate'
46
+ %hr
47
+ %div
48
+ %p
49
+ %label
50
+ %span.inline_label=t('banner_rotator.assigned_pages')
51
+ =link_to image('plus') + " " + t('banner_rotator.add_page'), '#', :id => 'add-page-link', :class => 'action'
52
+ - @banner.placements.each do |p|
53
+ %p
54
+ = select_tag "banner[placements][][page_id]", options_for_select(pages_for_select, p['page_id'])
55
+ = select_tag "banner[placements][][weight]", options_for_select((1..10).to_a, p['weight']), :title => 'weight'
56
+ = link_to_function image('minus') + ' ' + t('remove'), 'this.up().remove();', :class => "action"
57
+
58
+ - render_region :form_bottom, :locals => {:f => f} do |form_bottom|
59
+ - form_bottom.edit_buttons do
60
+ %p.buttons{:style=>"clear: left"}
61
+ = save_model_button(@banner)
62
+ = save_model_and_continue_editing_button(@banner)
63
+ = t('or')
64
+ = link_to t('cancel'), admin_banners_url
65
+ - form_bottom.edit_timestamp do
66
+ = updated_stamp @banner
67
+
68
+ - content_for :page_css do
69
+ :sass
70
+ .inline_label
71
+ display: inline-block
72
+ text-align: right
73
+ width: 130px
74
+ margin: 0 10px 0 0
75
+ .textbox
76
+ width: 85%
@@ -0,0 +1,8 @@
1
+ %table.index#banners
2
+ %tbody
3
+ %tr.node.level_1
4
+ %td.name{:style => "text-align: center;"}
5
+ %span.title= @banner.name
6
+ %td{:style => "height: 150px; width: 75%; background: url(#{@banner.background_image}) center left no-repeat;"}
7
+ - unless @banner.foreground_image.blank?
8
+ %img{:src => @banner.foreground_image, :alt => '', :style => "position: relative; #{@banner.image_style}"}
@@ -0,0 +1,10 @@
1
+ %h1= t('banner_rotator.deactivate_banner')
2
+ %p= t('banner_rotator.text.banners.deactivate_warning')
3
+
4
+ = render :partial => 'modify_banner'
5
+
6
+ - form_for [:admin, @banner], :html => {:action => :deactivate, 'data-onsubmit_status'=>"Deactivating banner&#8230;"} do
7
+ %p.buttons
8
+ %input.button{:type=>"submit", :value => t('banner_rotator.deactivate_banner')}/
9
+ = t('or')
10
+ = link_to t('cancel'), admin_banners_url
@@ -0,0 +1,8 @@
1
+ - @page_title = @banner.name + ' ' + t('banner_rotator.banner') + ' - ' + default_page_title
2
+
3
+ - render_region :main do |main|
4
+ - main.edit_header do
5
+ %h1= t('banner_rotator.edit_banner')
6
+ - main.edit_form do
7
+ = render :partial => 'form'
8
+ = render :partial => 'modify_banner'
@@ -0,0 +1,118 @@
1
+ - include_javascript 'admin/tablekit'
2
+
3
+ - @page_title = t('banner_rotator.banners') + ' - ' + default_page_title
4
+
5
+ - case true
6
+ - when params[:view] == 'active' && params[:sort] == 'page'
7
+ - @banners = Banner.find_active_by_pages
8
+ - when params[:view] == 'active'
9
+ - @banners = Banner.find_active
10
+ - when params[:view] == 'inactive'
11
+ - @banners = Banner.find_inactive
12
+ - when params[:sort] == 'page'
13
+ - @banners = Banner.find_all_by_pages
14
+
15
+ .outset
16
+ = render_region :top
17
+ .banner_selectors
18
+ %ul#banner_view
19
+ %li#all_view= link_or_span_unless_current(params, "#{t('banner_rotator.show_all')} (#{Banner.total_count})", admin_banners_path, :onclick => "Cookies.set('banner_rotator.banner_view', 'all');", :param => 'view')
20
+ %li#active_view= link_or_span_unless_current(params, "#{t('banner_rotator.show_active_only')} (#{Banner.total_active_count})", admin_banners_path(:view => 'active'), :onclick => "Cookies.set('banner_rotator.banner_view', 'active');", :param => 'view', :id => 'active')
21
+ %li#inactive_view= link_or_span_unless_current(params, "#{t('banner_rotator.show_inactive_only')} (#{Banner.total_inactive_count})", admin_banners_path(:view => 'inactive'), :onclick => "Cookies.set('banner_rotator.banner_view', 'inactive');", :param => 'view', :id => 'inactive')
22
+ - unless params[:view] == 'inactive'
23
+ %ul#banner_sort
24
+ %li.label= t('banner_rotator.sort_by') + ":"
25
+ %li#name_sort= link_or_span_unless_current(params, t('banner_rotator.banner_name'), admin_banners_path, :onclick => "Cookies.set('banner_rotator.banner_sort', 'name');", :param => 'sort', :id => 'name')
26
+ %li#page_sort= link_or_span_unless_current(params, t('banner_rotator.assigned_pages'), admin_banners_path(:sort => 'page'), :onclick => "Cookies.set('banner_rotator.banner_sort', 'page');", :param => 'sort', :id => 'page')
27
+ %table.index#banners
28
+ %thead
29
+ %tr
30
+ - render_region :thead do |thead|
31
+ - thead.title_header do
32
+ %th.banner{:colspan => 2}= t('banner_rotator.banner')
33
+ - thead.pages_header do
34
+ %th.pages= t('banner_rotator.assigned_pages')
35
+ - thead.actions_header do
36
+ %th.actions{:style=>"width:9em"}= t('modify')
37
+ %tbody
38
+ - if @banners.any?
39
+ - @banners.each do |banner|
40
+ %tr[banner]
41
+ - render_region :tbody, :locals => {:banner => banner} do |tbody|
42
+ - tbody.title_cell do
43
+ %td.preview
44
+ %a{:href => edit_admin_banner_url(banner)}
45
+ %img.snapshot{:src => banner.background_image, :alt => "#{banner.name} #{t('banner_rotator.banner')}", :title => "#{t('banner_rotator.edit')} #{banner.name} #{t('banner_rotator.banner')}"}
46
+ %td.name
47
+ = link_to banner.name, edit_admin_banner_url(banner)
48
+ - tbody.pages_cell do
49
+ %td.pages
50
+ - unless banner.pages.blank?
51
+ - banner.pages.each do |page|
52
+ %a{:href => edit_admin_page_url(page), :title => "#{t('banner_rotator.edit')} #{page.title} #{t('banner_rotator.page')}"}= page.breadcrumb
53
+ &nbsp;
54
+ - else
55
+ (none)
56
+ - tbody.actions_cell do
57
+ %td.actions
58
+ = link_to image('minus') + ' ' + t('remove'), remove_admin_banner_url(banner), :class => "action"
59
+ - if banner.active?
60
+ =link_to image('deactivate') + ' ' + t('banner_rotator.deactivate'), deactivate_admin_banner_url(banner), :class => 'action'
61
+ - else
62
+ %tr
63
+ %td.empty{:colspan => admin.banner.index.tbody.length + 1}= t('banner_rotator.no_banners')
64
+
65
+ - render_region :bottom do |bottom|
66
+ - bottom.new_button do
67
+ #actions
68
+ = pagination_for(@banners)
69
+ %ul
70
+ %li= link_to image('plus') + " " + t('banner_rotator.new_banner'), new_admin_banner_url
71
+
72
+ - content_for :page_css do
73
+ :sass
74
+ .banner_selectors
75
+ margin: 11px 0 0 0
76
+ height: 19px
77
+ ul
78
+ list-style: none
79
+ li
80
+ display: inline
81
+ font-size: 80%
82
+ a, a:visited
83
+ a:hover
84
+ background-color: #e5f5ff
85
+ span
86
+ border: 1px solid #d5f0ff
87
+ background-color: #c5dff5
88
+ #banner_view, #new
89
+ float: left
90
+ margin: -5px 0 0 90px
91
+ #banner_sort
92
+ float: right
93
+ margin: -5px 120px 0 0
94
+ li
95
+ a, span
96
+ padding: 5px 5px 5px 25px
97
+ background-position: 5px center
98
+ background-repeat: no-repeat
99
+ #all_view, #active_view, #inactive_view
100
+ a, span
101
+ background-image: url(/images/admin/pictures.png)
102
+ #name_sort, #page_sort
103
+ a, span
104
+ background-image: url(/images/admin/text_list_numbers.png)
105
+ table.index#banners
106
+ td
107
+ .snapshot
108
+ height: 40px
109
+ max-width: 320px
110
+ border: 1px solid d5f0ff
111
+ html>body
112
+ #all_view, #active_view, #inactive_view
113
+ a, span
114
+ *display: inline-block
115
+ * html
116
+ #all_view, #active_view, #inactive_view
117
+ a, span
118
+ display: inline-block
@@ -0,0 +1,5 @@
1
+ - render_region :main do |main|
2
+ - main.edit_header do
3
+ %h1= t('banner_rotator.new_banner')
4
+ - main.edit_form do
5
+ = render :partial => 'form'
@@ -0,0 +1,12 @@
1
+ %h1= t('banner_rotator.remove_banner')
2
+
3
+ %p
4
+ = t('banner_rotator.text.banners.remove_warning')
5
+
6
+ = render :partial => 'modify_banner'
7
+
8
+ - form_for [:admin, @banner], :html => {:method => :delete, 'data-onsubmit_status'=>"Removing banner&#8230;"} do
9
+ %p.buttons
10
+ %input.button{:type=>"submit", :value => t('banner_rotator.delete_banner')}/
11
+ = t('or')
12
+ = link_to t('cancel'), admin_banners_url
@@ -0,0 +1,28 @@
1
+ .banner_info
2
+ = check_box 'page', 'show_banner'
3
+ = t('banner_rotator.enable_banner_rotator')
4
+ %label
5
+ = t('banner_rotator.banners_assigned') + ":"
6
+ - unless @page.banners.blank?
7
+ - @page.banners.each do |banner|
8
+ = link_to image_tag(banner.background_image, :class=>"thumb"), edit_admin_banner_path(banner), {:title => "#{banner.name}"}
9
+ - else
10
+ = t('banner_rotator.no_banners')
11
+ %label
12
+ = t('banner_rotator.banners_inherited') + ":"
13
+ - if @page.banners_inherited?
14
+ - @page.banner_placements.each do |placement|
15
+ = link_to image_tag(placement.banner.background_image, :class=>"thumb"), edit_admin_banner_path(placement.banner), {:title => "#{placement.banner.name}"}
16
+ - else
17
+ = t('banner_rotator.no_banners')
18
+
19
+ - content_for :page_css do
20
+ :sass
21
+ .banner_info
22
+ width: 100%
23
+ padding: 0 0 6px 0
24
+ label
25
+ margin-left: 18px
26
+ .thumb
27
+ height: 24px
28
+ padding: 3px 2px
@@ -0,0 +1,11 @@
1
+ - unless simple
2
+ - assigned = page.show_banner? ? page.banner_placements.map{|p| p.banner.name}.sort.join(' * ') : t('banner_rotator.no_banners')
3
+ - assigned = "INHERITED: #{assigned}" if page.banners_inherited?
4
+ %td.status{:title => assigned, :style => "text-align:center"}
5
+ - if page.show_banner?
6
+ - if page.banners_inherited?
7
+ %span.inherited= page.banner_placements.count
8
+ - else
9
+ %span= page.banner_placements.count
10
+ - else
11
+ %span.disabled= "Disabled"
@@ -0,0 +1,9 @@
1
+ - content_for :page_css do
2
+ :sass
3
+ .inherited
4
+ font-style: italic
5
+ color: #999
6
+ .disabled
7
+ color: #ccc
8
+
9
+ %th.banners= t('banner_rotator.banners')
@@ -0,0 +1,41 @@
1
+ class BannerRotatorExtension < Radiant::Extension
2
+
3
+ version "#{File.read(File.expand_path(File.dirname(__FILE__)) + '/VERSION')}"
4
+ description "Allows addition and independent management of rotating banners on pages."
5
+ url "https://github.com/avonderluft/radiant-banner_rotator-extension"
6
+
7
+ def activate
8
+ Page.send :include, BannerRotator::PageExtensions
9
+ Page.send :include, BannerRotator::Tags
10
+ tab "Content" do
11
+ add_item "Banners", '/admin/banners', :after => "Pages"
12
+ end
13
+ admin.page.index.add :node, 'banners_column', :before => 'status_column'
14
+ admin.page.index.add :sitemap_head, 'banners_column_header', :before => 'status_column_header'
15
+ admin.pages.edit.add :form, 'banner_info', :after => 'edit_extended_metadata'
16
+
17
+ Radiant::AdminUI.class_eval do
18
+ attr_accessor :banner
19
+ alias_method "banners", :banner
20
+ end
21
+ admin.banner = load_default_banner_regions
22
+ end
23
+
24
+ def load_default_banner_regions
25
+ returning OpenStruct.new do |banner|
26
+ banner.edit = Radiant::AdminUI::RegionSet.new do |edit|
27
+ edit.main.concat %w{edit_header edit_form}
28
+ edit.form.concat %w{edit_title edit_content}
29
+ edit.form_bottom.concat %w{edit_buttons edit_timestamp}
30
+ end
31
+ banner.index = Radiant::AdminUI::RegionSet.new do |index|
32
+ index.top.concat %w{}
33
+ index.thead.concat %w{title_header pages_header actions_header}
34
+ index.tbody.concat %w{title_cell pages_cell actions_cell}
35
+ index.bottom.concat %w{new_button}
36
+ end
37
+ banner.new = banner.edit
38
+ end
39
+ end
40
+
41
+ end
@@ -0,0 +1,3 @@
1
+ Radiant.config do |config|
2
+ # config.define "setting.name", :default => 'value', :select_from => ['foo', 'bar']
3
+ end
@@ -0,0 +1,34 @@
1
+ ---
2
+ en:
3
+ banner_rotator:
4
+ add_page: "Add Page"
5
+ assigned_pages: "Assigned Pages"
6
+ background_image: "Background Image"
7
+ banner: "Banner"
8
+ banner_name: "Banner Name"
9
+ banner_rotator: "Banner Rotator"
10
+ banners: "Banners"
11
+ banners_assigned: "Banners Assigned"
12
+ banners_inherited: "Banners Inherited"
13
+ deactivate: "Deactivate"
14
+ deactivate_banner: "Deactivate Banner"
15
+ delete_banner: "Delete Banner"
16
+ edit: "Edit"
17
+ edit_banner: "Edit Banner"
18
+ enable_banner_rotator: "Enable Banner Rotator"
19
+ foreground_image: "Foreground Image"
20
+ image_style: "Image Style (CSS)"
21
+ link_url: "Link URL"
22
+ new_banner: "New Banner"
23
+ no_banners: "none"
24
+ remove_banner: "Remove Banner"
25
+ show_all: "Show all"
26
+ show_active_only: "Show Active Only"
27
+ show_inactive_only: "Show Inactive Only"
28
+ sort_by: "Sort By"
29
+ text:
30
+ banners:
31
+ deactivate_warning: 'Are you sure you want to <strong class="warning">deactivate</strong> the following banner, which will not delete it, but will remove it from all pages?'
32
+ remove_warning: 'Are you sure you want to <strong class="warning">permanently remove</strong> the following banner, which will also remove it from all pages to which it is assigned?'
33
+ target_instruction: "(use '_top' for same window, or '_blank' for new window)"
34
+ target: "Target window"
data/config/routes.rb ADDED
@@ -0,0 +1,5 @@
1
+ ActionController::Routing::Routes.draw do |map|
2
+ map.namespace :admin do |admin|
3
+ admin.resources :banners, :member => { :remove => :get, :deactivate => :any }
4
+ end
5
+ end
@@ -0,0 +1,31 @@
1
+ class CreateBanners < ActiveRecord::Migration
2
+ def self.up
3
+ create_table :banners do |t|
4
+ t.string :name
5
+ t.string :background_image
6
+ t.string :foreground_image
7
+ t.string :link_url
8
+ t.string :link_target
9
+ t.string :image_style
10
+
11
+ t.timestamps
12
+ end
13
+
14
+ create_table :banner_placements do |t|
15
+ t.integer :banner_id
16
+ t.integer :page_id
17
+ t.integer :weight, :default => 1, :nil => false
18
+
19
+ t.timestamps
20
+ end
21
+ add_index :banner_placements, [:page_id, :banner_id], :name => 'page_id_on_banner_id'
22
+
23
+ add_column :pages, :show_banner, :boolean, :default => true
24
+ end
25
+
26
+ def self.down
27
+ drop_table :banners
28
+ drop_table :banner_placements
29
+ remove_column :pages, :show_banner
30
+ end
31
+ end
@@ -0,0 +1,9 @@
1
+ class ChangeBannersDefault < ActiveRecord::Migration
2
+ def self.up
3
+ change_column_default :pages, :show_banner, false
4
+ end
5
+
6
+ def self.down
7
+ change_column_default :pages, :show_banner, true
8
+ end
9
+ end