fullcalendar_engine_user 0.0.1

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.
Files changed (56) hide show
  1. checksums.yaml +7 -0
  2. data/MIT-LICENSE +20 -0
  3. data/Rakefile +34 -0
  4. data/app/assets/javascripts/fullcalendar_engine_user/application.js +13 -0
  5. data/app/assets/javascripts/fullcalendar_engine_user/events.js.erb +198 -0
  6. data/app/assets/javascripts/fullcalendar_engine_user/fullcalendar.js +6110 -0
  7. data/app/assets/javascripts/fullcalendar_engine_user/gcal.js +107 -0
  8. data/app/assets/javascripts/fullcalendar_engine_user/jquery-ui-1.10.3.custom.min.js +7 -0
  9. data/app/assets/stylesheets/fullcalendar_engine_user/application.css +13 -0
  10. data/app/assets/stylesheets/fullcalendar_engine_user/fullcalendar.css +589 -0
  11. data/app/assets/stylesheets/fullcalendar_engine_user/images/animated-overlay.gif +0 -0
  12. data/app/assets/stylesheets/fullcalendar_engine_user/images/ui-bg_diagonals-thick_18_b81900_40x40.png +0 -0
  13. data/app/assets/stylesheets/fullcalendar_engine_user/images/ui-bg_diagonals-thick_20_666666_40x40.png +0 -0
  14. data/app/assets/stylesheets/fullcalendar_engine_user/images/ui-bg_flat_10_000000_40x100.png +0 -0
  15. data/app/assets/stylesheets/fullcalendar_engine_user/images/ui-bg_glass_100_f6f6f6_1x400.png +0 -0
  16. data/app/assets/stylesheets/fullcalendar_engine_user/images/ui-bg_glass_100_fdf5ce_1x400.png +0 -0
  17. data/app/assets/stylesheets/fullcalendar_engine_user/images/ui-bg_glass_65_ffffff_1x400.png +0 -0
  18. data/app/assets/stylesheets/fullcalendar_engine_user/images/ui-bg_gloss-wave_35_f6a828_500x100.png +0 -0
  19. data/app/assets/stylesheets/fullcalendar_engine_user/images/ui-bg_highlight-soft_100_eeeeee_1x100.png +0 -0
  20. data/app/assets/stylesheets/fullcalendar_engine_user/images/ui-bg_highlight-soft_75_ffe45c_1x100.png +0 -0
  21. data/app/assets/stylesheets/fullcalendar_engine_user/images/ui-icons_222222_256x240.png +0 -0
  22. data/app/assets/stylesheets/fullcalendar_engine_user/images/ui-icons_228ef1_256x240.png +0 -0
  23. data/app/assets/stylesheets/fullcalendar_engine_user/images/ui-icons_ef8c08_256x240.png +0 -0
  24. data/app/assets/stylesheets/fullcalendar_engine_user/images/ui-icons_ffd27a_256x240.png +0 -0
  25. data/app/assets/stylesheets/fullcalendar_engine_user/images/ui-icons_ffffff_256x240.png +0 -0
  26. data/app/assets/stylesheets/fullcalendar_engine_user/jquery-ui-1.10.3.custom.css +1177 -0
  27. data/app/assets/stylesheets/fullcalendar_engine_user/style.css +23 -0
  28. data/app/controllers/fullcalendar_engine_user/application_controller.rb +4 -0
  29. data/app/controllers/fullcalendar_engine_user/events_controller.rb +173 -0
  30. data/app/models/fullcalendar_engine_user/event.rb +56 -0
  31. data/app/models/fullcalendar_engine_user/event_series.rb +50 -0
  32. data/app/views/fullcalendar_engine_user/events/_edit_form.html.erb +39 -0
  33. data/app/views/fullcalendar_engine_user/events/_form.html.erb +37 -0
  34. data/app/views/fullcalendar_engine_user/events/index.html.erb +21 -0
  35. data/app/views/fullcalendar_engine_user/events/new.js.erb +1 -0
  36. data/config/full-calendar.yml.dummy +57 -0
  37. data/config/initializers/configuration.rb +18 -0
  38. data/config/initializers/constants.rb +1 -0
  39. data/config/routes.rb +12 -0
  40. data/db/migrate/20131203105320_create_fullcalendar_engine_user_events.rb +13 -0
  41. data/db/migrate/20131203105529_create_fullcalendar_engine_user_event_series.rb +12 -0
  42. data/lib/fullcalendar_engine_user.rb +4 -0
  43. data/lib/fullcalendar_engine_user/engine.rb +5 -0
  44. data/lib/fullcalendar_engine_user/version.rb +3 -0
  45. data/lib/generators/fullcalendar_engine_user/install/install_generator.rb +41 -0
  46. data/lib/tasks/fullcalendar_engine_user_tasks.rake +4 -0
  47. data/test/controllers/fullcalendar_engine_user/events_controller_test.rb +9 -0
  48. data/test/fixtures/fullcalendar_engine_user/event_series.yml +11 -0
  49. data/test/fixtures/fullcalendar_engine_user/events.yml +11 -0
  50. data/test/fullcalendar_engine_user_test.rb +7 -0
  51. data/test/helpers/fullcalendar_engine_user/events_helper_test.rb +6 -0
  52. data/test/integration/navigation_test.rb +10 -0
  53. data/test/models/fullcalendar_engine_user/event_series_test.rb +9 -0
  54. data/test/models/fullcalendar_engine_user/event_test.rb +9 -0
  55. data/test/test_helper.rb +15 -0
  56. metadata +123 -0
@@ -0,0 +1,23 @@
1
+ body{
2
+ font-size: 12px;
3
+ font-family: Verdana, Geneva, Arial, Helvetica, sans-serif;
4
+ }
5
+
6
+ #loading{
7
+ position: absolute;
8
+ right: 0px;
9
+ top: 0px;
10
+ background-color: #dd0000;
11
+ font-weight:bold;
12
+ color: white;
13
+ margin: 5px;
14
+ padding: 3px;
15
+ }
16
+
17
+ span > div#loading {
18
+ position: fixed;
19
+ }
20
+
21
+ h1{
22
+ font-size: 16px;
23
+ }
@@ -0,0 +1,4 @@
1
+ module FullcalendarEngineUser
2
+ class ApplicationController < ActionController::Base
3
+ end
4
+ end
@@ -0,0 +1,173 @@
1
+ require_dependency 'fullcalendar_engine_user/application_controller'
2
+
3
+ module FullcalendarEngineUser
4
+ class EventsController < ApplicationController
5
+
6
+ layout FullcalendarEngineUser::Configuration['layout'] || 'application'
7
+
8
+ before_filter :load_event, only: [:edit, :update, :destroy, :move, :resize]
9
+ before_filter :determine_event_type, only: :create
10
+
11
+ def create
12
+ if @event.save
13
+ @event.update_column(:user_id,current_user.id)
14
+ @event.save
15
+ render nothing: true
16
+ else
17
+ render text: @event.errors.full_messages.to_sentence, status: 422
18
+ end
19
+ end
20
+
21
+ def new
22
+ respond_to do |format|
23
+ format.js
24
+ end
25
+ end
26
+
27
+ def get_events
28
+ start_time = Time.at(params[:start].to_i).to_formatted_s(:db)
29
+ end_time = Time.at(params[:end].to_i).to_formatted_s(:db)
30
+
31
+ if current_user.show_all == true and current_user.show_user == 0
32
+ @allusers= []
33
+ @ideventseries = []
34
+ @usersall = User.all
35
+ @usersall.each do |usersall|
36
+ @allusers << usersall[:id]
37
+ end
38
+ @eventseries = EventSeries.where("user_id in (?)", @allusers)
39
+ @eventseries.each do |events|
40
+ @ideventseries << events[:id]
41
+ end
42
+
43
+ @events = Event.where('
44
+ ((starttime >= :start_time and endtime <= :end_time) or
45
+ (starttime >= :start_time and endtime > :end_time and starttime <= :end_time) or
46
+ (starttime <= :start_time and endtime >= :start_time and endtime <= :end_time) or
47
+ (starttime <= :start_time and endtime > :end_time)) and ((user_id in (:user_id)) or (event_series_id in (:massiv)) )',
48
+ start_time: start_time, end_time: end_time, user_id: @allusers.map, massiv: @ideventseries.map)
49
+ elsif current_user.show_all == true and current_user.show_user > 0
50
+ @ideventseries = []
51
+ @eventseries = EventSeries.where("user_id = (?)", current_user.show_user)
52
+ @eventseries.each do |events|
53
+ @ideventseries << events[:id]
54
+ end
55
+ @events = Event.where('
56
+ ((starttime >= :start_time and endtime <= :end_time) or
57
+ (starttime >= :start_time and endtime > :end_time and starttime <= :end_time) or
58
+ (starttime <= :start_time and endtime >= :start_time and endtime <= :end_time) or
59
+ (starttime <= :start_time and endtime > :end_time)) and ((user_id = :user_id) or (event_series_id in (:massiv)) )',
60
+ start_time: start_time, end_time: end_time, user_id: current_user.show_user, massiv: @ideventseries.map)
61
+ else
62
+ @ideventseries = []
63
+ @eventseries = EventSeries.where("user_id = (?)", current_user.id)
64
+ @eventseries.each do |events|
65
+ @ideventseries << events[:id]
66
+ end
67
+ @events = Event.where('
68
+ ((starttime >= :start_time and endtime <= :end_time) or
69
+ (starttime >= :start_time and endtime > :end_time and starttime <= :end_time) or
70
+ (starttime <= :start_time and endtime >= :start_time and endtime <= :end_time) or
71
+ (starttime <= :start_time and endtime > :end_time)) and ((user_id = :user_id) or (event_series_id in (:massiv)) )',
72
+ start_time: start_time, end_time: end_time, user_id: current_user.id, massiv: @ideventseries.map)
73
+ end
74
+
75
+ events = []
76
+ @events.each do |event|
77
+ events << { id: event.id,
78
+ title: event.title,
79
+ description: event.description || '',
80
+ start: event.starttime.iso8601,
81
+ end: event.endtime.iso8601,
82
+ allDay: event.all_day,
83
+ recurring: (event.event_series_id) ? true : false }
84
+ end
85
+ render json: events.to_json
86
+ end
87
+
88
+ def move
89
+ if current_user.show_all == false and current_user.show_user == 0
90
+ if @event
91
+ @event.starttime = make_time_from_minute_and_day_delta(@event.starttime)
92
+ @event.endtime = make_time_from_minute_and_day_delta(@event.endtime)
93
+ @event.all_day = params[:all_day]
94
+ @event.save
95
+ end
96
+ end
97
+ render nothing: true
98
+ end
99
+
100
+ def resize
101
+ if current_user.show_all == false and current_user.show_user == 0
102
+ if @event
103
+ @event.endtime = make_time_from_minute_and_day_delta(@event.endtime)
104
+ @event.save
105
+ end
106
+ end
107
+ render nothing: true
108
+ end
109
+
110
+ def edit
111
+ render json: { form: render_to_string(partial: 'edit_form') }
112
+ end
113
+
114
+ def update
115
+ if current_user.show_all == false and current_user.show_user == 0
116
+ case params[:event][:commit_button]
117
+ when 'Update All Occurrence'
118
+ @events = @event.event_series.events
119
+ @event.update_events(@events, event_params)
120
+ when 'Update All Following Occurrence'
121
+ @events = @event.event_series.events.where('starttime > :start_time',
122
+ start_time: @event.starttime.to_formatted_s(:db)).to_a
123
+ @event.update_events(@events, event_params)
124
+ else
125
+ @event.attributes = event_params
126
+ @event.save
127
+ end
128
+ end
129
+ render nothing: true
130
+ end
131
+
132
+ def destroy
133
+ if current_user.show_all == false and current_user.show_user == 0
134
+ case params[:delete_all]
135
+ when 'true'
136
+ @event.event_series.destroy
137
+ when 'future'
138
+ @events = @event.event_series.events.where('starttime > :start_time',
139
+ start_time: @event.starttime.to_formatted_s(:db)).to_a
140
+ @event.event_series.events.delete(@events)
141
+ else
142
+ @event.destroy
143
+ end
144
+ end
145
+ render nothing: true
146
+ end
147
+
148
+ private
149
+
150
+ def load_event
151
+ @event = Event.where(:id => params[:id]).first
152
+ unless @event
153
+ render json: { message: "Event Not Found.."}, status: 404 and return
154
+ end
155
+ end
156
+
157
+ def event_params
158
+ params.require(:event).permit('title', 'description', 'starttime', 'endtime', 'all_day', 'period', 'frequency', 'commit_button')
159
+ end
160
+
161
+ def determine_event_type
162
+ if params[:event][:period] == "Does not repeat"
163
+ @event = Event.new(event_params)
164
+ else
165
+ @event = EventSeries.new(event_params)
166
+ end
167
+ end
168
+
169
+ def make_time_from_minute_and_day_delta(event_time)
170
+ params[:minute_delta].to_i.minutes.from_now((params[:day_delta].to_i).days.from_now(event_time))
171
+ end
172
+ end
173
+ end
@@ -0,0 +1,56 @@
1
+ module FullcalendarEngineUser
2
+ class Event < ActiveRecord::Base
3
+
4
+ attr_accessor :period, :frequency, :commit_button
5
+
6
+ validates :title, :description, :presence => true
7
+ validate :validate_timings
8
+
9
+ belongs_to :event_series
10
+
11
+ REPEATS = {
12
+ :no_repeat => "Does not repeat",
13
+ :days => "Daily",
14
+ :weeks => "Weekly",
15
+ :months => "Monthly",
16
+ :years => "Yearly"
17
+ }
18
+
19
+ def validate_timings
20
+ if (starttime >= endtime) and !all_day
21
+ errors[:base] << "Start Time must be less than End Time"
22
+ end
23
+ end
24
+
25
+ def update_events(events, event)
26
+ events.each do |e|
27
+ begin
28
+ old_start_time, old_end_time = e.starttime, e.endtime
29
+ e.attributes = event
30
+ if event_series.period.downcase == 'monthly' or event_series.period.downcase == 'yearly'
31
+ new_start_time = make_date_time(e.starttime, old_start_time)
32
+ new_end_time = make_date_time(e.starttime, old_end_time, e.endtime)
33
+ else
34
+ new_start_time = make_date_time(e.starttime, old_end_time)
35
+ new_end_time = make_date_time(e.endtime, old_end_time)
36
+ end
37
+ rescue
38
+ new_start_time = new_end_time = nil
39
+ end
40
+ if new_start_time and new_end_time
41
+ e.starttime, e.endtime = new_start_time, new_end_time
42
+ e.save
43
+ end
44
+ end
45
+
46
+ event_series.attributes = event
47
+ event_series.save
48
+ end
49
+
50
+ private
51
+
52
+ def make_date_time(original_time, difference_time, event_time = nil)
53
+ DateTime.parse("#{original_time.hour}:#{original_time.min}:#{original_time.sec}, #{event_time.try(:day) || difference_time.day}-#{difference_time.month}-#{difference_time.year}")
54
+ end
55
+ end
56
+ end
@@ -0,0 +1,50 @@
1
+ module FullcalendarEngineUser
2
+ class EventSeries < ActiveRecord::Base
3
+
4
+ attr_accessor :title, :description, :commit_button
5
+
6
+ validates :frequency, :period, :starttime, :endtime, :title, :description, :presence => true
7
+
8
+ has_many :events, :dependent => :destroy
9
+
10
+ after_create :create_events_until_end_time
11
+
12
+ def create_events_until_end_time(end_time=RECURRING_EVENTS_UPTO)
13
+ old_start_time = starttime
14
+ old_end_time = endtime
15
+ frequency_period = recurring_period(period)
16
+ new_start_time, new_end_time = old_start_time, old_end_time
17
+
18
+ while frequency.send(frequency_period).from_now(old_start_time) <= end_time
19
+ self.events.create(
20
+ :title => title,
21
+ :description => description,
22
+ :all_day => all_day,
23
+ :starttime => new_start_time,
24
+ :endtime => new_end_time
25
+ )
26
+ new_start_time = old_start_time = frequency.send(frequency_period).from_now(old_start_time)
27
+ new_end_time = old_end_time = frequency.send(frequency_period).from_now(old_end_time)
28
+
29
+ if period.downcase == 'monthly' or period.downcase == 'yearly'
30
+ begin
31
+ new_start_time = make_date_time(starttime, old_start_time)
32
+ new_end_time = make_date_time(endtime, old_end_time)
33
+ rescue
34
+ new_start_time = new_end_time = nil
35
+ end
36
+ end
37
+ end
38
+ end
39
+
40
+ def recurring_period(period)
41
+ Event::REPEATS.key(period.titleize).to_s.downcase
42
+ end
43
+
44
+ private
45
+
46
+ def make_date_time(original_time, difference_time)
47
+ DateTime.parse("#{original_time.hour}:#{original_time.min}:#{original_time.sec}, #{original_time.day}-#{difference_time.month}-#{difference_time.year}")
48
+ end
49
+ end
50
+ end
@@ -0,0 +1,39 @@
1
+ <%= form_for @event, :html => { :id => 'event_form' } do |f| %>
2
+ <p>
3
+ <%=f.label :title %>
4
+ <br/>
5
+ <%=f.text_field :title %>
6
+ </p>
7
+ <p>
8
+ <%=f.label :description %>
9
+ <br/>
10
+ <%=f.text_area :description, :rows => 4, :cols => 30 %>
11
+ </p>
12
+ <p>
13
+ <%=f.label :starttime, 'Start Time' %>
14
+ <br/>
15
+ <%=f.datetime_select :starttime %>
16
+ </p>
17
+ <p>
18
+ <%=f.label :endtime, 'End Time' %>
19
+ <br/>
20
+ <%=f.datetime_select :endtime %>
21
+ </p>
22
+ <p>
23
+ <%=f.label :all_day %>
24
+ <%=f.check_box :all_day %>
25
+ </p>
26
+
27
+ <%=f.hidden_field :commit_button, :value => ""%>
28
+ <p>
29
+ <%if @event.event_series -%>
30
+ <%=f.submit 'Update Only This Occurrence', :onclick => "document.getElementById('event_commit_button').value = this.value"%>
31
+ <%=f.submit 'Update All Occurrence', :onclick => "document.getElementById('event_commit_button').value = this.value"%>
32
+ <%=f.submit 'Update All Following Occurrence', :onclick => "document.getElementById('event_commit_button').value = this.value"%>
33
+ <%else-%>
34
+ <%=f.submit 'Update', :onclick => "document.getElementById('event_commit_button').value = this.value"%>
35
+ <%end-%>
36
+
37
+ <span id = "updating_events" class="spinner" style = "display:none;">Updating, Please wait...</span>
38
+ </p>
39
+ <%end %>
@@ -0,0 +1,37 @@
1
+ <%= form_for @event ||= FullcalendarEngineUser::Event.new, :html => { id: 'event_form' } do |f| %>
2
+ <p>
3
+ <%=f.label :title %>
4
+ <br/>
5
+ <%=f.text_field :title %>
6
+ </p>
7
+ <p>
8
+ <%=f.label :description %>
9
+ <br/>
10
+ <%=f.text_area :description, :rows => 4, :cols => 30 %>
11
+ </p>
12
+ <p>
13
+ <%=f.label :starttime, 'Start Time' %>
14
+ <br/>
15
+ <%=f.datetime_select :starttime %>
16
+ </p>
17
+ <p>
18
+ <%=f.label :endtime, 'End Time' %>
19
+ <br/>
20
+ <%=f.datetime_select :endtime %>
21
+ </p>
22
+ <p>
23
+ <%=f.label :all_day %>
24
+ <%=f.check_box :all_day %>
25
+ </p>
26
+ <p>
27
+ <%=f.label :period, "Repeats" %>
28
+ <%=f.select :period, FullcalendarEngineUser::Event::REPEATS.values, {}, onchange: "FullcalendarEngineUser.Events.showPeriodAndFrequency(this.value);" %>
29
+ </p>
30
+ <p id = "frequency" style = "display:none;">
31
+ <%=f.label :frequency, "Repeat every" %>
32
+ <%=f.select :frequency, (1..30).to_a %> <span id = "period"></span>
33
+ </p>
34
+ <p>
35
+ <%=f.submit %> <span id = "creating_events" class="spinner" style = "display:none;">Creating, Please wait...</span>
36
+ </p>
37
+ <%end %>
@@ -0,0 +1,21 @@
1
+ <p>
2
+ <%= link_to 'Create Event', 'javascript:void()', id: 'new_event' %>
3
+ </p>
4
+ <div>
5
+ <div class='calendar'></div>
6
+ </div>
7
+ <div id="event_desc_dialog" class="dialog" style="display:none;"></div>
8
+ <div id="create_event_dialog" class="dialog" style ="display:none;">
9
+ <%= render 'form' %>
10
+ </div>
11
+
12
+ <script>
13
+ $(document).ready(function(){
14
+ $('.calendar').fullCalendar(full_calendar_options);
15
+ // page is now ready, initialize the calendar...
16
+ $('#new_event').click(function(event) {
17
+ FullcalendarEngine.Form.display()
18
+ event.preventDefault();
19
+ });
20
+ });
21
+ </script>
@@ -0,0 +1 @@
1
+ $("#create_event_dialog").html("<%= escape_javascript( render partial: 'form') %>")
@@ -0,0 +1,57 @@
1
+ # Refer to the http://arshaw.com/fullcalendar/docs/ to know more about the following options in greater depth
2
+ # defaultView: 'agendaWeek'
3
+ # aspectRatio: 1.35
4
+ # header:
5
+ # left: 'prev,next today'
6
+ # center: 'title'
7
+ # right: 'month,agendaWeek,agendaDay'
8
+ # weekends: true
9
+ # weekNumbers: false
10
+ # weekNumberCalculation: 'iso'
11
+ # weekNumberTitle: 'W'
12
+
13
+ # editable: true
14
+ # disableDragging: false
15
+ # disableResizing: false
16
+ # allDayDefault: true
17
+ # ignoreTimezone: true
18
+
19
+ # lazyFetching: true
20
+ # startParam: 'start'
21
+ # endParam: 'end'
22
+
23
+ # titleFormat:
24
+ # month: 'MMMM yyyy'
25
+ # week: "MMM d[ yyyy]{ '&#8212;'[ MMM] d yyyy}"
26
+ # day: 'dddd, MMM d, yyyy'
27
+ # columnFormat:
28
+ # month: 'ddd'
29
+ # week: 'ddd M/d'
30
+ # day: 'dddd M/d'
31
+ # timeFormat:
32
+ # '': 'h(:mm)t' # default
33
+
34
+ # isRTL: false
35
+ # firstDay: 0
36
+ # monthNames: ['January','February','March','April','May','June','July','August','September','October','November','December']
37
+ # monthNamesShort: ['Jan','Feb','Mar','Apr','May','Jun','Jul','Aug','Sep','Oct','Nov','Dec']
38
+ # dayNames: ['Sunday','Monday','Tuesday','Wednesday','Thursday','Friday','Saturday']
39
+ # dayNamesShort: ['Sun','Mon','Tue','Wed','Thu','Fri','Sat']
40
+ # buttonText:
41
+ # prev: "<span class='fc-text-arrow'>prev..</span>"
42
+ # next: "<span class='fc-text-arrow'>next..</span>"
43
+ # prevYear: "<span class='fc-text-arrow'>&laquo;</span>"
44
+ # nextYear: "<span class='fc-text-arrow'>&raquo;</span>"
45
+ # today: 'today'
46
+ # month: 'month'
47
+ # week: 'week'
48
+ # day: 'day'
49
+
50
+ # theme: false
51
+ # buttonIcons:
52
+ # prev: 'circle-triangle-w'
53
+ # next: 'circle-triangle-e'
54
+ # selectable: true
55
+ # unselectAuto: true
56
+ # dropAccept: '*'
57
+ # handleWindowResize: true