refinerycms-calendar 1.0
Sign up to get free protection for your applications and to get access to all the features.
- data/app/controllers/admin/event_categories_controller.rb +9 -0
- data/app/controllers/admin/events_controller.rb +26 -0
- data/app/controllers/event_categories_controller.rb +10 -0
- data/app/controllers/events_controller.rb +64 -0
- data/app/helpers/event_categories_helper.rb +3 -0
- data/app/helpers/events_helper.rb +38 -0
- data/app/models/event.rb +72 -0
- data/app/models/event_categorization.rb +4 -0
- data/app/models/event_category.rb +10 -0
- data/app/views/admin/event_categories/_event_categories.html.erb +1 -0
- data/app/views/admin/event_categories/_event_category.html.erb +18 -0
- data/app/views/admin/event_categories/_form.html.erb +26 -0
- data/app/views/admin/event_categories/_sortable_list.html.erb +3 -0
- data/app/views/admin/event_categories/edit.html.erb +1 -0
- data/app/views/admin/event_categories/index.html.erb +40 -0
- data/app/views/admin/event_categories/new.html.erb +1 -0
- data/app/views/admin/events/_event.html.erb +18 -0
- data/app/views/admin/events/_events.html.erb +1 -0
- data/app/views/admin/events/_form.html.erb +126 -0
- data/app/views/admin/events/_sortable_list.html.erb +20 -0
- data/app/views/admin/events/edit.html.erb +1 -0
- data/app/views/admin/events/index.html.erb +41 -0
- data/app/views/admin/events/new.html.erb +1 -0
- data/app/views/event_categories/show.html.erb +15 -0
- data/app/views/events/_event.html.erb +103 -0
- data/app/views/events/_sidebar.html.erb +38 -0
- data/app/views/events/archive.html.erb +17 -0
- data/app/views/events/index.html.erb +17 -0
- data/app/views/events/index.rss.builder +24 -0
- data/app/views/events/show.html.erb +15 -0
- data/changelog.md +22 -0
- data/config/locales/en.yml +39 -0
- data/config/locales/lolcat.yml +24 -0
- data/config/locales/nb.yml +20 -0
- data/config/locales/nl.yml +20 -0
- data/config/routes.rb +11 -0
- data/db/migrate/01_create_events.rb +33 -0
- data/db/migrate/02_create_event_categories.rb +13 -0
- data/db/migrate/03_create_event_categorizations.rb +17 -0
- data/db/seeds/events.rb +17 -0
- data/features/manage_events.feature +64 -0
- data/features/step_definitions/event_steps.rb +14 -0
- data/features/support/factories/event_categories.rb +3 -0
- data/features/support/factories/events.rb +6 -0
- data/features/support/paths.rb +17 -0
- data/lib/generators/refinerycms_events_generator.rb +6 -0
- data/lib/refinerycms-events.rb +23 -0
- data/lib/tasks/events.rake +13 -0
- data/public/stylesheets/refinerycms-events.css +73 -0
- data/readme.md +49 -0
- data/refinerycms-calendar.gemspec +17 -0
- data/spec/controllers/events_controller_spec.rb +14 -0
- data/spec/helpers/events_helper_spec.rb +16 -0
- data/spec/models/event_category_spec.rb +29 -0
- data/spec/models/event_spec.rb +82 -0
- metadata +133 -0
@@ -0,0 +1,20 @@
|
|
1
|
+
<% if @current.any? -%>
|
2
|
+
<h2>Current Events</h2>
|
3
|
+
<ul id='sortable_list'>
|
4
|
+
<%= render :partial => 'event', :collection => @current %>
|
5
|
+
</ul>
|
6
|
+
<% end -%>
|
7
|
+
|
8
|
+
<% if @upcoming.any? -%>
|
9
|
+
<h2>Upcoming Events</h2>
|
10
|
+
<ul id='sortable_list'>
|
11
|
+
<%= render :partial => 'event', :collection => @upcoming %>
|
12
|
+
</ul>
|
13
|
+
<% end -%>
|
14
|
+
|
15
|
+
<% if @archived.any? -%>
|
16
|
+
<h2>Archived Events</h2>
|
17
|
+
<ul id='sortable_list'>
|
18
|
+
<%= render :partial => 'event', :collection => @archived %>
|
19
|
+
</ul>
|
20
|
+
<% end -%>
|
@@ -0,0 +1 @@
|
|
1
|
+
<%= render :partial => "form" %>
|
@@ -0,0 +1,41 @@
|
|
1
|
+
<div id='records'>
|
2
|
+
<% if searching? %>
|
3
|
+
<h2><%= t('results_for', :scope => 'shared.admin.search', :query => params[:search]) %></h2>
|
4
|
+
<% end %>
|
5
|
+
<% if @events.any? %>
|
6
|
+
<div class='pagination_container'>
|
7
|
+
<%= render :partial => 'events' %>
|
8
|
+
</div>
|
9
|
+
<% else %>
|
10
|
+
<p>
|
11
|
+
<% unless searching? %>
|
12
|
+
<strong>
|
13
|
+
<%= t('.no_items_yet') %>
|
14
|
+
</strong>
|
15
|
+
<% else %>
|
16
|
+
<%= t('no_results', :scope => 'shared.admin.search') %>
|
17
|
+
<% end %>
|
18
|
+
</p>
|
19
|
+
<% end %>
|
20
|
+
</div>
|
21
|
+
<div id='actions'>
|
22
|
+
<ul>
|
23
|
+
<% if Admin::EventsController.searchable? %>
|
24
|
+
<li>
|
25
|
+
<%= render :partial => "/shared/admin/search",
|
26
|
+
:locals => {
|
27
|
+
:url => admin_events_url
|
28
|
+
} %>
|
29
|
+
</li>
|
30
|
+
<% end %>
|
31
|
+
<li>
|
32
|
+
<%= link_to t('.create_new'), new_admin_event_url,
|
33
|
+
:class => "add_icon" %>
|
34
|
+
</li>
|
35
|
+
|
36
|
+
<li>
|
37
|
+
<%= link_to "Manage Categories", admin_event_categories_url,
|
38
|
+
:class => "edit_icon" %>
|
39
|
+
</li>
|
40
|
+
</ul>
|
41
|
+
</div>
|
@@ -0,0 +1 @@
|
|
1
|
+
<%= render :partial => "form" %>
|
@@ -0,0 +1,15 @@
|
|
1
|
+
<% content_for :body_content_title do -%>
|
2
|
+
<%= "#{@event_category.name} Category" %>
|
3
|
+
<% end -%>
|
4
|
+
|
5
|
+
<% content_for :body_content_left do %>
|
6
|
+
<div id="events">
|
7
|
+
<%= render :partial => 'events/event', :collection => @event_category.events, :locals => { :category => true } %>
|
8
|
+
</div><!-- #events -->
|
9
|
+
<% end %>
|
10
|
+
|
11
|
+
<%= render 'events/sidebar' %>
|
12
|
+
|
13
|
+
<%= render :partial => "/shared/content_page" %>
|
14
|
+
|
15
|
+
<% content_for :stylesheets, stylesheet_link_tag('refinerycms-events') %>
|
@@ -0,0 +1,103 @@
|
|
1
|
+
<%
|
2
|
+
featured ||= false
|
3
|
+
individual ||= false
|
4
|
+
archive ||= false
|
5
|
+
category ||= false
|
6
|
+
-%>
|
7
|
+
|
8
|
+
<%= div_for event, :class => 'individual_event' do -%>
|
9
|
+
|
10
|
+
<section class="event_image">
|
11
|
+
<%= image_fu event.image, "150x150#c" %>
|
12
|
+
</section>
|
13
|
+
|
14
|
+
<% unless individual -%>
|
15
|
+
<h1><%= link_to event.title, event %></h1>
|
16
|
+
<% end -%>
|
17
|
+
|
18
|
+
<section class="start_end">
|
19
|
+
<p>Starts:<br/>
|
20
|
+
<%= event.start_at.strftime('%b %e, %Y %l:%M %p') %></p>
|
21
|
+
<p>Ends:<br/>
|
22
|
+
<%= event.end_at.strftime('%b %e, %Y %l:%M %p') %></p>
|
23
|
+
</section><!-- .start_end -->
|
24
|
+
|
25
|
+
<section class="venue">
|
26
|
+
<p>Location:<br/>
|
27
|
+
<%= event.venue_name %></p>
|
28
|
+
</section>
|
29
|
+
|
30
|
+
<section class="address">
|
31
|
+
<p>Address:<br/>
|
32
|
+
<%= event.venue_address %>
|
33
|
+
</p>
|
34
|
+
</section>
|
35
|
+
|
36
|
+
<% unless archive -%>
|
37
|
+
<% unless event.ticket_price.blank? -%>
|
38
|
+
<section class="price">
|
39
|
+
<p>Ticket Price:<br/>
|
40
|
+
<%=number_to_currency event.ticket_price %>
|
41
|
+
</p>
|
42
|
+
</section>
|
43
|
+
<% end -%>
|
44
|
+
<% unless event.ticket_link.blank? -%>
|
45
|
+
<section class="ticket">
|
46
|
+
<p>Ticket Link:<br/>
|
47
|
+
<%=auto_link event.ticket_link %>
|
48
|
+
</p>
|
49
|
+
</section>
|
50
|
+
<% end -%>
|
51
|
+
<% end -%>
|
52
|
+
|
53
|
+
<section>
|
54
|
+
<% if individual -%>
|
55
|
+
<%=raw event.description %>
|
56
|
+
<% else -%>
|
57
|
+
<%= simple_format(truncate strip_tags(event.description), :length => 200) %>
|
58
|
+
<% end -%>
|
59
|
+
</section>
|
60
|
+
|
61
|
+
|
62
|
+
|
63
|
+
<% if individual -%>
|
64
|
+
<section id="share_this_event">
|
65
|
+
<ul>
|
66
|
+
<li class="facebook"><script src="http://connect.facebook.net/en_US/all.js#xfbml=1"></script><fb:like href="<%= request.url %>" layout="box_count" show_faces="false" width="55" font=""></fb:like></li>
|
67
|
+
<li class="twitter"><a href="http://twitter.com/share" class="twitter-share-button" data-count="vertical">Tweet</a><script type="text/javascript" src="http://platform.twitter.com/widgets.js"></script></li>
|
68
|
+
</ul>
|
69
|
+
</section>
|
70
|
+
|
71
|
+
<nav id="prevnext_nav">
|
72
|
+
<% if event.prev.present? -%>
|
73
|
+
<%= link_to event_path(event.prev), :class => "prev button" do -%>
|
74
|
+
<h3>Previous</h3>
|
75
|
+
<h4><%=truncate event.prev.title, :length => 38 %></h4>
|
76
|
+
<% end -%>
|
77
|
+
<% else -%>
|
78
|
+
<span class="prev disabled">
|
79
|
+
<h3>Previous</h3>
|
80
|
+
<h4> </h4>
|
81
|
+
</span>
|
82
|
+
<% end -%>
|
83
|
+
|
84
|
+
<%= link_to events_path, :class => "home button" do -%>
|
85
|
+
<h3>Events</h3>
|
86
|
+
<h4>Home</h4>
|
87
|
+
<% end -%>
|
88
|
+
|
89
|
+
<% if event.next.present? -%>
|
90
|
+
<%= link_to event_path(event.next), :class => "next button" do -%>
|
91
|
+
<h3>Next</h3>
|
92
|
+
<h4><%=truncate event.next.title, :length => 38 %></h4>
|
93
|
+
<% end -%>
|
94
|
+
<% else -%>
|
95
|
+
<span class="next disabled">
|
96
|
+
<h3>Next</h3>
|
97
|
+
<h4> </h4>
|
98
|
+
</span>
|
99
|
+
<% end -%>
|
100
|
+
</nav><!--#event_nav-->
|
101
|
+
<% end -%>
|
102
|
+
|
103
|
+
<% end -%>
|
@@ -0,0 +1,38 @@
|
|
1
|
+
<% content_for :meta, "
|
2
|
+
<link
|
3
|
+
rel='alternate'
|
4
|
+
type='application/rss+xml'
|
5
|
+
title='#{RefinerySetting.find_or_set(:site_name, 'Company Name')} Events'
|
6
|
+
href='#{events_url(:format => :rss)}' />".html_safe -%>
|
7
|
+
<% content_for :body_content_right do %>
|
8
|
+
<aside class="sidebar_module rss">
|
9
|
+
<h2>RSS</h2>
|
10
|
+
<%= link_to "Subscribe", events_path(:format => :rss) %>
|
11
|
+
</aside><!-- .rss -->
|
12
|
+
|
13
|
+
<aside class="sidebar_module categories">
|
14
|
+
<h2>Categories</h2>
|
15
|
+
<% @event_categories.each do |category| -%>
|
16
|
+
<%= link_to category.name, category_events_path(category) %>
|
17
|
+
<% end -%>
|
18
|
+
</aside><!-- .categories -->
|
19
|
+
|
20
|
+
<% unless controller.action_name == "index" or controller.action_name == "archive" -%>
|
21
|
+
<aside class="sidebar_module other_events">
|
22
|
+
<h2><%= t('.other') %></h2>
|
23
|
+
<ul id="events">
|
24
|
+
<% @other_events.each do |event| %>
|
25
|
+
<li>
|
26
|
+
<%= link_to event.title, event_url(event) %>
|
27
|
+
</li>
|
28
|
+
<% end %>
|
29
|
+
</ul>
|
30
|
+
</aside><!-- .other_events -->
|
31
|
+
<% end -%>
|
32
|
+
|
33
|
+
<aside class="sidebar_module archives">
|
34
|
+
<h2>Archives</h2>
|
35
|
+
<%= events_archive_list %>
|
36
|
+
</aside><!-- .archives -->
|
37
|
+
|
38
|
+
<% end %>
|
@@ -0,0 +1,17 @@
|
|
1
|
+
<% content_for :body_content_title do -%>
|
2
|
+
<% date_format = params[:month].present? ? '%B %Y' : '%Y' -%>
|
3
|
+
<%= "Events posted in #{@archive_date.strftime(date_format)}" %>
|
4
|
+
<% end -%>
|
5
|
+
|
6
|
+
<% content_for :body_content_left do %>
|
7
|
+
<div id="events">
|
8
|
+
<%= render :partial => 'event', :collection => @events, :locals => { :archive => true } %>
|
9
|
+
</div>
|
10
|
+
<%= will_paginate @events %>
|
11
|
+
<% end %>
|
12
|
+
|
13
|
+
<%= render 'events/sidebar' %>
|
14
|
+
|
15
|
+
<%= render :partial => "/shared/content_page" %>
|
16
|
+
|
17
|
+
<% content_for :stylesheets, stylesheet_link_tag('refinerycms-events') %>
|
@@ -0,0 +1,17 @@
|
|
1
|
+
<% content_for :body_content_left do %>
|
2
|
+
<div id="featured_events" class="events">
|
3
|
+
<h2>Featured Events</h2>
|
4
|
+
<%= render :partial => 'event', :collection => @featured_events, :locals => { :featured => true } %>
|
5
|
+
</div>
|
6
|
+
|
7
|
+
<div id="all_events" class="events">
|
8
|
+
<h2>All Events</h2>
|
9
|
+
<%= render :partial => 'event', :collection => @events %>
|
10
|
+
</div>
|
11
|
+
<% end %>
|
12
|
+
|
13
|
+
<%= render 'events/sidebar' %>
|
14
|
+
|
15
|
+
<%= render :partial => "/shared/content_page" %>
|
16
|
+
|
17
|
+
<% content_for :stylesheets, stylesheet_link_tag('refinerycms-events') %>
|
@@ -0,0 +1,24 @@
|
|
1
|
+
xml.instruct! :xml, :version => "1.0"
|
2
|
+
xml.rss :version => "2.0" do
|
3
|
+
xml.channel do
|
4
|
+
xml.title RefinerySetting.find_or_set(:site_name, "Pastoral Artisan Cheese, Bread & Wine")
|
5
|
+
xml.description RefinerySetting.find_or_set(:site_name, "Pastoral Artisan Cheese, Bread & Wine") + " Events"
|
6
|
+
xml.link events_url
|
7
|
+
|
8
|
+
(@featured_events | @events).each do |event|
|
9
|
+
xml.item do
|
10
|
+
xml.title "Featured: #{event.title}"
|
11
|
+
xml.description simple_format(strip_tags event.description)
|
12
|
+
|
13
|
+
xml.start_at event.start_at.to_s(:rfc822)
|
14
|
+
xml.end_at event.end_at.to_s(:rfc822)
|
15
|
+
|
16
|
+
xml.ticket_price number_to_currency(event.ticket_price) unless event.ticket_price.blank?
|
17
|
+
xml.ticket_link event.ticket_link unless event.ticket_link.blank?
|
18
|
+
|
19
|
+
xml.link event_url(event)
|
20
|
+
xml.pubDate event.created_at.to_s(:rfc822)
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
<% content_for :body_content_title do %>
|
2
|
+
<%= @event.title %>
|
3
|
+
<% end %>
|
4
|
+
|
5
|
+
<% content_for :body_content_left do %>
|
6
|
+
<div id="event">
|
7
|
+
<%= render :partial => 'event', :locals => { :event => @event, :individual => true } %>
|
8
|
+
</div>
|
9
|
+
<% end %>
|
10
|
+
|
11
|
+
<%= render 'events/sidebar' %>
|
12
|
+
|
13
|
+
<%= render :partial => "/shared/content_page" %>
|
14
|
+
|
15
|
+
<% content_for :stylesheets, stylesheet_link_tag('refinerycms-events') %>
|
data/changelog.md
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
|
2
|
+
## 1.0 [13 March 2011]
|
3
|
+
|
4
|
+
* Venue Details
|
5
|
+
* Ticket Pricing & Link
|
6
|
+
* Feature-ability
|
7
|
+
* Image attachment
|
8
|
+
* Ticket price requires a number
|
9
|
+
* Datetime select defaults noon to 1pm
|
10
|
+
* Scopes: featured, not_featured, upcoming & current
|
11
|
+
* Friendly ID based on titles
|
12
|
+
* Archiving
|
13
|
+
* Admin screen separates events by their status (TODO: pagination somehow)
|
14
|
+
* Reasonable validations
|
15
|
+
* Practical instance methods to check against scopes
|
16
|
+
* Next & previous navigation on individual event pages.
|
17
|
+
* has_many :categories, :through => :categorizations, :source => :event_category
|
18
|
+
* RSS feed of current, upcoming & featured events
|
19
|
+
* RSS in sidebar && autodiscovery
|
20
|
+
* Basic layout and styling to get started immediately [blake0102](http://github.com/blake0102)
|
21
|
+
* Easily hook onto a few semantic CSS classes built into the markup [blake0102](http://github.com/blake0102)
|
22
|
+
* Basic Facebook & Twitter sharing interface
|
@@ -0,0 +1,39 @@
|
|
1
|
+
en:
|
2
|
+
shared:
|
3
|
+
admin:
|
4
|
+
image_picker:
|
5
|
+
image: image
|
6
|
+
plugins:
|
7
|
+
events:
|
8
|
+
title: Events
|
9
|
+
admin:
|
10
|
+
events:
|
11
|
+
index:
|
12
|
+
title: Events
|
13
|
+
create_new: Add New Event
|
14
|
+
reorder: Reorder Events
|
15
|
+
reorder_done: Done Reordering Events
|
16
|
+
sorry_no_results: Sorry! There are no results found.
|
17
|
+
no_items_yet: There are no Events yet. Click "Add New Event" to add your first event.
|
18
|
+
event:
|
19
|
+
view_live_html: View this event live <br/><em>(opens in a new window)</em>
|
20
|
+
edit: Edit this event
|
21
|
+
delete: Remove this event forever
|
22
|
+
event_categories:
|
23
|
+
index:
|
24
|
+
title: Event Categories
|
25
|
+
create_new: Add New Event Category
|
26
|
+
reorder: Reorder Event Categories
|
27
|
+
reorder_done: Done Reordering Event Categories
|
28
|
+
sorry_no_results: Sorry! There are no results found.
|
29
|
+
no_items_yet: There are no Event Categories yet. Click "Add New Event Category" to add your first event category.
|
30
|
+
event_category:
|
31
|
+
view_live_html: View this event category live <br/><em>(opens in a new window)</em>
|
32
|
+
edit: Edit this event category
|
33
|
+
delete: Remove this event category forever
|
34
|
+
events:
|
35
|
+
index:
|
36
|
+
archives: Archives
|
37
|
+
show:
|
38
|
+
sidebar:
|
39
|
+
other: Other Events
|
@@ -0,0 +1,24 @@
|
|
1
|
+
lolcat:
|
2
|
+
shared:
|
3
|
+
admin:
|
4
|
+
image_picker:
|
5
|
+
image: IMAGE
|
6
|
+
plugins:
|
7
|
+
events:
|
8
|
+
title: Events
|
9
|
+
admin:
|
10
|
+
events:
|
11
|
+
index:
|
12
|
+
title: Events
|
13
|
+
create_new: CREATE NEW Event
|
14
|
+
reorder: REORDR Events
|
15
|
+
reorder_done: DUN REORDERIN Events
|
16
|
+
sorry_no_results: SRY! THAR R NO RESULTS FINDZ.
|
17
|
+
no_items_yet: THAR R NO Events YET. CLICK "CREATE NEW Event" 2 ADD UR FURST event.
|
18
|
+
event:
|
19
|
+
view_live_html: VIEW DIS event LIV <BR/><EM>(OPENS IN NEW WINDOW)</EM>
|
20
|
+
edit: EDIT DIS event
|
21
|
+
delete: REMOOV DIS event FOREVR
|
22
|
+
events:
|
23
|
+
show:
|
24
|
+
other: OTHR Events
|
@@ -0,0 +1,20 @@
|
|
1
|
+
nb:
|
2
|
+
plugins:
|
3
|
+
events:
|
4
|
+
title: Events
|
5
|
+
admin:
|
6
|
+
events:
|
7
|
+
index:
|
8
|
+
title: Events
|
9
|
+
create_new: Lag en ny Event
|
10
|
+
reorder: Endre rekkefølgen på Events
|
11
|
+
reorder_done: Ferdig å endre rekkefølgen Events
|
12
|
+
sorry_no_results: Beklager! Vi fant ikke noen resultater.
|
13
|
+
no_items_yet: Det er ingen Events enda. Klikk på "Lag en ny Event" for å legge til din første event.
|
14
|
+
event:
|
15
|
+
view_live_html: Vis hvordan denne event ser ut offentlig <br/><em>(åpner i et nytt vindu)</em>
|
16
|
+
edit: Rediger denne event
|
17
|
+
delete: Fjern denne event permanent
|
18
|
+
events:
|
19
|
+
show:
|
20
|
+
other: Andre Events
|
@@ -0,0 +1,20 @@
|
|
1
|
+
nl:
|
2
|
+
plugins:
|
3
|
+
events:
|
4
|
+
title: Events
|
5
|
+
admin:
|
6
|
+
events:
|
7
|
+
index:
|
8
|
+
title: Events
|
9
|
+
create_new: Maak een nieuwe Event
|
10
|
+
reorder: Wijzig de volgorde van de Events
|
11
|
+
reorder_done: Klaar met het wijzingen van de volgorde van de Events
|
12
|
+
sorry_no_results: Helaas! Er zijn geen resultaten gevonden.
|
13
|
+
no_items_yet: Er zijn nog geen Events. Druk op 'Maak een nieuwe Event' om de eerste aan te maken.
|
14
|
+
event:
|
15
|
+
view_live_html: Bekijk deze event op de website <br/><em>(opent een nieuw venster)</em>
|
16
|
+
edit: Bewerk deze event
|
17
|
+
delete: Verwijder deze event voor eeuwig
|
18
|
+
events:
|
19
|
+
show:
|
20
|
+
other: Andere Events
|
data/config/routes.rb
ADDED
@@ -0,0 +1,11 @@
|
|
1
|
+
Refinery::Application.routes.draw do
|
2
|
+
resources :events do
|
3
|
+
get 'archive/:year(/:month)' => 'events#archive', :as => 'archive', :on => :collection
|
4
|
+
get 'category/:id' => 'event_categories#show', :as => 'category', :on => :collection
|
5
|
+
end
|
6
|
+
|
7
|
+
scope(:path => 'refinery', :as => 'admin', :module => 'admin') do
|
8
|
+
resources :events, :except => :show
|
9
|
+
resources :event_categories, :except => :show
|
10
|
+
end
|
11
|
+
end
|