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.
- data/.gitmodules +3 -0
- data/HELP.textile +87 -0
- data/README.textile +68 -0
- data/Rakefile +136 -0
- data/VERSION +1 -0
- data/app/controllers/admin/banners_controller.rb +61 -0
- data/app/helpers/admin/banners_helper.rb +62 -0
- data/app/models/banner.rb +101 -0
- data/app/models/banner_placement.rb +7 -0
- data/app/views/admin/banners/_form.html.haml +76 -0
- data/app/views/admin/banners/_modify_banner.html.haml +8 -0
- data/app/views/admin/banners/deactivate.html.haml +10 -0
- data/app/views/admin/banners/edit.html.haml +8 -0
- data/app/views/admin/banners/index.html.haml +118 -0
- data/app/views/admin/banners/new.html.haml +5 -0
- data/app/views/admin/banners/remove.html.haml +12 -0
- data/app/views/admin/pages/_banner_info.html.haml +28 -0
- data/app/views/admin/pages/_banners_column.html.haml +11 -0
- data/app/views/admin/pages/_banners_column_header.html.haml +9 -0
- data/banner_rotator_extension.rb +41 -0
- data/config/initializers/radiant_config.rb +3 -0
- data/config/locales/en.yml +34 -0
- data/config/routes.rb +5 -0
- data/db/migrate/001_create_banners.rb +31 -0
- data/db/migrate/002_change_banners_default.rb +9 -0
- data/db/migrate/003_add_description.rb +9 -0
- data/lib/banner_rotator/page_extensions.rb +47 -0
- data/lib/banner_rotator/tags.rb +67 -0
- data/lib/tasks/banner_rotator_extension_tasks.rake +29 -0
- data/public/images/admin/deactivate.png +0 -0
- data/public/images/admin/pictures.png +0 -0
- data/public/images/admin/text_list_numbers.png +0 -0
- data/public/javascripts/lowpro.js +320 -0
- data/spec/controllers/admin_banners_controller_spec.rb +231 -0
- data/spec/datasets/banners_dataset.rb +26 -0
- data/spec/helpers/admin/banners_helper_spec.rb +9 -0
- data/spec/models/banner_placement_spec.rb +44 -0
- data/spec/models/banner_spec.rb +47 -0
- data/spec/models/page_extensions_spec.rb +25 -0
- data/spec/models/tags_spec.rb +69 -0
- data/spec/spec.opts +6 -0
- data/spec/spec_helper.rb +36 -0
- metadata +124 -0
@@ -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…"} 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
|
+
|
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,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…"} 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,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,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,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
|