refinerycms-calendar 1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (56) hide show
  1. data/app/controllers/admin/event_categories_controller.rb +9 -0
  2. data/app/controllers/admin/events_controller.rb +26 -0
  3. data/app/controllers/event_categories_controller.rb +10 -0
  4. data/app/controllers/events_controller.rb +64 -0
  5. data/app/helpers/event_categories_helper.rb +3 -0
  6. data/app/helpers/events_helper.rb +38 -0
  7. data/app/models/event.rb +72 -0
  8. data/app/models/event_categorization.rb +4 -0
  9. data/app/models/event_category.rb +10 -0
  10. data/app/views/admin/event_categories/_event_categories.html.erb +1 -0
  11. data/app/views/admin/event_categories/_event_category.html.erb +18 -0
  12. data/app/views/admin/event_categories/_form.html.erb +26 -0
  13. data/app/views/admin/event_categories/_sortable_list.html.erb +3 -0
  14. data/app/views/admin/event_categories/edit.html.erb +1 -0
  15. data/app/views/admin/event_categories/index.html.erb +40 -0
  16. data/app/views/admin/event_categories/new.html.erb +1 -0
  17. data/app/views/admin/events/_event.html.erb +18 -0
  18. data/app/views/admin/events/_events.html.erb +1 -0
  19. data/app/views/admin/events/_form.html.erb +126 -0
  20. data/app/views/admin/events/_sortable_list.html.erb +20 -0
  21. data/app/views/admin/events/edit.html.erb +1 -0
  22. data/app/views/admin/events/index.html.erb +41 -0
  23. data/app/views/admin/events/new.html.erb +1 -0
  24. data/app/views/event_categories/show.html.erb +15 -0
  25. data/app/views/events/_event.html.erb +103 -0
  26. data/app/views/events/_sidebar.html.erb +38 -0
  27. data/app/views/events/archive.html.erb +17 -0
  28. data/app/views/events/index.html.erb +17 -0
  29. data/app/views/events/index.rss.builder +24 -0
  30. data/app/views/events/show.html.erb +15 -0
  31. data/changelog.md +22 -0
  32. data/config/locales/en.yml +39 -0
  33. data/config/locales/lolcat.yml +24 -0
  34. data/config/locales/nb.yml +20 -0
  35. data/config/locales/nl.yml +20 -0
  36. data/config/routes.rb +11 -0
  37. data/db/migrate/01_create_events.rb +33 -0
  38. data/db/migrate/02_create_event_categories.rb +13 -0
  39. data/db/migrate/03_create_event_categorizations.rb +17 -0
  40. data/db/seeds/events.rb +17 -0
  41. data/features/manage_events.feature +64 -0
  42. data/features/step_definitions/event_steps.rb +14 -0
  43. data/features/support/factories/event_categories.rb +3 -0
  44. data/features/support/factories/events.rb +6 -0
  45. data/features/support/paths.rb +17 -0
  46. data/lib/generators/refinerycms_events_generator.rb +6 -0
  47. data/lib/refinerycms-events.rb +23 -0
  48. data/lib/tasks/events.rake +13 -0
  49. data/public/stylesheets/refinerycms-events.css +73 -0
  50. data/readme.md +49 -0
  51. data/refinerycms-calendar.gemspec +17 -0
  52. data/spec/controllers/events_controller_spec.rb +14 -0
  53. data/spec/helpers/events_helper_spec.rb +16 -0
  54. data/spec/models/event_category_spec.rb +29 -0
  55. data/spec/models/event_spec.rb +82 -0
  56. 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>&nbsp;</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>&nbsp;</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') %>
@@ -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
@@ -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