Commit a250c30b4876a6a3508d029f6f9b8e891a9b7c5a

Authored by Caio Almeida
Committed by Leandro Santos
1 parent b94badef
Exists in staging

Ticket #117: Adding calendar display to "event" plugin, instead of creating a new plugin

plugins/event/lib/event_plugin/event_block.rb
1 class EventPlugin::EventBlock < Block 1 class EventPlugin::EventBlock < Block
2 - attr_accessible :all_env_events, :limit, :future_only, :date_distance_limit 2 + attr_accessible :all_env_events, :limit, :future_only, :date_distance_limit, :display_as_calendar
3 3
4 settings_items :all_env_events, :type => :boolean, :default => false 4 settings_items :all_env_events, :type => :boolean, :default => false
5 settings_items :limit, :type => :integer, :default => 4 5 settings_items :limit, :type => :integer, :default => 4
6 settings_items :future_only, :type => :boolean, :default => true 6 settings_items :future_only, :type => :boolean, :default => true
7 settings_items :date_distance_limit, :type => :integer, :default => 0 7 settings_items :date_distance_limit, :type => :integer, :default => 0
  8 + settings_items :display_as_calendar, :type => :boolean, :default => false
8 9
9 def self.description 10 def self.description
10 _('Events') 11 _('Events')
@@ -51,4 +52,11 @@ class EventPlugin::EventBlock &lt; Block @@ -51,4 +52,11 @@ class EventPlugin::EventBlock &lt; Block
51 { :profile => [:article], :environment => [:article] } 52 { :profile => [:article], :environment => [:article] }
52 end 53 end
53 54
  55 + def api_content
  56 + content = []
  57 + events.each do |event|
  58 + content << { title: event.title, id: event.id, date: event.start_date.to_i * 1000, view_url: event.view_url }
  59 + end
  60 + { events: content }
  61 + end
54 end 62 end
plugins/event/public/jquery.e-calendar.js 0 → 100644
@@ -0,0 +1,194 @@ @@ -0,0 +1,194 @@
  1 +/**
  2 + * @license e-Calendar v0.9.3
  3 + * (c) 2014-2016 - Jhonis de Souza
  4 + * License: GNU
  5 + */
  6 +
  7 +(function ($) {
  8 +
  9 + var eCalendar = function (options, object) {
  10 + // Initializing global variables
  11 + var adDay = new Date().getDate();
  12 + var adMonth = new Date().getMonth();
  13 + var adYear = new Date().getFullYear();
  14 + var dDay = adDay;
  15 + var dMonth = adMonth;
  16 + var dYear = adYear;
  17 + var instance = object;
  18 +
  19 + var settings = $.extend({}, $.fn.eCalendar.defaults, options);
  20 +
  21 + function lpad(value, length, pad) {
  22 + if (typeof pad == 'undefined') {
  23 + pad = '0';
  24 + }
  25 + var p;
  26 + for (var i = 0; i < length; i++) {
  27 + p += pad;
  28 + }
  29 + return (p + value).slice(-length);
  30 + }
  31 +
  32 + var mouseOver = function () {
  33 + $(this).addClass('c-nav-btn-over');
  34 + };
  35 + var mouseLeave = function () {
  36 + $(this).removeClass('c-nav-btn-over');
  37 + };
  38 + var mouseOverEvent = function () {
  39 + $(this).addClass('c-event-over');
  40 + var d = $(this).attr('data-event-day');
  41 + $('div.c-event-item[data-event-day="' + d + '"]').addClass('c-event-over');
  42 + };
  43 + var mouseLeaveEvent = function () {
  44 + $(this).removeClass('c-event-over')
  45 + var d = $(this).attr('data-event-day');
  46 + $('div.c-event-item[data-event-day="' + d + '"]').removeClass('c-event-over');
  47 + };
  48 + var mouseOverItem = function () {
  49 + $(this).addClass('c-event-over');
  50 + var d = $(this).attr('data-event-day');
  51 + $('div.c-event[data-event-day="' + d + '"]').addClass('c-event-over');
  52 + };
  53 + var mouseLeaveItem = function () {
  54 + $(this).removeClass('c-event-over')
  55 + var d = $(this).attr('data-event-day');
  56 + $('div.c-event[data-event-day="' + d + '"]').removeClass('c-event-over');
  57 + };
  58 + var nextMonth = function () {
  59 + if (dMonth < 11) {
  60 + dMonth++;
  61 + } else {
  62 + dMonth = 0;
  63 + dYear++;
  64 + }
  65 + print();
  66 + };
  67 + var previousMonth = function () {
  68 + if (dMonth > 0) {
  69 + dMonth--;
  70 + } else {
  71 + dMonth = 11;
  72 + dYear--;
  73 + }
  74 + print();
  75 + };
  76 +
  77 + function loadEvents() {
  78 + if (typeof settings.url != 'undefined' && settings.url != '') {
  79 + $.ajax({url: settings.url,
  80 + async: false,
  81 + success: function (result) {
  82 + settings.events = result;
  83 + }
  84 + });
  85 + }
  86 + }
  87 +
  88 + function print() {
  89 + loadEvents();
  90 + var dWeekDayOfMonthStart = new Date(dYear, dMonth, 1).getDay() - settings.firstDayOfWeek;
  91 + if (dWeekDayOfMonthStart < 0) {
  92 + dWeekDayOfMonthStart = 6 - ((dWeekDayOfMonthStart + 1) * -1);
  93 + }
  94 + var dLastDayOfMonth = new Date(dYear, dMonth + 1, 0).getDate();
  95 + var dLastDayOfPreviousMonth = new Date(dYear, dMonth + 1, 0).getDate() - dWeekDayOfMonthStart + 1;
  96 +
  97 + var cBody = $('<div/>').addClass('c-grid');
  98 + var cEvents = $('<div/>').addClass('c-event-grid');
  99 + var cEventsBody = $('<div/>').addClass('c-event-body');
  100 + cEvents.append($('<div/>').addClass('c-event-title c-pad-top').html(settings.eventTitle));
  101 + cEvents.append(cEventsBody);
  102 + var cNext = $('<div/>').addClass('c-next c-grid-title c-pad-top');
  103 + var cMonth = $('<div/>').addClass('c-month c-grid-title c-pad-top');
  104 + var cPrevious = $('<div/>').addClass('c-previous c-grid-title c-pad-top');
  105 + cPrevious.html(settings.textArrows.previous);
  106 + cMonth.html(settings.months[dMonth] + ' ' + dYear);
  107 + cNext.html(settings.textArrows.next);
  108 +
  109 + cPrevious.on('mouseover', mouseOver).on('mouseleave', mouseLeave).on('click', previousMonth);
  110 + cNext.on('mouseover', mouseOver).on('mouseleave', mouseLeave).on('click', nextMonth);
  111 +
  112 + cBody.append(cPrevious);
  113 + cBody.append(cMonth);
  114 + cBody.append(cNext);
  115 + var dayOfWeek = settings.firstDayOfWeek;
  116 + for (var i = 0; i < 7; i++) {
  117 + if (dayOfWeek > 6) {
  118 + dayOfWeek = 0;
  119 + }
  120 + var cWeekDay = $('<div/>').addClass('c-week-day c-pad-top');
  121 + cWeekDay.html(settings.weekDays[dayOfWeek]);
  122 + cBody.append(cWeekDay);
  123 + dayOfWeek++;
  124 + }
  125 + var day = 1;
  126 + var dayOfNextMonth = 1;
  127 + for (var i = 0; i < 42; i++) {
  128 + var cDay = $('<div/>');
  129 + if (i < dWeekDayOfMonthStart) {
  130 + cDay.addClass('c-day-previous-month c-pad-top');
  131 + cDay.html(dLastDayOfPreviousMonth++);
  132 + } else if (day <= dLastDayOfMonth) {
  133 + cDay.addClass('c-day c-pad-top');
  134 + if (day == dDay && adMonth == dMonth && adYear == dYear) {
  135 + cDay.addClass('c-today');
  136 + }
  137 + for (var j = 0; j < settings.events.length; j++) {
  138 + var d = settings.events[j].datetime;
  139 + if (d.getDate() == day && d.getMonth() == dMonth && d.getFullYear() == dYear) {
  140 + cDay.addClass('c-event').attr('data-event-day', d.getDate());
  141 + cDay.on('mouseover', mouseOverEvent).on('mouseleave', mouseLeaveEvent);
  142 + }
  143 + }
  144 + cDay.html(day++);
  145 + } else {
  146 + cDay.addClass('c-day-next-month c-pad-top');
  147 + cDay.html(dayOfNextMonth++);
  148 + }
  149 + cBody.append(cDay);
  150 + }
  151 + var eventList = $('<div/>').addClass('c-event-list');
  152 + for (var i = 0; i < settings.events.length; i++) {
  153 + var d = settings.events[i].datetime;
  154 + if (d.getMonth() == dMonth && d.getFullYear() == dYear) {
  155 + var date = lpad(d.getDate(), 2) + '/' + lpad(d.getMonth() + 1, 2) + ' ' + lpad(d.getHours(), 2) + ':' + lpad(d.getMinutes(), 2);
  156 + var item = $('<div/>').addClass('c-event-item');
  157 + var title = $('<div/>').addClass('title').html(date + ' ' + settings.events[i].title + '<br/>');
  158 + var description = $('<div/>').addClass('description').html(settings.events[i].description + '<br/>');
  159 + item.attr('data-event-day', d.getDate());
  160 + item.on('mouseover', mouseOverItem).on('mouseleave', mouseLeaveItem);
  161 + item.append(title).append(description);
  162 + eventList.append(item);
  163 + }
  164 + }
  165 + $(instance).addClass('calendar');
  166 + cEventsBody.append(eventList);
  167 + $(instance).html(cBody).append(cEvents);
  168 + }
  169 +
  170 + return print();
  171 + }
  172 +
  173 + $.fn.eCalendar = function (oInit) {
  174 + return this.each(function () {
  175 + return eCalendar(oInit, $(this));
  176 + });
  177 + };
  178 +
  179 + // plugin defaults
  180 + $.fn.eCalendar.defaults = {
  181 + weekDays: ['Dom', 'Seg', 'Ter', 'Qua', 'Qui', 'Sex', 'Sab'],
  182 + months: ['Janeiro', 'Fevereiro', 'Março', 'Abril', 'Maio', 'Junho', 'Julho', 'Agosto', 'Setembro', 'Outubro', 'Novembro', 'Dezembro'],
  183 + textArrows: {previous: '<', next: '>'},
  184 + eventTitle: 'Eventos',
  185 + url: '',
  186 + events: [
  187 + {title: 'Evento de Abertura', description: 'Abertura das Olimpíadas Rio 2016', datetime: new Date(2016, new Date().getMonth(), 12, 17)},
  188 + {title: 'Tênis de Mesa', description: 'BRA x ARG - Semifinal', datetime: new Date(2016, new Date().getMonth(), 23, 16)},
  189 + {title: 'Ginástica Olímpica', description: 'Classificatórias de equipes', datetime: new Date(2016, new Date().getMonth(), 31, 16)}
  190 + ],
  191 + firstDayOfWeek: 0
  192 + };
  193 +
  194 +}(jQuery));
0 \ No newline at end of file 195 \ No newline at end of file
plugins/event/public/style.css
@@ -194,3 +194,153 @@ @@ -194,3 +194,153 @@
194 display: block; 194 display: block;
195 margin-bottom: 3px; 195 margin-bottom: 3px;
196 } 196 }
  197 +
  198 +.calendar * {
  199 + box-sizing: border-box;
  200 + font-size: 12px;
  201 + color: #000;
  202 +}
  203 +
  204 +.calendar-sm {
  205 + cursor: default;
  206 + width: 100%;
  207 +}
  208 +
  209 +.calendar {
  210 + cursor: default;
  211 + width: 100%;
  212 +}
  213 +
  214 +.calendar-sm .c-pad-top {
  215 + padding-top: 2%;
  216 +}
  217 +
  218 +.calendar .c-pad-top {
  219 + padding-top: 3%;
  220 +}
  221 +
  222 +.c-grid {
  223 + height: 270px;
  224 +}
  225 +
  226 +.c-day {
  227 + width: 14.28%;
  228 + height: 13%;
  229 + background-color: #EEE;
  230 + float: left;
  231 + text-align: center;
  232 +}
  233 +
  234 +.c-day-previous-month {
  235 + width: 14.28%;
  236 + height: 13%;
  237 + background-color: #CCC;
  238 + float: left;
  239 + text-align: center;
  240 + color: #000;
  241 +}
  242 +
  243 +.c-day-next-month {
  244 + width: 14.28%;
  245 + height: 13%;
  246 + background-color: #CCC;
  247 + float: left;
  248 + text-align: center;
  249 + color: #000;
  250 +}
  251 +
  252 +.c-week-day {
  253 + width: 14.28%;
  254 + height: 10.38%;
  255 + background-color: transparent;
  256 + color: #000;
  257 + float: left;
  258 + text-align: center;
  259 + padding-top: 1%;
  260 +}
  261 +
  262 +.c-next {
  263 + width: 12.5%;
  264 + height: 12%;
  265 + padding: 2% 2% 0 2%;
  266 + text-align: right;
  267 + cursor: pointer;
  268 +}
  269 +
  270 +.c-previous {
  271 + width: 12.5%;
  272 + height: 12%;
  273 + padding: 2% 2% 0 2%;
  274 + text-align: left;
  275 + cursor: pointer;
  276 +}
  277 +
  278 +.c-month {
  279 + width: 75%;
  280 + height: 12%;
  281 + text-align: center;
  282 +}
  283 +
  284 +.c-nav-btn-over {
  285 + background-color: #CCC !important;
  286 + font-weight: bold;
  287 +}
  288 +
  289 +.c-today {
  290 + background-color: #CCC;
  291 + color: #FFF;
  292 +}
  293 +
  294 +.c-event {
  295 + background-color: #333;
  296 + color: white;
  297 + font-weight: bold;
  298 + cursor: pointer;
  299 +}
  300 +
  301 +.c-grid {
  302 + width: 100%;
  303 +}
  304 +
  305 +.c-event-grid {
  306 + margin-left: 1px;
  307 + width: 100%;
  308 + clear: both;
  309 +}
  310 +
  311 +.c-grid-title {
  312 + float: left;
  313 + background-color: #EEE;
  314 + color: #000;
  315 +}
  316 +
  317 +.c-event-title {
  318 + width: 100%;
  319 + height: 12%;
  320 + text-align: center;
  321 + background-color: #FFF;
  322 + color: #000;
  323 +}
  324 +
  325 +.c-event-body {
  326 + height: 88.1%;
  327 +}
  328 +
  329 +.c-event-item {
  330 + padding: 0;
  331 + margin: 2px 0;
  332 +}
  333 +
  334 +.c-event-over {
  335 + background-color: #EEE;
  336 + color: black;
  337 +}
  338 +
  339 +.c-event-item .description {
  340 + display: none;
  341 +}
  342 +
  343 +.block .calendar a,
  344 +.block .calendar a:visited {
  345 + color: #000;
  346 +}
plugins/event/test/functional/event_block_test.rb
@@ -60,4 +60,15 @@ class HomeControllerTest &lt; ActionController::TestCase @@ -60,4 +60,15 @@ class HomeControllerTest &lt; ActionController::TestCase
60 assert_select ev + 'time.duration[itemprop="endDate"]', false 60 assert_select ev + 'time.duration[itemprop="endDate"]', false
61 end 61 end
62 62
  63 + should 'have different displays' do
  64 + @block.display_as_calendar = false
  65 + @block.save!
  66 + get :index
  67 + assert_select '.events-block', false
  68 +
  69 + @block.display_as_calendar = true
  70 + @block.save!
  71 + get :index
  72 + assert_select '.events-block', true
  73 + end
63 end 74 end
plugins/event/views/blocks/event.html.erb
@@ -2,6 +2,33 @@ @@ -2,6 +2,33 @@
2 2
3 <%= block_title(block.title, block.subtitle) %> 3 <%= block_title(block.title, block.subtitle) %>
4 4
  5 +<% if block.display_as_calendar %>
  6 +
  7 +<%= javascript_include_tag 'plugins/event/jquery.e-calendar' %>
  8 +<div class="events-block" id="events-block-<%= block.id %>"></div>
  9 +<script>
  10 + $(document).ready(function () {
  11 + $('#events-block-<%= block.id %>').eCalendar({
  12 + weekDays: <%= %w(S M T W T F S).collect{|day| c_(day)}.to_json %>,
  13 + months: <%= %w(January February March April May June July August September October November December).collect{|m| c_(m)}.to_json %>,
  14 + textArrows: { previous: '<', next: '>' },
  15 + eventTitle: '<%= c_('Events') %>',
  16 + url: '',
  17 + events: [
  18 + <% block.events.each do |event| %>
  19 + {
  20 + title: '<%= link_to(event.title, event.view_url) %>',
  21 + description: '',
  22 + datetime: new Date(<%= event.start_date.to_i %>000)
  23 + }
  24 + <% end %>
  25 + ]
  26 + });
  27 + });
  28 +</script>
  29 +
  30 +<% else %>
  31 +
5 <ul class="events"> 32 <ul class="events">
6 <% block.events(user).map do |event| %> 33 <% block.events(user).map do |event| %>
7 <% days_left = ( (event.start_date - DateTime.now)/60/60/24 ).round %> 34 <% days_left = ( (event.start_date - DateTime.now)/60/60/24 ).round %>
@@ -19,3 +46,5 @@ @@ -19,3 +46,5 @@
19 </li> 46 </li>
20 <% end %> 47 <% end %>
21 </ul> 48 </ul>
  49 +
  50 +<% end %>
plugins/event/views/profile_design/event_plugin/_event_block.html.erb
@@ -17,8 +17,10 @@ @@ -17,8 +17,10 @@
17 </small> 17 </small>
18 <% end %> 18 <% end %>
19 19
20 -<%= labelled_check_box(_('Only show future events'), "block[future_only]", "1", @block.future_only) %> 20 +<p><%= labelled_check_box(_('Only show future events'), "block[future_only]", "1", @block.future_only) %></p>
  21 +
  22 +<p><%= labelled_check_box(_('Display as a calendar'), "block[display_as_calendar]", "1", @block.display_as_calendar) %></p>
  23 +
  24 +<p><%= labelled_form_field _('Limit of days to display'), text_field(:block, :date_distance_limit, :size => 4) %></p>
21 25
22 -<%= labelled_form_field _('Limit of days to display'),  
23 - text_field(:block, :date_distance_limit, :size => 4) %>  
24 <small class='event-plugin-config-tip'>(<%=_('Only show events in this interval of days.')%>)</small> 26 <small class='event-plugin-config-tip'>(<%=_('Only show events in this interval of days.')%>)</small>
plugins/events/lib/events_plugin.rb
@@ -1,23 +0,0 @@ @@ -1,23 +0,0 @@
1 -class EventsPlugin < Noosfero::Plugin  
2 - def self.plugin_name  
3 - 'EventsPlugin'  
4 - end  
5 -  
6 - def self.plugin_description  
7 - _('Adds a block that shows events in a calendar')  
8 - end  
9 -  
10 - def self.extra_blocks  
11 - {  
12 - EventsPlugin::EventsBlock => { type: [Person, Community, Enterprise] }  
13 - }  
14 - end  
15 -  
16 - def self.has_admin_url?  
17 - false  
18 - end  
19 -  
20 - def stylesheet?  
21 - true  
22 - end  
23 -end  
plugins/events/lib/events_plugin/events_block.rb
@@ -1,45 +0,0 @@ @@ -1,45 +0,0 @@
1 -class EventsPlugin::EventsBlock < Block  
2 - def view_title  
3 - self.default_title  
4 - end  
5 -  
6 - def events  
7 - owner.events  
8 - end  
9 -  
10 - def extra_option  
11 - { }  
12 - end  
13 -  
14 - def self.description  
15 - _('Shows events in a calendar.')  
16 - end  
17 -  
18 - def help  
19 - _('This block shows events in a calendar.')  
20 - end  
21 -  
22 - def default_title  
23 - _('Events Calendar')  
24 - end  
25 -  
26 - def api_content  
27 - content = []  
28 - events.each do |event|  
29 - content << { title: event.title, id: event.id, date: event.start_date }  
30 - end  
31 - { events: content }  
32 - end  
33 -  
34 - def display_api_content_by_default?  
35 - false  
36 - end  
37 -  
38 - def timeout  
39 - 4.hours  
40 - end  
41 -  
42 - def self.expire_on  
43 - { profile: [:article] }  
44 - end  
45 -end  
plugins/events/public/jquery.e-calendar.js
@@ -1,194 +0,0 @@ @@ -1,194 +0,0 @@
1 -/**  
2 - * @license e-Calendar v0.9.3  
3 - * (c) 2014-2016 - Jhonis de Souza  
4 - * License: GNU  
5 - */  
6 -  
7 -(function ($) {  
8 -  
9 - var eCalendar = function (options, object) {  
10 - // Initializing global variables  
11 - var adDay = new Date().getDate();  
12 - var adMonth = new Date().getMonth();  
13 - var adYear = new Date().getFullYear();  
14 - var dDay = adDay;  
15 - var dMonth = adMonth;  
16 - var dYear = adYear;  
17 - var instance = object;  
18 -  
19 - var settings = $.extend({}, $.fn.eCalendar.defaults, options);  
20 -  
21 - function lpad(value, length, pad) {  
22 - if (typeof pad == 'undefined') {  
23 - pad = '0';  
24 - }  
25 - var p;  
26 - for (var i = 0; i < length; i++) {  
27 - p += pad;  
28 - }  
29 - return (p + value).slice(-length);  
30 - }  
31 -  
32 - var mouseOver = function () {  
33 - $(this).addClass('c-nav-btn-over');  
34 - };  
35 - var mouseLeave = function () {  
36 - $(this).removeClass('c-nav-btn-over');  
37 - };  
38 - var mouseOverEvent = function () {  
39 - $(this).addClass('c-event-over');  
40 - var d = $(this).attr('data-event-day');  
41 - $('div.c-event-item[data-event-day="' + d + '"]').addClass('c-event-over');  
42 - };  
43 - var mouseLeaveEvent = function () {  
44 - $(this).removeClass('c-event-over')  
45 - var d = $(this).attr('data-event-day');  
46 - $('div.c-event-item[data-event-day="' + d + '"]').removeClass('c-event-over');  
47 - };  
48 - var mouseOverItem = function () {  
49 - $(this).addClass('c-event-over');  
50 - var d = $(this).attr('data-event-day');  
51 - $('div.c-event[data-event-day="' + d + '"]').addClass('c-event-over');  
52 - };  
53 - var mouseLeaveItem = function () {  
54 - $(this).removeClass('c-event-over')  
55 - var d = $(this).attr('data-event-day');  
56 - $('div.c-event[data-event-day="' + d + '"]').removeClass('c-event-over');  
57 - };  
58 - var nextMonth = function () {  
59 - if (dMonth < 11) {  
60 - dMonth++;  
61 - } else {  
62 - dMonth = 0;  
63 - dYear++;  
64 - }  
65 - print();  
66 - };  
67 - var previousMonth = function () {  
68 - if (dMonth > 0) {  
69 - dMonth--;  
70 - } else {  
71 - dMonth = 11;  
72 - dYear--;  
73 - }  
74 - print();  
75 - };  
76 -  
77 - function loadEvents() {  
78 - if (typeof settings.url != 'undefined' && settings.url != '') {  
79 - $.ajax({url: settings.url,  
80 - async: false,  
81 - success: function (result) {  
82 - settings.events = result;  
83 - }  
84 - });  
85 - }  
86 - }  
87 -  
88 - function print() {  
89 - loadEvents();  
90 - var dWeekDayOfMonthStart = new Date(dYear, dMonth, 1).getDay() - settings.firstDayOfWeek;  
91 - if (dWeekDayOfMonthStart < 0) {  
92 - dWeekDayOfMonthStart = 6 - ((dWeekDayOfMonthStart + 1) * -1);  
93 - }  
94 - var dLastDayOfMonth = new Date(dYear, dMonth + 1, 0).getDate();  
95 - var dLastDayOfPreviousMonth = new Date(dYear, dMonth + 1, 0).getDate() - dWeekDayOfMonthStart + 1;  
96 -  
97 - var cBody = $('<div/>').addClass('c-grid');  
98 - var cEvents = $('<div/>').addClass('c-event-grid');  
99 - var cEventsBody = $('<div/>').addClass('c-event-body');  
100 - cEvents.append($('<div/>').addClass('c-event-title c-pad-top').html(settings.eventTitle));  
101 - cEvents.append(cEventsBody);  
102 - var cNext = $('<div/>').addClass('c-next c-grid-title c-pad-top');  
103 - var cMonth = $('<div/>').addClass('c-month c-grid-title c-pad-top');  
104 - var cPrevious = $('<div/>').addClass('c-previous c-grid-title c-pad-top');  
105 - cPrevious.html(settings.textArrows.previous);  
106 - cMonth.html(settings.months[dMonth] + ' ' + dYear);  
107 - cNext.html(settings.textArrows.next);  
108 -  
109 - cPrevious.on('mouseover', mouseOver).on('mouseleave', mouseLeave).on('click', previousMonth);  
110 - cNext.on('mouseover', mouseOver).on('mouseleave', mouseLeave).on('click', nextMonth);  
111 -  
112 - cBody.append(cPrevious);  
113 - cBody.append(cMonth);  
114 - cBody.append(cNext);  
115 - var dayOfWeek = settings.firstDayOfWeek;  
116 - for (var i = 0; i < 7; i++) {  
117 - if (dayOfWeek > 6) {  
118 - dayOfWeek = 0;  
119 - }  
120 - var cWeekDay = $('<div/>').addClass('c-week-day c-pad-top');  
121 - cWeekDay.html(settings.weekDays[dayOfWeek]);  
122 - cBody.append(cWeekDay);  
123 - dayOfWeek++;  
124 - }  
125 - var day = 1;  
126 - var dayOfNextMonth = 1;  
127 - for (var i = 0; i < 42; i++) {  
128 - var cDay = $('<div/>');  
129 - if (i < dWeekDayOfMonthStart) {  
130 - cDay.addClass('c-day-previous-month c-pad-top');  
131 - cDay.html(dLastDayOfPreviousMonth++);  
132 - } else if (day <= dLastDayOfMonth) {  
133 - cDay.addClass('c-day c-pad-top');  
134 - if (day == dDay && adMonth == dMonth && adYear == dYear) {  
135 - cDay.addClass('c-today');  
136 - }  
137 - for (var j = 0; j < settings.events.length; j++) {  
138 - var d = settings.events[j].datetime;  
139 - if (d.getDate() == day && d.getMonth() == dMonth && d.getFullYear() == dYear) {  
140 - cDay.addClass('c-event').attr('data-event-day', d.getDate());  
141 - cDay.on('mouseover', mouseOverEvent).on('mouseleave', mouseLeaveEvent);  
142 - }  
143 - }  
144 - cDay.html(day++);  
145 - } else {  
146 - cDay.addClass('c-day-next-month c-pad-top');  
147 - cDay.html(dayOfNextMonth++);  
148 - }  
149 - cBody.append(cDay);  
150 - }  
151 - var eventList = $('<div/>').addClass('c-event-list');  
152 - for (var i = 0; i < settings.events.length; i++) {  
153 - var d = settings.events[i].datetime;  
154 - if (d.getMonth() == dMonth && d.getFullYear() == dYear) {  
155 - var date = lpad(d.getDate(), 2) + '/' + lpad(d.getMonth() + 1, 2) + ' ' + lpad(d.getHours(), 2) + ':' + lpad(d.getMinutes(), 2);  
156 - var item = $('<div/>').addClass('c-event-item');  
157 - var title = $('<div/>').addClass('title').html(date + ' ' + settings.events[i].title + '<br/>');  
158 - var description = $('<div/>').addClass('description').html(settings.events[i].description + '<br/>');  
159 - item.attr('data-event-day', d.getDate());  
160 - item.on('mouseover', mouseOverItem).on('mouseleave', mouseLeaveItem);  
161 - item.append(title).append(description);  
162 - eventList.append(item);  
163 - }  
164 - }  
165 - $(instance).addClass('calendar');  
166 - cEventsBody.append(eventList);  
167 - $(instance).html(cBody).append(cEvents);  
168 - }  
169 -  
170 - return print();  
171 - }  
172 -  
173 - $.fn.eCalendar = function (oInit) {  
174 - return this.each(function () {  
175 - return eCalendar(oInit, $(this));  
176 - });  
177 - };  
178 -  
179 - // plugin defaults  
180 - $.fn.eCalendar.defaults = {  
181 - weekDays: ['Dom', 'Seg', 'Ter', 'Qua', 'Qui', 'Sex', 'Sab'],  
182 - months: ['Janeiro', 'Fevereiro', 'Março', 'Abril', 'Maio', 'Junho', 'Julho', 'Agosto', 'Setembro', 'Outubro', 'Novembro', 'Dezembro'],  
183 - textArrows: {previous: '<', next: '>'},  
184 - eventTitle: 'Eventos',  
185 - url: '',  
186 - events: [  
187 - {title: 'Evento de Abertura', description: 'Abertura das Olimpíadas Rio 2016', datetime: new Date(2016, new Date().getMonth(), 12, 17)},  
188 - {title: 'Tênis de Mesa', description: 'BRA x ARG - Semifinal', datetime: new Date(2016, new Date().getMonth(), 23, 16)},  
189 - {title: 'Ginástica Olímpica', description: 'Classificatórias de equipes', datetime: new Date(2016, new Date().getMonth(), 31, 16)}  
190 - ],  
191 - firstDayOfWeek: 0  
192 - };  
193 -  
194 -}(jQuery));  
195 \ No newline at end of file 0 \ No newline at end of file
plugins/events/public/style.css
@@ -1,149 +0,0 @@ @@ -1,149 +0,0 @@
1 -.calendar * {  
2 - box-sizing: border-box;  
3 - font-size: 12px;  
4 - color: #000;  
5 -}  
6 -  
7 -.calendar-sm {  
8 - cursor: default;  
9 - width: 100%;  
10 -}  
11 -  
12 -.calendar {  
13 - cursor: default;  
14 - width: 100%;  
15 -}  
16 -  
17 -.calendar-sm .c-pad-top {  
18 - padding-top: 2%;  
19 -}  
20 -  
21 -.calendar .c-pad-top {  
22 - padding-top: 3%;  
23 -}  
24 -  
25 -.c-grid {  
26 - height: 270px;  
27 -}  
28 -  
29 -.c-day {  
30 - width: 14.28%;  
31 - height: 13%;  
32 - background-color: #EEE;  
33 - float: left;  
34 - text-align: center;  
35 -}  
36 -  
37 -.c-day-previous-month {  
38 - width: 14.28%;  
39 - height: 13%;  
40 - background-color: #CCC;  
41 - float: left;  
42 - text-align: center;  
43 - color: #000;  
44 -}  
45 -  
46 -.c-day-next-month {  
47 - width: 14.28%;  
48 - height: 13%;  
49 - background-color: #CCC;  
50 - float: left;  
51 - text-align: center;  
52 - color: #000;  
53 -}  
54 -  
55 -.c-week-day {  
56 - width: 14.28%;  
57 - height: 10.38%;  
58 - background-color: transparent;  
59 - color: #000;  
60 - float: left;  
61 - text-align: center;  
62 - padding-top: 1%;  
63 -}  
64 -  
65 -.c-next {  
66 - width: 12.5%;  
67 - height: 12%;  
68 - padding: 2% 2% 0 2%;  
69 - text-align: right;  
70 - cursor: pointer;  
71 -}  
72 -  
73 -.c-previous {  
74 - width: 12.5%;  
75 - height: 12%;  
76 - padding: 2% 2% 0 2%;  
77 - text-align: left;  
78 - cursor: pointer;  
79 -}  
80 -  
81 -.c-month {  
82 - width: 75%;  
83 - height: 12%;  
84 - text-align: center;  
85 -}  
86 -  
87 -.c-nav-btn-over {  
88 - background-color: #CCC !important;  
89 - font-weight: bold;  
90 -}  
91 -  
92 -.c-today {  
93 - background-color: #CCC;  
94 - color: #FFF;  
95 -}  
96 -  
97 -.c-event {  
98 - background-color: #333;  
99 - color: white;  
100 - font-weight: bold;  
101 - cursor: pointer;  
102 -}  
103 -  
104 -.c-grid {  
105 - width: 100%;  
106 -}  
107 -  
108 -.c-event-grid {  
109 - margin-left: 1px;  
110 - width: 100%;  
111 - clear: both;  
112 -}  
113 -  
114 -.c-grid-title {  
115 - float: left;  
116 - background-color: #EEE;  
117 - color: #000;  
118 -}  
119 -  
120 -.c-event-title {  
121 - width: 100%;  
122 - height: 12%;  
123 - text-align: center;  
124 - background-color: #FFF;  
125 - color: #000;  
126 -}  
127 -  
128 -.c-event-body {  
129 - height: 88.1%;  
130 -}  
131 -  
132 -.c-event-item {  
133 - padding: 0;  
134 - margin: 2px 0;  
135 -}  
136 -  
137 -.c-event-over {  
138 - background-color: #EEE;  
139 - color: black;  
140 -}  
141 -  
142 -.c-event-item .description {  
143 - display: none;  
144 -}  
145 -  
146 -.block .calendar a,  
147 -.block .calendar a:visited {  
148 - color: #000;  
149 -}  
plugins/events/test/test_helper.rb
@@ -1 +0,0 @@ @@ -1 +0,0 @@
1 -require_relative '../../../test/test_helper'  
plugins/events/test/unit/events_block_test.rb
@@ -1,42 +0,0 @@ @@ -1,42 +0,0 @@
1 -require_relative '../test_helper'  
2 -  
3 -class EventsBlockTest < ActiveSupport::TestCase  
4 - should 'describe itself' do  
5 - assert_not_equal Block.description, EventsPlugin::EventsBlock.description  
6 - end  
7 -  
8 - should 'is editable' do  
9 - block = EventsPlugin::EventsBlock.new  
10 - assert block.editable?  
11 - end  
12 -  
13 - should 'return events' do  
14 - profile = create(Profile, name: 'Test')  
15 - event1 = create(Event, profile: profile)  
16 - event2 = create(Event, profile: profile)  
17 - event3 = create(Event, profile: create(Profile, name: 'Other'))  
18 -  
19 - block = EventsPlugin::EventsBlock.new  
20 - block.stubs(:owner).returns(profile)  
21 -  
22 - assert_equal [event1, event2].map(&:id), block.events.map(&:id)  
23 - end  
24 -end  
25 -  
26 -require 'boxes_helper'  
27 -  
28 -class EventsBlockViewTest < ActionView::TestCase  
29 - include BoxesHelper  
30 -  
31 - should 'return events in api_content' do  
32 - profile = create(Profile, name: 'Test')  
33 - event1 = create(Event, profile: profile)  
34 - event2 = create(Event, profile: profile)  
35 - event3 = create(Event, profile: create(Profile, name: 'Other'))  
36 -  
37 - block = EventsPlugin::EventsBlock.new  
38 - block.stubs(:owner).returns(profile)  
39 -  
40 - assert_equal [event1.id, event2.id], block.api_content[:events].map{ |e| e[:id] }  
41 - end  
42 -end  
plugins/events/views/blocks/events.html.erb
@@ -1,25 +0,0 @@ @@ -1,25 +0,0 @@
1 -<%= javascript_include_tag 'plugins/events/jquery.e-calendar' %>  
2 -<%= block_title(block.view_title, block.subtitle) %>  
3 -  
4 -<div class="events-block" id="events-block-<%= block.id %>"></div>  
5 -  
6 -<script>  
7 - $(document).ready(function () {  
8 - $('#events-block-<%= block.id %>').eCalendar({  
9 - weekDays: <%= %w(S M T W T F S).collect{|day| c_(day)}.to_json %>,  
10 - months: <%= %w(January February March April May June July August September October November December).collect{|m| c_(m)}.to_json %>,  
11 - textArrows: { previous: '<', next: '>' },  
12 - eventTitle: '<%= c_('Events') %>',  
13 - url: '',  
14 - events: [  
15 - <% block.events.each do |event| %>  
16 - {  
17 - title: '<%= link_to(event.title, event.view_url) %>',  
18 - description: '',  
19 - datetime: new Date(<%= event.start_date.to_i %>000)  
20 - }  
21 - <% end %>  
22 - ]  
23 - });  
24 - });  
25 -</script>  
plugins/events/views/profile_design
@@ -1 +0,0 @@ @@ -1 +0,0 @@
1 -box_organizer/  
2 \ No newline at end of file 0 \ No newline at end of file