social_stream-events 0.2.0 → 0.3.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (58) hide show
  1. data/app/assets/javascripts/0_init.js +4 -0
  2. data/app/assets/javascripts/events.js.coffee +66 -0
  3. data/app/assets/stylesheets/events.css.scss +37 -0
  4. data/app/controllers/events_controller.rb +40 -0
  5. data/app/controllers/rooms_controller.rb +7 -0
  6. data/app/models/event.rb +53 -0
  7. data/app/models/room.rb +8 -0
  8. data/app/views/events/_event.html.erb +1 -0
  9. data/app/views/events/_new.html.erb +40 -0
  10. data/app/views/events/_sidebar_calendar.html.erb +26 -0
  11. data/app/views/events/create.js.erb +21 -0
  12. data/app/views/events/destroy.js.erb +1 -0
  13. data/app/views/events/index.html.erb +96 -0
  14. data/app/views/rooms/_form.html.erb +31 -0
  15. data/app/views/rooms/_index.html.erb +10 -0
  16. data/app/views/rooms/_settings.html.erb +23 -0
  17. data/app/views/rooms/create.js.erb +7 -0
  18. data/app/views/rooms/destroy.js.erb +1 -0
  19. data/config/locales/en.yml +34 -4
  20. data/config/locales/es.yml +34 -4
  21. data/config/routes.rb +1 -0
  22. data/db/migrate/20111101193523_create_events.rb +13 -0
  23. data/db/migrate/20111120104349_create_rooms.rb +26 -0
  24. data/db/migrate/20111204155637_add_scheduler.rb +33 -0
  25. data/db/migrate/20111218203314_change_scheduler.rb +11 -0
  26. data/lib/social_stream-events.rb +15 -0
  27. data/lib/social_stream/events/ability.rb +13 -0
  28. data/lib/social_stream/events/engine.rb +17 -0
  29. data/lib/social_stream/events/models/actor.rb +13 -0
  30. data/lib/social_stream/events/version.rb +1 -1
  31. data/lib/social_stream/views/settings/events.rb +18 -0
  32. data/social_stream-events.gemspec +6 -10
  33. data/vendor/assets/images/boxy-ne.png +0 -0
  34. data/vendor/assets/images/boxy-nw.png +0 -0
  35. data/vendor/assets/images/boxy-se.png +0 -0
  36. data/vendor/assets/images/boxy-sw.png +0 -0
  37. data/vendor/assets/javascripts/fullcalendar.js +12 -10
  38. data/vendor/assets/javascripts/gcal.js +2 -2
  39. data/vendor/assets/javascripts/jquery.boxy.js +570 -0
  40. data/vendor/assets/javascripts/sprintf.js +183 -0
  41. data/vendor/assets/stylesheets/boxy.css +49 -0
  42. data/vendor/assets/stylesheets/fullcalendar.css +7 -10
  43. data/vendor/assets/stylesheets/fullcalendar.print.css +4 -4
  44. metadata +81 -175
  45. data/db/migrate/20110910161707_create_social_stream_events.rb +0 -54
  46. data/db/migrate/20111102145626_add_more_fields_to_events.rb +0 -20
  47. data/db/migrate/20111104165944_add_more_fields_to_sessions.rb +0 -13
  48. data/db/migrate/20111104182420_add_details_to_events.rb +0 -18
  49. data/db/migrate/20111209120019_reset_events.rb +0 -18
  50. data/vendor/assets/javascripts/jquery.ad-gallery.js +0 -850
  51. data/vendor/assets/javascripts/jquery.ad-gallery.pack.js +0 -10
  52. data/vendor/assets/stylesheets/ad_next.png +0 -0
  53. data/vendor/assets/stylesheets/ad_prev.png +0 -0
  54. data/vendor/assets/stylesheets/ad_scroll_back.png +0 -0
  55. data/vendor/assets/stylesheets/ad_scroll_forward.png +0 -0
  56. data/vendor/assets/stylesheets/jquery.ad-gallery.css +0 -171
  57. data/vendor/assets/stylesheets/loader.gif +0 -0
  58. data/vendor/assets/stylesheets/social_stream-events.css +0 -273
@@ -0,0 +1,4 @@
1
+ var SocialStream = SocialStream || {};
2
+ SocialStream.Events = SocialStream.Events || {};
3
+ SocialStream.Events.current = SocialStream.Events.current || {};
4
+
@@ -0,0 +1,66 @@
1
+ # Place all the behaviors and hooks related to the matching controller here.
2
+ # All this logic will automatically be available in application.js.
3
+ # You can use CoffeeScript in this file: http://jashkenas.github.com/coffee-script/
4
+ #
5
+ #= require fullcalendar
6
+ #= require jquery.boxy
7
+ #= require sprintf
8
+ #= require scheduler
9
+
10
+ SocialStream.Events.create = (start, end, allDay) ->
11
+ title = prompt('Event Title:');
12
+ if title
13
+ $.post(SocialStream.Events.current.eventsPath,
14
+ {
15
+ event: {
16
+ title: title,
17
+ start_at: start.toString(),
18
+ end_at: end.toString(),
19
+ all_day: allDay,
20
+ _contact_id: SocialStream.Events.current.contactId
21
+ }
22
+ },
23
+ undefined,
24
+ "script");
25
+
26
+ SocialStream.Events.tools = {}
27
+
28
+ SocialStream.Events.tools.currentRGB = () ->
29
+ [ parseInt(SocialStream.Events.current.eventColor[1..2], 16),
30
+ parseInt(SocialStream.Events.current.eventColor[3..4], 16),
31
+ parseInt(SocialStream.Events.current.eventColor[5..6], 16) ]
32
+
33
+ SocialStream.Events.tools.colorRange = () ->
34
+ min = 0
35
+
36
+ for color in SocialStream.Events.tools.currentRGB()
37
+ if color < min
38
+ min = color
39
+
40
+ parseInt 2 * (255 - min) / 3
41
+
42
+ SocialStream.Events.tools.increaseColor = (delta) ->
43
+ (if (color + delta) > 255 then 255 else (color + delta)) for color in SocialStream.Events.tools.currentRGB()
44
+
45
+
46
+ SocialStream.Events.tools.eventColorScale = (index) ->
47
+ range = SocialStream.Events.tools.colorRange()
48
+
49
+ delta = range * (index + 1) / (SocialStream.Events.current.roomIndex.length + 1)
50
+
51
+ delta = parseInt(delta)
52
+
53
+ newColor = SocialStream.Events.tools.increaseColor(delta)
54
+
55
+ sprintf "#%02x%02x%02x", newColor[0], newColor[1], newColor[2]
56
+
57
+
58
+ SocialStream.Events.tools.eventColor = (roomId) ->
59
+ currentColor = SocialStream.Events.current.eventColor
60
+
61
+ if not roomId? or not SocialStream.Events.current.roomIndex? or SocialStream.Events.current.roomIndex.length == 0
62
+ return currentColor
63
+
64
+ currentRoomIndex = SocialStream.Events.current.roomIndex.indexOf(roomId)
65
+
66
+ SocialStream.Events.tools.eventColorScale(currentRoomIndex)
@@ -0,0 +1,37 @@
1
+ // Place all the styles related to the events controller here.
2
+ // They will automatically be included in application.css.
3
+ // You can use Sass (SCSS) here: http://sass-lang.com/
4
+ //
5
+ //= require fullcalendar
6
+ //= require boxy
7
+
8
+ #calendar {
9
+ margin-top: 20px;
10
+ }
11
+
12
+ #sidebar_calendar_date {
13
+ margin-left: 5px;
14
+ }
15
+
16
+ #sidebar_calendar {
17
+ width: 100%;
18
+ text-align: center;
19
+ padding-top: 5px;
20
+ }
21
+
22
+ #sidebar_calendar a {
23
+ color: black;
24
+ }
25
+
26
+ #sidebar_calendar td {
27
+ height: 25px;
28
+ border: 1px solid #CCCCCC;
29
+ }
30
+
31
+ #new_event div.form_row {
32
+ padding: 3px 0;
33
+ }
34
+
35
+ #scheduler-options {
36
+ padding: 2px 10px;
37
+ }
@@ -0,0 +1,40 @@
1
+ class EventsController < ApplicationController
2
+ include SocialStream::Controllers::Objects
3
+
4
+ belongs_to_subjects :optional => true
5
+
6
+ before_filter :profile_subject!, :only => :index
7
+
8
+ def index
9
+ index! do |format|
10
+ format.json {
11
+ start_time = Time.at(params[:start].to_i)
12
+ end_time = Time.at(params[:end].to_i)
13
+ @activities =
14
+ collection.
15
+ joins(:activity_objects => :event).
16
+ merge(Event.between(start_time, end_time))
17
+
18
+ render :json =>
19
+ @activities.
20
+ map(&:direct_object).
21
+ map{ |e| e.to_json(:start => start_time, :end => end_time) }.flatten.to_json
22
+ }
23
+ end
24
+ end
25
+
26
+ def show
27
+ show! do |format|
28
+ format.html { redirect_to polymorphic_path([ @event.post_activity.receiver_subject, Event.new ], :at => @event.start_at.to_i) }
29
+ end
30
+ end
31
+
32
+ private
33
+
34
+ def collection
35
+ @activities =
36
+ profile_subject.wall(:profile,
37
+ :for => current_subject,
38
+ :object_type => :Event)
39
+ end
40
+ end
@@ -0,0 +1,7 @@
1
+ class RoomsController < InheritedResources::Base
2
+ actions :create, :destroy
3
+
4
+ respond_to :js
5
+
6
+ load_and_authorize_resource
7
+ end
@@ -0,0 +1,53 @@
1
+ class Event < ActiveRecord::Base
2
+ include SocialStream::Models::Object
3
+
4
+ scheduler
5
+
6
+ belongs_to :room
7
+
8
+ validates_presence_of :title
9
+
10
+ validate :room_belongs_to_receiver
11
+
12
+ def to_json(options = {})
13
+ if recurrence
14
+ st = options[:start].try(:to_date)
15
+ en = (options[:end] || end_at.end_of_month + 7.days).to_date
16
+
17
+ recurrence.events(:starts => st, :until => en).map do |d|
18
+
19
+ start_diff = d - start_at.to_date
20
+ end_diff = d - end_at.to_date
21
+
22
+ build_json start_at.advance(:days => start_diff),
23
+ end_at.advance(:days => end_diff)
24
+ end
25
+ else
26
+ build_json
27
+ end
28
+ end
29
+
30
+ protected
31
+
32
+ def build_json(start_time = start_at, end_time = end_at)
33
+ {
34
+ :id => id,
35
+ :title => title,
36
+ :start => start_time,
37
+ :end => end_time,
38
+ :allDay => all_day?,
39
+ :roomId => room_id
40
+ }
41
+
42
+ end
43
+
44
+ private
45
+
46
+ def room_belongs_to_receiver
47
+ return if room_id.blank?
48
+
49
+ unless _contact.receiver.room_ids.include?(room_id)
50
+ errors.add(:room_id, :invalid)
51
+ end
52
+ end
53
+ end
@@ -0,0 +1,8 @@
1
+ class Room < ActiveRecord::Base
2
+ belongs_to :actor
3
+
4
+ has_many :events
5
+
6
+ validates_presence_of :actor_id, :name
7
+ validates_uniqueness_of :name, :scope => :actor_id
8
+ end
@@ -0,0 +1 @@
1
+ <%= raw t('event.wall_post', :title => link_to(h(event.title), event)) %>
@@ -0,0 +1,40 @@
1
+ <%= form_for @event || Event.new(:owner_id => profile_subject.actor_id, :interval => 1), :remote => true do |f| %>
2
+ <%= f.hidden_field :owner_id %>
3
+ <%= f.hidden_field :start_at %>
4
+ <%= f.hidden_field :end_at %>
5
+ <%= f.hidden_field :all_day %>
6
+
7
+ <% if f.object.errors.any? %>
8
+ <div id="error_explanation">
9
+ <h2><%= pluralize(f.object.errors.count, "error") %> evitaron que se guardara esta actividad:</h2>
10
+
11
+ <ul>
12
+ <% f.object.errors.full_messages.each do |msg| %>
13
+ <li><%= msg %></li>
14
+ <% end %>
15
+ </ul>
16
+ </div>
17
+ <% end %>
18
+
19
+ <div class="form_row">
20
+ <%= f.label :title %>
21
+ <%= f.text_field :title %>
22
+ </div>
23
+
24
+ <% if profile_subject.rooms.any? %>
25
+ <div class="form_row">
26
+ <%= f.label :room %>
27
+ <%= f.select :room_id, profile_subject.rooms.map{ |r| [r.name, r.id] }, { :include_blank => true } %>
28
+ </div>
29
+ <% end %>
30
+
31
+ <div class="form_row">
32
+ <%= render :partial => 'scheduler/form',
33
+ :locals => { :f => f }
34
+ %>
35
+ </div>
36
+
37
+ <div class="form_row space_center">
38
+ <%= f.submit %>
39
+ </div>
40
+ <% end %>
@@ -0,0 +1,26 @@
1
+ <div class="space_center"></div>
2
+
3
+ <div class="block">
4
+ <div class="header">
5
+ <div class="header_text"><%= t 'event.title' %></div>
6
+ </div>
7
+
8
+ <div class="content">
9
+ <span id="sidebar_calendar_date"><%= l Date.today, :format => :long %></span>
10
+
11
+ <table id="sidebar_calendar">
12
+ <% bow = Time.now.beginning_of_week %>
13
+
14
+ <% 28.times do |i| %>
15
+ <% day = bow + i.days %>
16
+
17
+ <%= raw cycle("<tr>", *6.times.map{""}, :name => "tr_start") %>
18
+ <td<%= " class=\"fc-state-highlight\"".html_safe if day.today? %>>
19
+ <%= link_to day.day, polymorphic_path([subject, Event.new], :at => day.to_i) %>
20
+ </td>
21
+
22
+ <%= raw cycle(*6.times.map{""}, '</tr>', :name => "tr_end") %>
23
+ <% end %>
24
+ </table>
25
+ </div>
26
+ </div>
@@ -0,0 +1,21 @@
1
+ <% if @event.valid? %>
2
+ SocialStream.Events.current.newForm.unload();
3
+
4
+ var cal = SocialStream.Events.current.calendar;
5
+
6
+ jQuery.each(<%= raw Array.wrap(@event.to_json).to_json %>,
7
+ function(index, ev) {
8
+ ev.color = SocialStream.Events.tools.eventColor(<%= @event.room_id %>);
9
+
10
+ cal.fullCalendar('renderEvent', ev,
11
+ true // make the event "stick"
12
+ );
13
+ });
14
+
15
+ cal.fullCalendar('unselect');
16
+
17
+ <% else %>
18
+ SocialStream.Events.current.newForm.setContent("<%= escape_javascript render(:partial => 'new') %>");
19
+
20
+ Scheduler.form.init(SocialStream.Events.current.newForm.getContent().find('.scheduler_form'));
21
+ <% end %>
@@ -0,0 +1 @@
1
+ <%= render(:partial => 'objects/destroy') %>
@@ -0,0 +1,96 @@
1
+ <% content_for :headers do %>
2
+ <style type="text/css">
3
+ #sidebar {width: 0px;}
4
+ #center_body {width: 780px; max-width: 780px;}
5
+ </style>
6
+ <% end %>
7
+
8
+ <% content_for :title do %>
9
+ <%= profile_subject.name + ": " + t('event.title') %>
10
+ <% end %>
11
+
12
+ <%= location(
13
+ link_to(profile_subject.name, polymorphic_path(profile_subject)),
14
+ link_to(t('event.title'), polymorphic_path([profile_subject, Event.new]))
15
+ ) %>
16
+
17
+ <% toolbar :profile => profile_subject %>
18
+
19
+ <div id="calendar"></div>
20
+
21
+ <%= javascript_tag do %>
22
+ $(function(){
23
+
24
+ <% if profile_subject.respond_to? :rooms %>
25
+ SocialStream.Events.current.roomIndex = <%= raw profile_subject.rooms.map(&:id) %>;
26
+ <% end %>
27
+
28
+ SocialStream.Events.current.eventColor = '#58310E';
29
+
30
+ SocialStream.Events.current.calendar = $('#calendar').fullCalendar({
31
+ header: {
32
+ left: 'prev,next today',
33
+ center: 'title',
34
+ right: 'month,agendaWeek,agendaDay'
35
+ },
36
+ firstDay: 1,
37
+ eventColor: SocialStream.Events.current.eventColor,
38
+ <% if can? :create, new_post(profile_subject) %>
39
+ selectable: true,
40
+ selectHelper: true,
41
+ select: function(startDate, endDate, allDay, jsEvent){
42
+
43
+ SocialStream.Events.current.newForm = new Boxy(
44
+ "<%= escape_javascript render(:partial => 'events/new') %>",
45
+ {
46
+ title: "<%= t('event.new.title') %>",
47
+ closeable: true,
48
+ closeText: "<%= t('boxy.close_text') %>",
49
+ draggable: true
50
+ }
51
+ );
52
+
53
+
54
+ SocialStream.Events.current.newForm.moveTo(jsEvent.clientX, jsEvent.clientY);
55
+
56
+ var c = SocialStream.Events.current.newForm.getContent();
57
+
58
+ c.children('#event_start_at').val(startDate.toJSON());
59
+ c.children('#event_end_at').val(endDate.toJSON());
60
+ c.children('#event_all_day').val(allDay.toString());
61
+
62
+ // From rails-scheduler gem
63
+ Scheduler.form.init(c.find('.scheduler_form'), startDate);
64
+ },
65
+ <% end %>
66
+ // Implement event edition
67
+ // editable: true,
68
+ events: function(start, end, callback) {
69
+ $.ajax({
70
+ url: "<%= escape_javascript polymorphic_path([profile_subject, Event.new]) %>",
71
+ dataType: 'json',
72
+ data: {
73
+ // our hypothetical feed requires UNIX timestamps
74
+ start: Math.round(start.getTime() / 1000),
75
+ end: Math.round(end.getTime() / 1000)
76
+ },
77
+ success: function(events) {
78
+ callback(
79
+ $.map(events, function(event) {
80
+ event.color = SocialStream.Events.tools.eventColor(event.roomId);
81
+ return event;
82
+ }
83
+ )
84
+ );
85
+ }
86
+ });
87
+ }
88
+ });
89
+
90
+ <% if params[:at] %>
91
+ // TODO: optimize this to save one index call
92
+ SocialStream.Events.current.calendar.fullCalendar('changeView', "agendaDay");
93
+ SocialStream.Events.current.calendar.fullCalendar('gotoDate', new Date(<%= params[:at] %> * 1000));
94
+ <% end %>
95
+ });
96
+ <% end %>
@@ -0,0 +1,31 @@
1
+ <%= form_for @room || Room.new(:actor => current_subject.actor), :remote => true do |f| %>
2
+ <%= f.hidden_field :actor_id %>
3
+
4
+ <% if f.object.errors.any? %>
5
+ <div id="error_explanation">
6
+ <h2><%= pluralize(f.object.errors.count, "error") %> evitaron que se guardara este espacio:</h2>
7
+
8
+ <ul>
9
+ <% f.object.errors.full_messages.each do |msg| %>
10
+ <li><%= msg %></li>
11
+ <% end %>
12
+ </ul>
13
+ </div>
14
+ <% end %>
15
+
16
+ <div class="row">
17
+ <div class="label">
18
+ <%= f.text_field :name %>
19
+ </div>
20
+
21
+ <div class="field">
22
+ <%= f.submit %>
23
+ </div>
24
+ </div>
25
+ <% end %>
26
+
27
+ <%= javascript_tag do %>
28
+ $(function(){
29
+ $('#room_name').Watermark("<%= escape_javascript t('room.watermark.name') %>");
30
+ });
31
+ <% end %>