social_stream-events 0.2.0 → 0.3.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/app/assets/javascripts/0_init.js +4 -0
- data/app/assets/javascripts/events.js.coffee +66 -0
- data/app/assets/stylesheets/events.css.scss +37 -0
- data/app/controllers/events_controller.rb +40 -0
- data/app/controllers/rooms_controller.rb +7 -0
- data/app/models/event.rb +53 -0
- data/app/models/room.rb +8 -0
- data/app/views/events/_event.html.erb +1 -0
- data/app/views/events/_new.html.erb +40 -0
- data/app/views/events/_sidebar_calendar.html.erb +26 -0
- data/app/views/events/create.js.erb +21 -0
- data/app/views/events/destroy.js.erb +1 -0
- data/app/views/events/index.html.erb +96 -0
- data/app/views/rooms/_form.html.erb +31 -0
- data/app/views/rooms/_index.html.erb +10 -0
- data/app/views/rooms/_settings.html.erb +23 -0
- data/app/views/rooms/create.js.erb +7 -0
- data/app/views/rooms/destroy.js.erb +1 -0
- data/config/locales/en.yml +34 -4
- data/config/locales/es.yml +34 -4
- data/config/routes.rb +1 -0
- data/db/migrate/20111101193523_create_events.rb +13 -0
- data/db/migrate/20111120104349_create_rooms.rb +26 -0
- data/db/migrate/20111204155637_add_scheduler.rb +33 -0
- data/db/migrate/20111218203314_change_scheduler.rb +11 -0
- data/lib/social_stream-events.rb +15 -0
- data/lib/social_stream/events/ability.rb +13 -0
- data/lib/social_stream/events/engine.rb +17 -0
- data/lib/social_stream/events/models/actor.rb +13 -0
- data/lib/social_stream/events/version.rb +1 -1
- data/lib/social_stream/views/settings/events.rb +18 -0
- data/social_stream-events.gemspec +6 -10
- data/vendor/assets/images/boxy-ne.png +0 -0
- data/vendor/assets/images/boxy-nw.png +0 -0
- data/vendor/assets/images/boxy-se.png +0 -0
- data/vendor/assets/images/boxy-sw.png +0 -0
- data/vendor/assets/javascripts/fullcalendar.js +12 -10
- data/vendor/assets/javascripts/gcal.js +2 -2
- data/vendor/assets/javascripts/jquery.boxy.js +570 -0
- data/vendor/assets/javascripts/sprintf.js +183 -0
- data/vendor/assets/stylesheets/boxy.css +49 -0
- data/vendor/assets/stylesheets/fullcalendar.css +7 -10
- data/vendor/assets/stylesheets/fullcalendar.print.css +4 -4
- metadata +81 -175
- data/db/migrate/20110910161707_create_social_stream_events.rb +0 -54
- data/db/migrate/20111102145626_add_more_fields_to_events.rb +0 -20
- data/db/migrate/20111104165944_add_more_fields_to_sessions.rb +0 -13
- data/db/migrate/20111104182420_add_details_to_events.rb +0 -18
- data/db/migrate/20111209120019_reset_events.rb +0 -18
- data/vendor/assets/javascripts/jquery.ad-gallery.js +0 -850
- data/vendor/assets/javascripts/jquery.ad-gallery.pack.js +0 -10
- data/vendor/assets/stylesheets/ad_next.png +0 -0
- data/vendor/assets/stylesheets/ad_prev.png +0 -0
- data/vendor/assets/stylesheets/ad_scroll_back.png +0 -0
- data/vendor/assets/stylesheets/ad_scroll_forward.png +0 -0
- data/vendor/assets/stylesheets/jquery.ad-gallery.css +0 -171
- data/vendor/assets/stylesheets/loader.gif +0 -0
- data/vendor/assets/stylesheets/social_stream-events.css +0 -273
@@ -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
|
data/app/models/event.rb
ADDED
@@ -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
|
data/app/models/room.rb
ADDED
@@ -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 %>
|