fullcalendar.io-rails 2.6.0 → 2.6.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (56) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +2 -0
  3. data/.rspec +3 -0
  4. data/.travis.yml +4 -0
  5. data/README.md +1 -1
  6. data/Rakefile +5 -0
  7. data/fullcalendar.io-rails.gemspec +5 -0
  8. data/lib/fullcalendar.io/rails/version.rb +1 -1
  9. data/spec/dummy/README.rdoc +28 -0
  10. data/spec/dummy/Rakefile +6 -0
  11. data/spec/dummy/app/assets/images/.keep +0 -0
  12. data/spec/dummy/app/assets/javascripts/application.js +13 -0
  13. data/spec/dummy/app/assets/stylesheets/application.css +15 -0
  14. data/spec/dummy/app/controllers/application_controller.rb +5 -0
  15. data/spec/dummy/app/controllers/concerns/.keep +0 -0
  16. data/spec/dummy/app/helpers/application_helper.rb +2 -0
  17. data/spec/dummy/app/mailers/.keep +0 -0
  18. data/spec/dummy/app/models/.keep +0 -0
  19. data/spec/dummy/app/models/concerns/.keep +0 -0
  20. data/spec/dummy/app/views/layouts/application.html.erb +14 -0
  21. data/spec/dummy/bin/bundle +3 -0
  22. data/spec/dummy/bin/rails +4 -0
  23. data/spec/dummy/bin/rake +4 -0
  24. data/spec/dummy/bin/setup +29 -0
  25. data/spec/dummy/config.ru +4 -0
  26. data/spec/dummy/config/application.rb +31 -0
  27. data/spec/dummy/config/boot.rb +5 -0
  28. data/spec/dummy/config/database.yml +25 -0
  29. data/spec/dummy/config/environment.rb +5 -0
  30. data/spec/dummy/config/environments/development.rb +41 -0
  31. data/spec/dummy/config/environments/production.rb +79 -0
  32. data/spec/dummy/config/environments/test.rb +42 -0
  33. data/spec/dummy/config/initializers/assets.rb +11 -0
  34. data/spec/dummy/config/initializers/backtrace_silencers.rb +7 -0
  35. data/spec/dummy/config/initializers/cookies_serializer.rb +3 -0
  36. data/spec/dummy/config/initializers/filter_parameter_logging.rb +4 -0
  37. data/spec/dummy/config/initializers/inflections.rb +16 -0
  38. data/spec/dummy/config/initializers/mime_types.rb +4 -0
  39. data/spec/dummy/config/initializers/session_store.rb +3 -0
  40. data/spec/dummy/config/initializers/wrap_parameters.rb +14 -0
  41. data/spec/dummy/config/locales/en.yml +23 -0
  42. data/spec/dummy/config/routes.rb +56 -0
  43. data/spec/dummy/config/secrets.yml +22 -0
  44. data/spec/dummy/db/test.sqlite3 +0 -0
  45. data/spec/dummy/lib/assets/.keep +0 -0
  46. data/spec/dummy/public/404.html +67 -0
  47. data/spec/dummy/public/422.html +67 -0
  48. data/spec/dummy/public/500.html +66 -0
  49. data/spec/dummy/public/favicon.ico +0 -0
  50. data/spec/features/assets_spec.rb +28 -0
  51. data/spec/spec_helper.rb +4 -0
  52. data/vendor/assets/javascripts/fullcalendar.js +79 -74
  53. data/vendor/assets/javascripts/fullcalendar/gcal.js +1 -1
  54. data/vendor/assets/stylesheets/fullcalendar.css +1 -1
  55. data/vendor/assets/stylesheets/fullcalendar.print.css +1 -1
  56. metadata +213 -3
@@ -0,0 +1,11 @@
1
+ # Be sure to restart your server when you modify this file.
2
+
3
+ # Version of your assets, change this if you want to expire all your assets.
4
+ Rails.application.config.assets.version = '1.0'
5
+
6
+ # Add additional assets to the asset load path
7
+ # Rails.application.config.assets.paths << Emoji.images_path
8
+
9
+ # Precompile additional assets.
10
+ # application.js, application.css, and all non-JS/CSS in app/assets folder are already added.
11
+ # Rails.application.config.assets.precompile += %w( search.js )
@@ -0,0 +1,7 @@
1
+ # Be sure to restart your server when you modify this file.
2
+
3
+ # You can add backtrace silencers for libraries that you're using but don't wish to see in your backtraces.
4
+ # Rails.backtrace_cleaner.add_silencer { |line| line =~ /my_noisy_library/ }
5
+
6
+ # You can also remove all the silencers if you're trying to debug a problem that might stem from framework code.
7
+ # Rails.backtrace_cleaner.remove_silencers!
@@ -0,0 +1,3 @@
1
+ # Be sure to restart your server when you modify this file.
2
+
3
+ Rails.application.config.action_dispatch.cookies_serializer = :json
@@ -0,0 +1,4 @@
1
+ # Be sure to restart your server when you modify this file.
2
+
3
+ # Configure sensitive parameters which will be filtered from the log file.
4
+ Rails.application.config.filter_parameters += [:password]
@@ -0,0 +1,16 @@
1
+ # Be sure to restart your server when you modify this file.
2
+
3
+ # Add new inflection rules using the following format. Inflections
4
+ # are locale specific, and you may define rules for as many different
5
+ # locales as you wish. All of these examples are active by default:
6
+ # ActiveSupport::Inflector.inflections(:en) do |inflect|
7
+ # inflect.plural /^(ox)$/i, '\1en'
8
+ # inflect.singular /^(ox)en/i, '\1'
9
+ # inflect.irregular 'person', 'people'
10
+ # inflect.uncountable %w( fish sheep )
11
+ # end
12
+
13
+ # These inflection rules are supported but not enabled by default:
14
+ # ActiveSupport::Inflector.inflections(:en) do |inflect|
15
+ # inflect.acronym 'RESTful'
16
+ # end
@@ -0,0 +1,4 @@
1
+ # Be sure to restart your server when you modify this file.
2
+
3
+ # Add new mime types for use in respond_to blocks:
4
+ # Mime::Type.register "text/richtext", :rtf
@@ -0,0 +1,3 @@
1
+ # Be sure to restart your server when you modify this file.
2
+
3
+ Rails.application.config.session_store :cookie_store, key: '_dummy_session'
@@ -0,0 +1,14 @@
1
+ # Be sure to restart your server when you modify this file.
2
+
3
+ # This file contains settings for ActionController::ParamsWrapper which
4
+ # is enabled by default.
5
+
6
+ # Enable parameter wrapping for JSON. You can disable this by setting :format to an empty array.
7
+ ActiveSupport.on_load(:action_controller) do
8
+ wrap_parameters format: [:json] if respond_to?(:wrap_parameters)
9
+ end
10
+
11
+ # To enable root element in JSON for ActiveRecord objects.
12
+ # ActiveSupport.on_load(:active_record) do
13
+ # self.include_root_in_json = true
14
+ # end
@@ -0,0 +1,23 @@
1
+ # Files in the config/locales directory are used for internationalization
2
+ # and are automatically loaded by Rails. If you want to use locales other
3
+ # than English, add the necessary files in this directory.
4
+ #
5
+ # To use the locales, use `I18n.t`:
6
+ #
7
+ # I18n.t 'hello'
8
+ #
9
+ # In views, this is aliased to just `t`:
10
+ #
11
+ # <%= t('hello') %>
12
+ #
13
+ # To use a different locale, set it with `I18n.locale`:
14
+ #
15
+ # I18n.locale = :es
16
+ #
17
+ # This would use the information in config/locales/es.yml.
18
+ #
19
+ # To learn more, please read the Rails Internationalization guide
20
+ # available at http://guides.rubyonrails.org/i18n.html.
21
+
22
+ en:
23
+ hello: "Hello world"
@@ -0,0 +1,56 @@
1
+ Rails.application.routes.draw do
2
+ # The priority is based upon order of creation: first created -> highest priority.
3
+ # See how all your routes lay out with "rake routes".
4
+
5
+ # You can have the root of your site routed with "root"
6
+ # root 'welcome#index'
7
+
8
+ # Example of regular route:
9
+ # get 'products/:id' => 'catalog#view'
10
+
11
+ # Example of named route that can be invoked with purchase_url(id: product.id)
12
+ # get 'products/:id/purchase' => 'catalog#purchase', as: :purchase
13
+
14
+ # Example resource route (maps HTTP verbs to controller actions automatically):
15
+ # resources :products
16
+
17
+ # Example resource route with options:
18
+ # resources :products do
19
+ # member do
20
+ # get 'short'
21
+ # post 'toggle'
22
+ # end
23
+ #
24
+ # collection do
25
+ # get 'sold'
26
+ # end
27
+ # end
28
+
29
+ # Example resource route with sub-resources:
30
+ # resources :products do
31
+ # resources :comments, :sales
32
+ # resource :seller
33
+ # end
34
+
35
+ # Example resource route with more complex sub-resources:
36
+ # resources :products do
37
+ # resources :comments
38
+ # resources :sales do
39
+ # get 'recent', on: :collection
40
+ # end
41
+ # end
42
+
43
+ # Example resource route with concerns:
44
+ # concern :toggleable do
45
+ # post 'toggle'
46
+ # end
47
+ # resources :posts, concerns: :toggleable
48
+ # resources :photos, concerns: :toggleable
49
+
50
+ # Example resource route within a namespace:
51
+ # namespace :admin do
52
+ # # Directs /admin/products/* to Admin::ProductsController
53
+ # # (app/controllers/admin/products_controller.rb)
54
+ # resources :products
55
+ # end
56
+ end
@@ -0,0 +1,22 @@
1
+ # Be sure to restart your server when you modify this file.
2
+
3
+ # Your secret key is used for verifying the integrity of signed cookies.
4
+ # If you change this key, all old signed cookies will become invalid!
5
+
6
+ # Make sure the secret is at least 30 characters and all random,
7
+ # no regular words or you'll be exposed to dictionary attacks.
8
+ # You can use `rake secret` to generate a secure secret key.
9
+
10
+ # Make sure the secrets in this file are kept private
11
+ # if you're sharing your code publicly.
12
+
13
+ development:
14
+ secret_key_base: 75230f5f92728ac7924e515cb33c78cbbb5cac06a012d30dae6cc94e5421c7a07ed8e57508d06ff179e7ac072392d158c73c1100835076ea67e1e8ff476c9780
15
+
16
+ test:
17
+ secret_key_base: 5698c3fa7049b25826c134a02a7f9962e06bb12ebef1873968ccef8caef3df3c366999dd0c1af692dd41bd3794639622642e4826ac364be2066c6fb2c98319f5
18
+
19
+ # Do not keep production secrets in the repository,
20
+ # instead read values from the environment.
21
+ production:
22
+ secret_key_base: <%= ENV["SECRET_KEY_BASE"] %>
File without changes
File without changes
@@ -0,0 +1,67 @@
1
+ <!DOCTYPE html>
2
+ <html>
3
+ <head>
4
+ <title>The page you were looking for doesn't exist (404)</title>
5
+ <meta name="viewport" content="width=device-width,initial-scale=1">
6
+ <style>
7
+ body {
8
+ background-color: #EFEFEF;
9
+ color: #2E2F30;
10
+ text-align: center;
11
+ font-family: arial, sans-serif;
12
+ margin: 0;
13
+ }
14
+
15
+ div.dialog {
16
+ width: 95%;
17
+ max-width: 33em;
18
+ margin: 4em auto 0;
19
+ }
20
+
21
+ div.dialog > div {
22
+ border: 1px solid #CCC;
23
+ border-right-color: #999;
24
+ border-left-color: #999;
25
+ border-bottom-color: #BBB;
26
+ border-top: #B00100 solid 4px;
27
+ border-top-left-radius: 9px;
28
+ border-top-right-radius: 9px;
29
+ background-color: white;
30
+ padding: 7px 12% 0;
31
+ box-shadow: 0 3px 8px rgba(50, 50, 50, 0.17);
32
+ }
33
+
34
+ h1 {
35
+ font-size: 100%;
36
+ color: #730E15;
37
+ line-height: 1.5em;
38
+ }
39
+
40
+ div.dialog > p {
41
+ margin: 0 0 1em;
42
+ padding: 1em;
43
+ background-color: #F7F7F7;
44
+ border: 1px solid #CCC;
45
+ border-right-color: #999;
46
+ border-left-color: #999;
47
+ border-bottom-color: #999;
48
+ border-bottom-left-radius: 4px;
49
+ border-bottom-right-radius: 4px;
50
+ border-top-color: #DADADA;
51
+ color: #666;
52
+ box-shadow: 0 3px 8px rgba(50, 50, 50, 0.17);
53
+ }
54
+ </style>
55
+ </head>
56
+
57
+ <body>
58
+ <!-- This file lives in public/404.html -->
59
+ <div class="dialog">
60
+ <div>
61
+ <h1>The page you were looking for doesn't exist.</h1>
62
+ <p>You may have mistyped the address or the page may have moved.</p>
63
+ </div>
64
+ <p>If you are the application owner check the logs for more information.</p>
65
+ </div>
66
+ </body>
67
+ </html>
@@ -0,0 +1,67 @@
1
+ <!DOCTYPE html>
2
+ <html>
3
+ <head>
4
+ <title>The change you wanted was rejected (422)</title>
5
+ <meta name="viewport" content="width=device-width,initial-scale=1">
6
+ <style>
7
+ body {
8
+ background-color: #EFEFEF;
9
+ color: #2E2F30;
10
+ text-align: center;
11
+ font-family: arial, sans-serif;
12
+ margin: 0;
13
+ }
14
+
15
+ div.dialog {
16
+ width: 95%;
17
+ max-width: 33em;
18
+ margin: 4em auto 0;
19
+ }
20
+
21
+ div.dialog > div {
22
+ border: 1px solid #CCC;
23
+ border-right-color: #999;
24
+ border-left-color: #999;
25
+ border-bottom-color: #BBB;
26
+ border-top: #B00100 solid 4px;
27
+ border-top-left-radius: 9px;
28
+ border-top-right-radius: 9px;
29
+ background-color: white;
30
+ padding: 7px 12% 0;
31
+ box-shadow: 0 3px 8px rgba(50, 50, 50, 0.17);
32
+ }
33
+
34
+ h1 {
35
+ font-size: 100%;
36
+ color: #730E15;
37
+ line-height: 1.5em;
38
+ }
39
+
40
+ div.dialog > p {
41
+ margin: 0 0 1em;
42
+ padding: 1em;
43
+ background-color: #F7F7F7;
44
+ border: 1px solid #CCC;
45
+ border-right-color: #999;
46
+ border-left-color: #999;
47
+ border-bottom-color: #999;
48
+ border-bottom-left-radius: 4px;
49
+ border-bottom-right-radius: 4px;
50
+ border-top-color: #DADADA;
51
+ color: #666;
52
+ box-shadow: 0 3px 8px rgba(50, 50, 50, 0.17);
53
+ }
54
+ </style>
55
+ </head>
56
+
57
+ <body>
58
+ <!-- This file lives in public/422.html -->
59
+ <div class="dialog">
60
+ <div>
61
+ <h1>The change you wanted was rejected.</h1>
62
+ <p>Maybe you tried to change something you didn't have access to.</p>
63
+ </div>
64
+ <p>If you are the application owner check the logs for more information.</p>
65
+ </div>
66
+ </body>
67
+ </html>
@@ -0,0 +1,66 @@
1
+ <!DOCTYPE html>
2
+ <html>
3
+ <head>
4
+ <title>We're sorry, but something went wrong (500)</title>
5
+ <meta name="viewport" content="width=device-width,initial-scale=1">
6
+ <style>
7
+ body {
8
+ background-color: #EFEFEF;
9
+ color: #2E2F30;
10
+ text-align: center;
11
+ font-family: arial, sans-serif;
12
+ margin: 0;
13
+ }
14
+
15
+ div.dialog {
16
+ width: 95%;
17
+ max-width: 33em;
18
+ margin: 4em auto 0;
19
+ }
20
+
21
+ div.dialog > div {
22
+ border: 1px solid #CCC;
23
+ border-right-color: #999;
24
+ border-left-color: #999;
25
+ border-bottom-color: #BBB;
26
+ border-top: #B00100 solid 4px;
27
+ border-top-left-radius: 9px;
28
+ border-top-right-radius: 9px;
29
+ background-color: white;
30
+ padding: 7px 12% 0;
31
+ box-shadow: 0 3px 8px rgba(50, 50, 50, 0.17);
32
+ }
33
+
34
+ h1 {
35
+ font-size: 100%;
36
+ color: #730E15;
37
+ line-height: 1.5em;
38
+ }
39
+
40
+ div.dialog > p {
41
+ margin: 0 0 1em;
42
+ padding: 1em;
43
+ background-color: #F7F7F7;
44
+ border: 1px solid #CCC;
45
+ border-right-color: #999;
46
+ border-left-color: #999;
47
+ border-bottom-color: #999;
48
+ border-bottom-left-radius: 4px;
49
+ border-bottom-right-radius: 4px;
50
+ border-top-color: #DADADA;
51
+ color: #666;
52
+ box-shadow: 0 3px 8px rgba(50, 50, 50, 0.17);
53
+ }
54
+ </style>
55
+ </head>
56
+
57
+ <body>
58
+ <!-- This file lives in public/500.html -->
59
+ <div class="dialog">
60
+ <div>
61
+ <h1>We're sorry, but something went wrong.</h1>
62
+ </div>
63
+ <p>If you are the application owner check the logs for more information.</p>
64
+ </div>
65
+ </body>
66
+ </html>
File without changes
@@ -0,0 +1,28 @@
1
+ require 'spec_helper'
2
+
3
+ feature 'Assets integration' do
4
+ it 'provides fullcalendar.js on the asset pipeline' do
5
+ visit '/assets/fullcalendar.js'
6
+ expect(page.status_code).to be 200
7
+ end
8
+
9
+ it 'provides fullcalendar/gcal.js on the asset pipeline' do
10
+ visit '/assets/fullcalendar/gcal.js'
11
+ expect(page.status_code).to be 200
12
+ end
13
+
14
+ it 'provides fullcalendar/lang/pl.js on the asset pipeline' do
15
+ visit '/assets/fullcalendar/lang/pl.js'
16
+ expect(page.status_code).to be 200
17
+ end
18
+
19
+ it 'provides fullcalendar.css on the asset pipeline' do
20
+ visit '/assets/fullcalendar.css'
21
+ expect(page.status_code).to be 200
22
+ end
23
+
24
+ it 'provides fullcalendar.print.css on the asset pipeline' do
25
+ visit '/assets/fullcalendar.print.css'
26
+ expect(page.status_code).to be 200
27
+ end
28
+ end
@@ -0,0 +1,4 @@
1
+ ENV['RAILS_ENV'] ||= 'test'
2
+
3
+ require File.expand_path("../dummy/config/environment.rb", __FILE__)
4
+ require 'rspec/rails'
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * FullCalendar v2.6.0
2
+ * FullCalendar v2.6.1
3
3
  * Docs & License: http://fullcalendar.io/
4
4
  * (c) 2015 Adam Shaw
5
5
  */
@@ -19,8 +19,8 @@
19
19
  ;;
20
20
 
21
21
  var FC = $.fullCalendar = {
22
- version: "2.6.0",
23
- internalApiVersion: 2
22
+ version: "2.6.1",
23
+ internalApiVersion: 3
24
24
  };
25
25
  var fcViews = FC.views = {};
26
26
 
@@ -2064,6 +2064,14 @@ var CoordCache = FC.CoordCache = Class.extend({
2064
2064
  },
2065
2065
 
2066
2066
 
2067
+ // When called, if coord caches aren't built, builds them
2068
+ ensureBuilt: function() {
2069
+ if (!this.origin) {
2070
+ this.build();
2071
+ }
2072
+ },
2073
+
2074
+
2067
2075
  // Compute and return what the elements' bounding rectangle is, from the user's perspective.
2068
2076
  // Right now, only returns a rectangle if constrained by an overflow:scroll element.
2069
2077
  queryBoundingRect: function() {
@@ -2116,6 +2124,8 @@ var CoordCache = FC.CoordCache = Class.extend({
2116
2124
  // Given a left offset (from document left), returns the index of the el that it horizontally intersects.
2117
2125
  // If no intersection is made, or outside of the boundingRect, returns undefined.
2118
2126
  getHorizontalIndex: function(leftOffset) {
2127
+ this.ensureBuilt();
2128
+
2119
2129
  var boundingRect = this.boundingRect;
2120
2130
  var lefts = this.lefts;
2121
2131
  var rights = this.rights;
@@ -2135,6 +2145,8 @@ var CoordCache = FC.CoordCache = Class.extend({
2135
2145
  // Given a top offset (from document top), returns the index of the el that it vertically intersects.
2136
2146
  // If no intersection is made, or outside of the boundingRect, returns undefined.
2137
2147
  getVerticalIndex: function(topOffset) {
2148
+ this.ensureBuilt();
2149
+
2138
2150
  var boundingRect = this.boundingRect;
2139
2151
  var tops = this.tops;
2140
2152
  var bottoms = this.bottoms;
@@ -2153,12 +2165,14 @@ var CoordCache = FC.CoordCache = Class.extend({
2153
2165
 
2154
2166
  // Gets the left offset (from document left) of the element at the given index
2155
2167
  getLeftOffset: function(leftIndex) {
2168
+ this.ensureBuilt();
2156
2169
  return this.lefts[leftIndex];
2157
2170
  },
2158
2171
 
2159
2172
 
2160
2173
  // Gets the left position (from offsetParent left) of the element at the given index
2161
2174
  getLeftPosition: function(leftIndex) {
2175
+ this.ensureBuilt();
2162
2176
  return this.lefts[leftIndex] - this.origin.left;
2163
2177
  },
2164
2178
 
@@ -2166,6 +2180,7 @@ var CoordCache = FC.CoordCache = Class.extend({
2166
2180
  // Gets the right offset (from document left) of the element at the given index.
2167
2181
  // This value is NOT relative to the document's right edge, like the CSS concept of "right" would be.
2168
2182
  getRightOffset: function(leftIndex) {
2183
+ this.ensureBuilt();
2169
2184
  return this.rights[leftIndex];
2170
2185
  },
2171
2186
 
@@ -2173,30 +2188,35 @@ var CoordCache = FC.CoordCache = Class.extend({
2173
2188
  // Gets the right position (from offsetParent left) of the element at the given index.
2174
2189
  // This value is NOT relative to the offsetParent's right edge, like the CSS concept of "right" would be.
2175
2190
  getRightPosition: function(leftIndex) {
2191
+ this.ensureBuilt();
2176
2192
  return this.rights[leftIndex] - this.origin.left;
2177
2193
  },
2178
2194
 
2179
2195
 
2180
2196
  // Gets the width of the element at the given index
2181
2197
  getWidth: function(leftIndex) {
2198
+ this.ensureBuilt();
2182
2199
  return this.rights[leftIndex] - this.lefts[leftIndex];
2183
2200
  },
2184
2201
 
2185
2202
 
2186
2203
  // Gets the top offset (from document top) of the element at the given index
2187
2204
  getTopOffset: function(topIndex) {
2205
+ this.ensureBuilt();
2188
2206
  return this.tops[topIndex];
2189
2207
  },
2190
2208
 
2191
2209
 
2192
2210
  // Gets the top position (from offsetParent top) of the element at the given position
2193
2211
  getTopPosition: function(topIndex) {
2212
+ this.ensureBuilt();
2194
2213
  return this.tops[topIndex] - this.origin.top;
2195
2214
  },
2196
2215
 
2197
2216
  // Gets the bottom offset (from the document top) of the element at the given index.
2198
2217
  // This value is NOT relative to the offsetParent's bottom edge, like the CSS concept of "bottom" would be.
2199
2218
  getBottomOffset: function(topIndex) {
2219
+ this.ensureBuilt();
2200
2220
  return this.bottoms[topIndex];
2201
2221
  },
2202
2222
 
@@ -2204,12 +2224,14 @@ var CoordCache = FC.CoordCache = Class.extend({
2204
2224
  // Gets the bottom position (from the offsetParent top) of the element at the given index.
2205
2225
  // This value is NOT relative to the offsetParent's bottom edge, like the CSS concept of "bottom" would be.
2206
2226
  getBottomPosition: function(topIndex) {
2227
+ this.ensureBuilt();
2207
2228
  return this.bottoms[topIndex] - this.origin.top;
2208
2229
  },
2209
2230
 
2210
2231
 
2211
2232
  // Gets the height of the element at the given index
2212
2233
  getHeight: function(topIndex) {
2234
+ this.ensureBuilt();
2213
2235
  return this.bottoms[topIndex] - this.tops[topIndex];
2214
2236
  }
2215
2237
 
@@ -3727,20 +3749,9 @@ Grid.mixin({
3727
3749
 
3728
3750
  // Generates a semicolon-separated CSS string to be used for the default rendering of a background event.
3729
3751
  // Called by the fill system.
3730
- // TODO: consolidate with getEventSkinCss?
3731
3752
  bgEventSegCss: function(seg) {
3732
- var view = this.view;
3733
- var event = seg.event;
3734
- var source = event.source || {};
3735
-
3736
3753
  return {
3737
- 'background-color':
3738
- event.backgroundColor ||
3739
- event.color ||
3740
- source.backgroundColor ||
3741
- source.color ||
3742
- view.opt('eventBackgroundColor') ||
3743
- view.opt('eventColor')
3754
+ 'background-color': this.getSegSkinCss(seg)['background-color']
3744
3755
  };
3745
3756
  },
3746
3757
 
@@ -4323,7 +4334,8 @@ Grid.mixin({
4323
4334
 
4324
4335
 
4325
4336
  // Utility for generating event skin-related CSS properties
4326
- getEventSkinCss: function(event) {
4337
+ getSegSkinCss: function(seg) {
4338
+ var event = seg.event;
4327
4339
  var view = this.view;
4328
4340
  var source = event.source || {};
4329
4341
  var eventColor = event.color;
@@ -5546,7 +5558,7 @@ DayGrid.mixin({
5546
5558
  var isResizableFromEnd = !disableResizing && event.allDay &&
5547
5559
  seg.isEnd && view.isEventResizableFromEnd(event);
5548
5560
  var classes = this.getSegClasses(seg, isDraggable, isResizableFromStart || isResizableFromEnd);
5549
- var skinCss = cssToStr(this.getEventSkinCss(event));
5561
+ var skinCss = cssToStr(this.getSegSkinCss(seg));
5550
5562
  var timeHtml = '';
5551
5563
  var timeText;
5552
5564
  var titleHtml;
@@ -6902,7 +6914,7 @@ TimeGrid.mixin({
6902
6914
  var isResizableFromStart = !disableResizing && seg.isStart && view.isEventResizableFromStart(event);
6903
6915
  var isResizableFromEnd = !disableResizing && seg.isEnd && view.isEventResizableFromEnd(event);
6904
6916
  var classes = this.getSegClasses(seg, isDraggable, isResizableFromStart || isResizableFromEnd);
6905
- var skinCss = cssToStr(this.getEventSkinCss(event));
6917
+ var skinCss = cssToStr(this.getSegSkinCss(seg));
6906
6918
  var timeText;
6907
6919
  var fullTimeText; // more verbose time text. for the print stylesheet
6908
6920
  var startTimeText; // just the start time text
@@ -7313,9 +7325,12 @@ var View = FC.View = Class.extend({
7313
7325
  // document handlers, bound to `this` object
7314
7326
  documentMousedownProxy: null, // TODO: doesn't work with touch
7315
7327
 
7316
- // for refresh timing of now indicator
7317
- nowIndicatorTimeoutID: null,
7318
- nowIndicatorIntervalID: null,
7328
+ // now indicator
7329
+ isNowIndicatorRendered: null,
7330
+ initialNowDate: null, // result first getNow call
7331
+ initialNowQueriedMs: null, // ms time the getNow was called
7332
+ nowIndicatorTimeoutID: null, // for refresh timing of now indicator
7333
+ nowIndicatorIntervalID: null, // "
7319
7334
 
7320
7335
 
7321
7336
  constructor: function(calendar, type, options, intervalDuration) {
@@ -7585,22 +7600,6 @@ var View = FC.View = Class.extend({
7585
7600
  },
7586
7601
 
7587
7602
 
7588
- // If the view has already been displayed, tears it down and displays it again.
7589
- // Will re-render the events if necessary, which display/clear DO NOT do.
7590
- // TODO: make behavior more consistent.
7591
- redisplay: function() {
7592
- if (this.isSkeletonRendered) {
7593
- var wasEventsRendered = this.isEventsRendered;
7594
- this.clearEvents(); // won't trigger handlers if events never rendered
7595
- this.clearView();
7596
- this.displayView();
7597
- if (wasEventsRendered) { // only render and trigger handlers if events previously rendered
7598
- this.displayEvents(this.calendar.getEventCache());
7599
- }
7600
- }
7601
- },
7602
-
7603
-
7604
7603
  // Displays the view's non-event content, such as date-related content or anything required by events.
7605
7604
  // Renders the view's non-content skeleton if necessary.
7606
7605
  // Can be asynchronous and return a promise.
@@ -7618,10 +7617,7 @@ var View = FC.View = Class.extend({
7618
7617
  this.renderDates();
7619
7618
  this.updateSize();
7620
7619
  this.renderBusinessHours(); // might need coordinates, so should go after updateSize()
7621
-
7622
- if (this.opt('nowIndicator')) {
7623
- this.startNowIndicator();
7624
- }
7620
+ this.startNowIndicator();
7625
7621
  },
7626
7622
 
7627
7623
 
@@ -7723,34 +7719,42 @@ var View = FC.View = Class.extend({
7723
7719
  // TODO: somehow do this for the current whole day's background too
7724
7720
  startNowIndicator: function() {
7725
7721
  var _this = this;
7726
- var unit = this.getNowIndicatorUnit();
7727
- var initialNow; // result first getNow call
7728
- var initialNowQueried; // ms time of then getNow was called
7722
+ var unit;
7723
+ var update;
7729
7724
  var delay; // ms wait value
7730
7725
 
7731
- // rerenders the now indicator, computing the new current time from the amount of time that has passed
7732
- // since the initial getNow call.
7733
- function update() {
7734
- _this.unrenderNowIndicator();
7735
- _this.renderNowIndicator(
7736
- initialNow.clone().add(new Date() - initialNowQueried) // add ms
7737
- );
7726
+ if (this.opt('nowIndicator')) {
7727
+ unit = this.getNowIndicatorUnit();
7728
+ if (unit) {
7729
+ update = proxy(this, 'updateNowIndicator'); // bind to `this`
7730
+
7731
+ this.initialNowDate = this.calendar.getNow();
7732
+ this.initialNowQueriedMs = +new Date();
7733
+ this.renderNowIndicator(this.initialNowDate);
7734
+ this.isNowIndicatorRendered = true;
7735
+
7736
+ // wait until the beginning of the next interval
7737
+ delay = this.initialNowDate.clone().startOf(unit).add(1, unit) - this.initialNowDate;
7738
+ this.nowIndicatorTimeoutID = setTimeout(function() {
7739
+ _this.nowIndicatorTimeoutID = null;
7740
+ update();
7741
+ delay = +moment.duration(1, unit);
7742
+ delay = Math.max(100, delay); // prevent too frequent
7743
+ _this.nowIndicatorIntervalID = setInterval(update, delay); // update every interval
7744
+ }, delay);
7745
+ }
7738
7746
  }
7747
+ },
7739
7748
 
7740
- if (unit) {
7741
- initialNow = this.calendar.getNow();
7742
- initialNowQueried = +new Date();
7743
- this.renderNowIndicator(initialNow);
7744
7749
 
7745
- // wait until the beginning of the next interval
7746
- delay = initialNow.clone().startOf(unit).add(1, unit) - initialNow;
7747
- this.nowIndicatorTimeoutID = setTimeout(function() {
7748
- this.nowIndicatorTimeoutID = null;
7749
- update();
7750
- delay = +moment.duration(1, unit);
7751
- delay = Math.max(100, delay); // prevent too frequent
7752
- this.nowIndicatorIntervalID = setInterval(update, delay); // update every interval
7753
- }, delay);
7750
+ // rerenders the now indicator, computing the new current time from the amount of time that has passed
7751
+ // since the initial getNow call.
7752
+ updateNowIndicator: function() {
7753
+ if (this.isNowIndicatorRendered) {
7754
+ this.unrenderNowIndicator();
7755
+ this.renderNowIndicator(
7756
+ this.initialNowDate.clone().add(new Date() - this.initialNowQueriedMs) // add ms
7757
+ );
7754
7758
  }
7755
7759
  },
7756
7760
 
@@ -7758,19 +7762,19 @@ var View = FC.View = Class.extend({
7758
7762
  // Immediately unrenders the view's current time indicator and stops any re-rendering timers.
7759
7763
  // Won't cause side effects if indicator isn't rendered.
7760
7764
  stopNowIndicator: function() {
7761
- var cleared = false;
7765
+ if (this.isNowIndicatorRendered) {
7762
7766
 
7763
- if (this.nowIndicatorTimeoutID) {
7764
- clearTimeout(this.nowIndicatorTimeoutID);
7765
- cleared = true;
7766
- }
7767
- if (this.nowIndicatorIntervalID) {
7768
- clearTimeout(this.nowIndicatorIntervalID);
7769
- cleared = true;
7770
- }
7767
+ if (this.nowIndicatorTimeoutID) {
7768
+ clearTimeout(this.nowIndicatorTimeoutID);
7769
+ this.nowIndicatorTimeoutID = null;
7770
+ }
7771
+ if (this.nowIndicatorIntervalID) {
7772
+ clearTimeout(this.nowIndicatorIntervalID);
7773
+ this.nowIndicatorIntervalID = null;
7774
+ }
7771
7775
 
7772
- if (cleared) { // is the indicator currently display?
7773
7776
  this.unrenderNowIndicator();
7777
+ this.isNowIndicatorRendered = false;
7774
7778
  }
7775
7779
  },
7776
7780
 
@@ -7808,6 +7812,7 @@ var View = FC.View = Class.extend({
7808
7812
 
7809
7813
  this.updateHeight(isResize);
7810
7814
  this.updateWidth(isResize);
7815
+ this.updateNowIndicator();
7811
7816
 
7812
7817
  if (isResize) {
7813
7818
  this.setScroll(scrollState);