fullcalendar.io-rails 2.7.1 → 2.7.2

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 0c33ec62741e7363fcb31691aaafefda223e2315
4
- data.tar.gz: 22f290a4c467090bd7fcc39a7034b6185dab157c
3
+ metadata.gz: 08a75c29d203a527f51cb0be10289fb427a87740
4
+ data.tar.gz: 37828b19d049c4aeb391cdcc91d464ff16d54ce3
5
5
  SHA512:
6
- metadata.gz: a82a9988de2b852c1910ba849e6b51b0cb5443a67b72ab21d3ae085193a6e3534c8946050f35518c1d787519dad5133cd2dfb554f75592e16445be3b9145712a
7
- data.tar.gz: 2b24e7bf6af33173d1e28a1b1d3d40da192e5a65e4b2485016320b8fd39fcbe75c1d654f47cc357e6a0e30089898449a6790dbfad0cf9c444efdabc230f4aacb
6
+ metadata.gz: 2c0478819f07d3b5f64801eeae7f8ef8ab6b60be246e36a0d00c5977597a05cf6e6f8210a22340d75b9b926889d4ae80444f4012782bfd58d1e299058436dab0
7
+ data.tar.gz: bac737e1e3e9aa25872f0b00380cc421bd90e5634db23d381497c878e9837e3f83f28ecca42a72d7199019ce8214fd5c2a8e79b96d8e4251682920586e119545
@@ -1,5 +1,5 @@
1
1
  module Fullcalendario
2
2
  module Rails
3
- VERSION = "2.7.1"
3
+ VERSION = "2.7.2"
4
4
  end
5
5
  end
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * FullCalendar v2.7.1
2
+ * FullCalendar v2.7.2
3
3
  * Docs & License: http://fullcalendar.io/
4
4
  * (c) 2016 Adam Shaw
5
5
  */
@@ -19,15 +19,12 @@
19
19
  ;;
20
20
 
21
21
  var FC = $.fullCalendar = {
22
- version: "2.7.1",
22
+ version: "2.7.2",
23
23
  internalApiVersion: 3
24
24
  };
25
25
  var fcViews = FC.views = {};
26
26
 
27
27
 
28
- FC.isTouch = 'ontouchstart' in document;
29
-
30
-
31
28
  $.fn.fullCalendar = function(options) {
32
29
  var args = Array.prototype.slice.call(arguments, 1); // for a possible method call
33
30
  var res = this; // what this function will return (this jQuery object by default)
@@ -471,6 +468,30 @@ function preventDefault(ev) {
471
468
  }
472
469
 
473
470
 
471
+ // attach a handler to get called when ANY scroll action happens on the page.
472
+ // this was impossible to do with normal on/off because 'scroll' doesn't bubble.
473
+ // http://stackoverflow.com/a/32954565/96342
474
+ // returns `true` on success.
475
+ function bindAnyScroll(handler) {
476
+ if (window.addEventListener) {
477
+ window.addEventListener('scroll', handler, true); // useCapture=true
478
+ return true;
479
+ }
480
+ return false;
481
+ }
482
+
483
+
484
+ // undoes bindAnyScroll. must pass in the original function.
485
+ // returns `true` on success.
486
+ function unbindAnyScroll(handler) {
487
+ if (window.removeEventListener) {
488
+ window.removeEventListener('scroll', handler, true); // useCapture=true
489
+ return true;
490
+ }
491
+ return false;
492
+ }
493
+
494
+
474
495
  /* General Geometry Utils
475
496
  ----------------------------------------------------------------------------------------------------------------------*/
476
497
 
@@ -1966,6 +1987,35 @@ var ListenerMixin = FC.ListenerMixin = (function() {
1966
1987
  })();
1967
1988
  ;;
1968
1989
 
1990
+ // simple class for toggle a `isIgnoringMouse` flag on delay
1991
+ // initMouseIgnoring must first be called, with a millisecond delay setting.
1992
+ var MouseIgnorerMixin = {
1993
+
1994
+ isIgnoringMouse: false, // bool
1995
+ delayUnignoreMouse: null, // method
1996
+
1997
+
1998
+ initMouseIgnoring: function(delay) {
1999
+ this.delayUnignoreMouse = debounce(proxy(this, 'unignoreMouse'), delay || 1000);
2000
+ },
2001
+
2002
+
2003
+ // temporarily ignore mouse actions on segments
2004
+ tempIgnoreMouse: function() {
2005
+ this.isIgnoringMouse = true;
2006
+ this.delayUnignoreMouse();
2007
+ },
2008
+
2009
+
2010
+ // delayUnignoreMouse eventually calls this
2011
+ unignoreMouse: function() {
2012
+ this.isIgnoringMouse = false;
2013
+ }
2014
+
2015
+ };
2016
+
2017
+ ;;
2018
+
1969
2019
  /* A rectangular panel that is absolutely positioned over other content
1970
2020
  ------------------------------------------------------------------------------------------------------------------------
1971
2021
  Options:
@@ -2374,7 +2424,7 @@ var CoordCache = FC.CoordCache = Class.extend({
2374
2424
  ----------------------------------------------------------------------------------------------------------------------*/
2375
2425
  // TODO: use Emitter
2376
2426
 
2377
- var DragListener = FC.DragListener = Class.extend(ListenerMixin, {
2427
+ var DragListener = FC.DragListener = Class.extend(ListenerMixin, MouseIgnorerMixin, {
2378
2428
 
2379
2429
  options: null,
2380
2430
 
@@ -2386,6 +2436,8 @@ var DragListener = FC.DragListener = Class.extend(ListenerMixin, {
2386
2436
  originX: null,
2387
2437
  originY: null,
2388
2438
 
2439
+ // the wrapping element that scrolls, or MIGHT scroll if there's overflow.
2440
+ // TODO: do this for wrappers that have overflow:hidden as well.
2389
2441
  scrollEl: null,
2390
2442
 
2391
2443
  isInteracting: false,
@@ -2398,9 +2450,13 @@ var DragListener = FC.DragListener = Class.extend(ListenerMixin, {
2398
2450
  delayTimeoutId: null,
2399
2451
  minDistance: null,
2400
2452
 
2453
+ handleTouchScrollProxy: null, // calls handleTouchScroll, always bound to `this`
2454
+
2401
2455
 
2402
2456
  constructor: function(options) {
2403
2457
  this.options = options || {};
2458
+ this.handleTouchScrollProxy = proxy(this, 'handleTouchScroll');
2459
+ this.initMouseIgnoring(500);
2404
2460
  },
2405
2461
 
2406
2462
 
@@ -2412,7 +2468,10 @@ var DragListener = FC.DragListener = Class.extend(ListenerMixin, {
2412
2468
  var isTouch = getEvIsTouch(ev);
2413
2469
 
2414
2470
  if (ev.type === 'mousedown') {
2415
- if (!isPrimaryMouseButton(ev)) {
2471
+ if (this.isIgnoringMouse) {
2472
+ return;
2473
+ }
2474
+ else if (!isPrimaryMouseButton(ev)) {
2416
2475
  return;
2417
2476
  }
2418
2477
  else {
@@ -2454,7 +2513,7 @@ var DragListener = FC.DragListener = Class.extend(ListenerMixin, {
2454
2513
  },
2455
2514
 
2456
2515
 
2457
- endInteraction: function(ev) {
2516
+ endInteraction: function(ev, isCancelled) {
2458
2517
  if (this.isInteracting) {
2459
2518
  this.endDrag(ev);
2460
2519
 
@@ -2467,13 +2526,20 @@ var DragListener = FC.DragListener = Class.extend(ListenerMixin, {
2467
2526
  this.unbindHandlers();
2468
2527
 
2469
2528
  this.isInteracting = false;
2470
- this.handleInteractionEnd(ev);
2529
+ this.handleInteractionEnd(ev, isCancelled);
2530
+
2531
+ // a touchstart+touchend on the same element will result in the following addition simulated events:
2532
+ // mouseover + mouseout + click
2533
+ // let's ignore these bogus events
2534
+ if (this.isTouch) {
2535
+ this.tempIgnoreMouse();
2536
+ }
2471
2537
  }
2472
2538
  },
2473
2539
 
2474
2540
 
2475
- handleInteractionEnd: function(ev) {
2476
- this.trigger('interactionEnd', ev);
2541
+ handleInteractionEnd: function(ev, isCancelled) {
2542
+ this.trigger('interactionEnd', ev, isCancelled || false);
2477
2543
  },
2478
2544
 
2479
2545
 
@@ -2500,12 +2566,16 @@ var DragListener = FC.DragListener = Class.extend(ListenerMixin, {
2500
2566
  touchStartIgnores--; // and we don't want this to fire immediately, so ignore.
2501
2567
  }
2502
2568
  else {
2503
- _this.endInteraction(ev);
2569
+ _this.endInteraction(ev, true); // isCancelled=true
2504
2570
  }
2505
2571
  }
2506
2572
  });
2507
2573
 
2508
- if (this.scrollEl) {
2574
+ // listen to ALL scroll actions on the page
2575
+ if (
2576
+ !bindAnyScroll(this.handleTouchScrollProxy) && // hopefully this works and short-circuits the rest
2577
+ this.scrollEl // otherwise, attach a single handler to this
2578
+ ) {
2509
2579
  this.listenTo(this.scrollEl, 'scroll', this.handleTouchScroll);
2510
2580
  }
2511
2581
  }
@@ -2526,8 +2596,10 @@ var DragListener = FC.DragListener = Class.extend(ListenerMixin, {
2526
2596
  unbindHandlers: function() {
2527
2597
  this.stopListeningTo($(document));
2528
2598
 
2599
+ // unbind scroll listening
2600
+ unbindAnyScroll(this.handleTouchScrollProxy);
2529
2601
  if (this.scrollEl) {
2530
- this.stopListeningTo(this.scrollEl);
2602
+ this.stopListeningTo(this.scrollEl, 'scroll');
2531
2603
  }
2532
2604
  },
2533
2605
 
@@ -2660,7 +2732,7 @@ var DragListener = FC.DragListener = Class.extend(ListenerMixin, {
2660
2732
  // if the drag is being initiated by touch, but a scroll happens before
2661
2733
  // the drag-initiating delay is over, cancel the drag
2662
2734
  if (!this.isDragging) {
2663
- this.endInteraction(ev);
2735
+ this.endInteraction(ev, true); // isCancelled=true
2664
2736
  }
2665
2737
  },
2666
2738
 
@@ -3312,7 +3384,7 @@ var MouseFollower = Class.extend(ListenerMixin, {
3312
3384
  /* An abstract class comprised of a "grid" of areas that each represent a specific datetime
3313
3385
  ----------------------------------------------------------------------------------------------------------------------*/
3314
3386
 
3315
- var Grid = FC.Grid = Class.extend(ListenerMixin, {
3387
+ var Grid = FC.Grid = Class.extend(ListenerMixin, MouseIgnorerMixin, {
3316
3388
 
3317
3389
  view: null, // a View object
3318
3390
  isRTL: null, // shortcut to the view's isRTL option
@@ -3345,6 +3417,9 @@ var Grid = FC.Grid = Class.extend(ListenerMixin, {
3345
3417
  this.view = view;
3346
3418
  this.isRTL = view.opt('isRTL');
3347
3419
  this.elsByFill = {};
3420
+
3421
+ this.dayDragListener = this.buildDayDragListener();
3422
+ this.initMouseIgnoring();
3348
3423
  },
3349
3424
 
3350
3425
 
@@ -3480,12 +3555,8 @@ var Grid = FC.Grid = Class.extend(ListenerMixin, {
3480
3555
  this.el = el;
3481
3556
  preventSelection(el);
3482
3557
 
3483
- if (this.view.calendar.isTouch) {
3484
- this.bindDayHandler('touchstart', this.dayTouchStart);
3485
- }
3486
- else {
3487
- this.bindDayHandler('mousedown', this.dayMousedown);
3488
- }
3558
+ this.bindDayHandler('touchstart', this.dayTouchStart);
3559
+ this.bindDayHandler('mousedown', this.dayMousedown);
3489
3560
 
3490
3561
  // attach event-element-related handlers. in Grid.events
3491
3562
  // same garbage collection note as above.
@@ -3563,16 +3634,24 @@ var Grid = FC.Grid = Class.extend(ListenerMixin, {
3563
3634
 
3564
3635
  // Process a mousedown on an element that represents a day. For day clicking and selecting.
3565
3636
  dayMousedown: function(ev) {
3566
- this.clearDragListeners();
3567
- this.buildDayDragListener().startInteraction(ev, {
3568
- //distance: 5, // needs more work if we want dayClick to fire correctly
3569
- });
3637
+ if (!this.isIgnoringMouse) {
3638
+ this.dayDragListener.startInteraction(ev, {
3639
+ //distance: 5, // needs more work if we want dayClick to fire correctly
3640
+ });
3641
+ }
3570
3642
  },
3571
3643
 
3572
3644
 
3573
3645
  dayTouchStart: function(ev) {
3574
- this.clearDragListeners();
3575
- this.buildDayDragListener().startInteraction(ev, {
3646
+ var view = this.view;
3647
+
3648
+ // HACK to prevent a user's clickaway for unselecting a range or an event
3649
+ // from causing a dayClick.
3650
+ if (view.isSelected || view.selectedEvent) {
3651
+ this.tempIgnoreMouse();
3652
+ }
3653
+
3654
+ this.dayDragListener.startInteraction(ev, {
3576
3655
  delay: this.view.opt('longPressDelay')
3577
3656
  });
3578
3657
  },
@@ -3590,10 +3669,10 @@ var Grid = FC.Grid = Class.extend(ListenerMixin, {
3590
3669
  // this listener tracks a mousedown on a day element, and a subsequent drag.
3591
3670
  // if the drag ends on the same day, it is a 'dayClick'.
3592
3671
  // if 'selectable' is enabled, this listener also detects selections.
3593
- var dragListener = this.dayDragListener = new HitDragListener(this, {
3672
+ var dragListener = new HitDragListener(this, {
3594
3673
  scroll: view.opt('dragScroll'),
3595
3674
  interactionStart: function() {
3596
- dayClickHit = dragListener.origHit;
3675
+ dayClickHit = dragListener.origHit; // for dayClick, where no dragging happens
3597
3676
  },
3598
3677
  dragStart: function() {
3599
3678
  view.unselect(); // since we could be rendering a new selection, we want to clear any old one
@@ -3626,20 +3705,24 @@ var Grid = FC.Grid = Class.extend(ListenerMixin, {
3626
3705
  _this.unrenderSelection();
3627
3706
  enableCursor();
3628
3707
  },
3629
- interactionEnd: function(ev) {
3630
- if (dayClickHit) {
3631
- view.triggerDayClick(
3632
- _this.getHitSpan(dayClickHit),
3633
- _this.getHitEl(dayClickHit),
3634
- ev
3635
- );
3636
- }
3637
- if (selectionSpan) {
3638
- // the selection will already have been rendered. just report it
3639
- view.reportSelection(selectionSpan, ev);
3708
+ interactionEnd: function(ev, isCancelled) {
3709
+ if (!isCancelled) {
3710
+ if (
3711
+ dayClickHit &&
3712
+ !_this.isIgnoringMouse // see hack in dayTouchStart
3713
+ ) {
3714
+ view.triggerDayClick(
3715
+ _this.getHitSpan(dayClickHit),
3716
+ _this.getHitEl(dayClickHit),
3717
+ ev
3718
+ );
3719
+ }
3720
+ if (selectionSpan) {
3721
+ // the selection will already have been rendered. just report it
3722
+ view.reportSelection(selectionSpan, ev);
3723
+ }
3724
+ enableCursor();
3640
3725
  }
3641
- enableCursor();
3642
- _this.dayDragListener = null;
3643
3726
  }
3644
3727
  });
3645
3728
 
@@ -3651,9 +3734,8 @@ var Grid = FC.Grid = Class.extend(ListenerMixin, {
3651
3734
  // Useful for when public API methods that result in re-rendering are invoked during a drag.
3652
3735
  // Also useful for when touch devices misbehave and don't fire their touchend.
3653
3736
  clearDragListeners: function() {
3654
- if (this.dayDragListener) {
3655
- this.dayDragListener.endInteraction(); // will clear this.dayDragListener
3656
- }
3737
+ this.dayDragListener.endInteraction();
3738
+
3657
3739
  if (this.segDragListener) {
3658
3740
  this.segDragListener.endInteraction(); // will clear this.segDragListener
3659
3741
  }
@@ -4113,15 +4195,11 @@ Grid.mixin({
4113
4195
 
4114
4196
  // Attaches event-element-related handlers to the container element and leverage bubbling
4115
4197
  bindSegHandlers: function() {
4116
- if (this.view.calendar.isTouch) {
4117
- this.bindSegHandler('touchstart', this.handleSegTouchStart);
4118
- }
4119
- else {
4120
- this.bindSegHandler('mouseenter', this.handleSegMouseover);
4121
- this.bindSegHandler('mouseleave', this.handleSegMouseout);
4122
- this.bindSegHandler('mousedown', this.handleSegMousedown);
4123
- }
4124
-
4198
+ this.bindSegHandler('touchstart', this.handleSegTouchStart);
4199
+ this.bindSegHandler('touchend', this.handleSegTouchEnd);
4200
+ this.bindSegHandler('mouseenter', this.handleSegMouseover);
4201
+ this.bindSegHandler('mouseleave', this.handleSegMouseout);
4202
+ this.bindSegHandler('mousedown', this.handleSegMousedown);
4125
4203
  this.bindSegHandler('click', this.handleSegClick);
4126
4204
  },
4127
4205
 
@@ -4149,8 +4227,12 @@ Grid.mixin({
4149
4227
 
4150
4228
  // Updates internal state and triggers handlers for when an event element is moused over
4151
4229
  handleSegMouseover: function(seg, ev) {
4152
- if (!this.mousedOverSeg) {
4230
+ if (
4231
+ !this.isIgnoringMouse &&
4232
+ !this.mousedOverSeg
4233
+ ) {
4153
4234
  this.mousedOverSeg = seg;
4235
+ seg.el.addClass('fc-allow-mouse-resize');
4154
4236
  this.view.trigger('eventMouseover', seg.el[0], seg.event, ev);
4155
4237
  }
4156
4238
  },
@@ -4164,11 +4246,24 @@ Grid.mixin({
4164
4246
  if (this.mousedOverSeg) {
4165
4247
  seg = seg || this.mousedOverSeg; // if given no args, use the currently moused-over segment
4166
4248
  this.mousedOverSeg = null;
4249
+ seg.el.removeClass('fc-allow-mouse-resize');
4167
4250
  this.view.trigger('eventMouseout', seg.el[0], seg.event, ev);
4168
4251
  }
4169
4252
  },
4170
4253
 
4171
4254
 
4255
+ handleSegMousedown: function(seg, ev) {
4256
+ var isResizing = this.startSegResize(seg, ev, { distance: 5 });
4257
+
4258
+ if (!isResizing && this.view.isEventDraggable(seg.event)) {
4259
+ this.buildSegDragListener(seg)
4260
+ .startInteraction(ev, {
4261
+ distance: 5
4262
+ });
4263
+ }
4264
+ },
4265
+
4266
+
4172
4267
  handleSegTouchStart: function(seg, ev) {
4173
4268
  var view = this.view;
4174
4269
  var event = seg.event;
@@ -4184,37 +4279,25 @@ Grid.mixin({
4184
4279
  }
4185
4280
 
4186
4281
  if (!isResizing && (isDraggable || isResizable)) { // allowed to be selected?
4187
- this.clearDragListeners();
4188
4282
 
4189
4283
  dragListener = isDraggable ?
4190
4284
  this.buildSegDragListener(seg) :
4191
- new DragListener(); // seg isn't draggable, but let's use a generic DragListener
4192
- // simply for the delay, so it can be selected.
4285
+ this.buildSegSelectListener(seg); // seg isn't draggable, but still needs to be selected
4193
4286
 
4194
- dragListener._dragStart = function() { // TODO: better way of binding
4195
- // if not previously selected, will fire after a delay. then, select the event
4196
- if (!isSelected) {
4197
- view.selectEvent(event);
4198
- }
4199
- };
4200
-
4201
- dragListener.startInteraction(ev, {
4287
+ dragListener.startInteraction(ev, { // won't start if already started
4202
4288
  delay: isSelected ? 0 : this.view.opt('longPressDelay') // do delay if not already selected
4203
4289
  });
4204
4290
  }
4205
- },
4206
4291
 
4292
+ // a long tap simulates a mouseover. ignore this bogus mouseover.
4293
+ this.tempIgnoreMouse();
4294
+ },
4207
4295
 
4208
- handleSegMousedown: function(seg, ev) {
4209
- var isResizing = this.startSegResize(seg, ev, { distance: 5 });
4210
4296
 
4211
- if (!isResizing && this.view.isEventDraggable(seg.event)) {
4212
- this.clearDragListeners();
4213
- this.buildSegDragListener(seg)
4214
- .startInteraction(ev, {
4215
- distance: 5
4216
- });
4217
- }
4297
+ handleSegTouchEnd: function(seg, ev) {
4298
+ // touchstart+touchend = click, which simulates a mouseover.
4299
+ // ignore this bogus mouseover.
4300
+ this.tempIgnoreMouse();
4218
4301
  },
4219
4302
 
4220
4303
 
@@ -4223,7 +4306,6 @@ Grid.mixin({
4223
4306
  // `dragOptions` are optional.
4224
4307
  startSegResize: function(seg, ev, dragOptions) {
4225
4308
  if ($(ev.target).is('.fc-resizer')) {
4226
- this.clearDragListeners();
4227
4309
  this.buildSegResizeListener(seg, $(ev.target).is('.fc-start-resizer'))
4228
4310
  .startInteraction(ev, dragOptions);
4229
4311
  return true;
@@ -4239,6 +4321,7 @@ Grid.mixin({
4239
4321
 
4240
4322
  // Builds a listener that will track user-dragging on an event segment.
4241
4323
  // Generic enough to work with any type of Grid.
4324
+ // Has side effect of setting/unsetting `segDragListener`
4242
4325
  buildSegDragListener: function(seg) {
4243
4326
  var _this = this;
4244
4327
  var view = this.view;
@@ -4249,6 +4332,10 @@ Grid.mixin({
4249
4332
  var mouseFollower; // A clone of the original element that will move with the mouse
4250
4333
  var dropLocation; // zoned event date properties
4251
4334
 
4335
+ if (this.segDragListener) {
4336
+ return this.segDragListener;
4337
+ }
4338
+
4252
4339
  // Tracks mouse movement over the *view's* coordinate map. Allows dragging and dropping between subcomponents
4253
4340
  // of the view.
4254
4341
  var dragListener = this.segDragListener = new HitDragListener(view, {
@@ -4268,6 +4355,10 @@ Grid.mixin({
4268
4355
  mouseFollower.start(ev);
4269
4356
  },
4270
4357
  dragStart: function(ev) {
4358
+ if (dragListener.isTouch && !view.isEventSelected(event)) {
4359
+ // if not previously selected, will fire after a delay. then, select the event
4360
+ view.selectEvent(event);
4361
+ }
4271
4362
  isDragging = true;
4272
4363
  _this.handleSegMouseout(seg, ev); // ensure a mouseout on the manipulated event has been reported
4273
4364
  _this.segDragStart(seg, ev);
@@ -4339,6 +4430,34 @@ Grid.mixin({
4339
4430
  },
4340
4431
 
4341
4432
 
4433
+ // seg isn't draggable, but let's use a generic DragListener
4434
+ // simply for the delay, so it can be selected.
4435
+ // Has side effect of setting/unsetting `segDragListener`
4436
+ buildSegSelectListener: function(seg) {
4437
+ var _this = this;
4438
+ var view = this.view;
4439
+ var event = seg.event;
4440
+
4441
+ if (this.segDragListener) {
4442
+ return this.segDragListener;
4443
+ }
4444
+
4445
+ var dragListener = this.segDragListener = new DragListener({
4446
+ dragStart: function(ev) {
4447
+ if (dragListener.isTouch && !view.isEventSelected(event)) {
4448
+ // if not previously selected, will fire after a delay. then, select the event
4449
+ view.selectEvent(event);
4450
+ }
4451
+ },
4452
+ interactionEnd: function(ev) {
4453
+ _this.segDragListener = null;
4454
+ }
4455
+ });
4456
+
4457
+ return dragListener;
4458
+ },
4459
+
4460
+
4342
4461
  // Called before event segment dragging starts
4343
4462
  segDragStart: function(seg, ev) {
4344
4463
  this.isDraggingSeg = true;
@@ -8100,8 +8219,7 @@ var View = FC.View = Class.extend(EmitterMixin, ListenerMixin, {
8100
8219
  // Binds DOM handlers to elements that reside outside the view container, such as the document
8101
8220
  bindGlobalHandlers: function() {
8102
8221
  this.listenTo($(document), 'mousedown', this.handleDocumentMousedown);
8103
- this.listenTo($(document), 'touchstart', this.handleDocumentTouchStart);
8104
- this.listenTo($(document), 'touchend', this.handleDocumentTouchEnd);
8222
+ this.listenTo($(document), 'touchstart', this.processUnselect);
8105
8223
  },
8106
8224
 
8107
8225
 
@@ -8662,25 +8780,18 @@ var View = FC.View = Class.extend(EmitterMixin, ListenerMixin, {
8662
8780
  /* Mouse / Touch Unselecting (time range & event unselection)
8663
8781
  ------------------------------------------------------------------------------------------------------------------*/
8664
8782
  // TODO: move consistently to down/start or up/end?
8783
+ // TODO: don't kill previous selection if touch scrolling
8665
8784
 
8666
8785
 
8667
8786
  handleDocumentMousedown: function(ev) {
8668
- // touch devices fire simulated mouse events on a "click".
8669
- // only process mousedown if we know this isn't a touch device.
8670
- if (!this.calendar.isTouch && isPrimaryMouseButton(ev)) {
8671
- this.processRangeUnselect(ev);
8672
- this.processEventUnselect(ev);
8787
+ if (isPrimaryMouseButton(ev)) {
8788
+ this.processUnselect(ev);
8673
8789
  }
8674
8790
  },
8675
8791
 
8676
8792
 
8677
- handleDocumentTouchStart: function(ev) {
8793
+ processUnselect: function(ev) {
8678
8794
  this.processRangeUnselect(ev);
8679
- },
8680
-
8681
-
8682
- handleDocumentTouchEnd: function(ev) {
8683
- // TODO: don't do this if because of touch-scrolling
8684
8795
  this.processEventUnselect(ev);
8685
8796
  },
8686
8797
 
@@ -8953,7 +9064,6 @@ var Calendar = FC.Calendar = Class.extend({
8953
9064
  view: null, // current View object
8954
9065
  header: null,
8955
9066
  loadingLevel: 0, // number of simultaneous loading tasks
8956
- isTouch: false,
8957
9067
 
8958
9068
 
8959
9069
  // a lot of this class' OOP logic is scoped within this constructor function,
@@ -9000,10 +9110,6 @@ var Calendar = FC.Calendar = Class.extend({
9000
9110
  ]);
9001
9111
  populateInstanceComputableOptions(this.options);
9002
9112
 
9003
- this.isTouch = this.options.isTouch != null ?
9004
- this.options.isTouch :
9005
- FC.isTouch;
9006
-
9007
9113
  this.viewSpecCache = {}; // somewhat unrelated
9008
9114
  },
9009
9115
 
@@ -9460,10 +9566,6 @@ function Calendar_constructor(element, overrides) {
9460
9566
  tm = options.theme ? 'ui' : 'fc';
9461
9567
  element.addClass('fc');
9462
9568
 
9463
- element.addClass(
9464
- t.isTouch ? 'fc-touch' : 'fc-cursor'
9465
- );
9466
-
9467
9569
  if (options.isRTL) {
9468
9570
  element.addClass('fc-rtl');
9469
9571
  }
@@ -9506,7 +9608,7 @@ function Calendar_constructor(element, overrides) {
9506
9608
 
9507
9609
  header.removeElement();
9508
9610
  content.remove();
9509
- element.removeClass('fc fc-touch fc-cursor fc-ltr fc-rtl fc-unthemed ui-widget');
9611
+ element.removeClass('fc fc-ltr fc-rtl fc-unthemed ui-widget');
9510
9612
 
9511
9613
  if (windowResizeProxy) {
9512
9614
  $(window).unbind('resize', windowResizeProxy);
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * FullCalendar v2.7.1 Google Calendar Plugin
2
+ * FullCalendar v2.7.2 Google Calendar Plugin
3
3
  * Docs & License: http://fullcalendar.io/
4
4
  * (c) 2016 Adam Shaw
5
5
  */
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * FullCalendar v2.7.1 Stylesheet
2
+ * FullCalendar v2.7.2 Stylesheet
3
3
  * Docs & License: http://fullcalendar.io/
4
4
  * (c) 2016 Adam Shaw
5
5
  */
@@ -551,24 +551,19 @@ temporary rendered events).
551
551
 
552
552
  /* resizer (touch devices) */
553
553
 
554
- .fc-touch .fc-event .fc-resizer {
555
- display: none; /* only show when selected */
554
+ .fc-event .fc-resizer {
555
+ display: none;
556
556
  }
557
557
 
558
- .fc-touch .fc-event.fc-selected .fc-resizer {
558
+ .fc-event.fc-allow-mouse-resize .fc-resizer,
559
+ .fc-event.fc-selected .fc-resizer {
560
+ /* only show when hovering or selected (with touch) */
559
561
  display: block;
560
562
  }
561
563
 
564
+ /* hit area */
562
565
 
563
- /* Hit Area (for events and expander)
564
- --------------------------------------------------------------------------------------------------*/
565
-
566
- .fc-expander { /* fc-event is already position:relative */
567
- position: relative;
568
- }
569
-
570
- .fc-touch .fc-expander:before,
571
- .fc-touch .fc-event .fc-resizer:before {
566
+ .fc-event.fc-selected .fc-resizer:before {
572
567
  /* 40x40 touch area */
573
568
  content: "";
574
569
  position: absolute;
@@ -645,9 +640,9 @@ temporary rendered events).
645
640
  right: -1px; /* overcome border */
646
641
  }
647
642
 
648
- /* resizer (cursor devices) */
643
+ /* resizer (mouse devices) */
649
644
 
650
- .fc-cursor .fc-h-event .fc-resizer {
645
+ .fc-h-event.fc-allow-mouse-resize .fc-resizer {
651
646
  width: 7px;
652
647
  top: -1px; /* overcome top border */
653
648
  bottom: -1px; /* overcome bottom border */
@@ -655,7 +650,7 @@ temporary rendered events).
655
650
 
656
651
  /* resizer (touch devices) */
657
652
 
658
- .fc-touch .fc-h-event .fc-resizer {
653
+ .fc-h-event.fc-selected .fc-resizer {
659
654
  /* 8x8 little dot */
660
655
  border-radius: 4px;
661
656
  border-width: 1px;
@@ -670,14 +665,14 @@ temporary rendered events).
670
665
  }
671
666
 
672
667
  /* left resizer */
673
- .fc-touch.fc-ltr .fc-h-event .fc-start-resizer,
674
- .fc-touch.fc-rtl .fc-h-event .fc-end-resizer {
668
+ .fc-ltr .fc-h-event.fc-selected .fc-start-resizer,
669
+ .fc-rtl .fc-h-event.fc-selected .fc-end-resizer {
675
670
  margin-left: -4px; /* centers the 8x8 dot on the left edge */
676
671
  }
677
672
 
678
673
  /* right resizer */
679
- .fc-touch.fc-ltr .fc-h-event .fc-end-resizer,
680
- .fc-touch.fc-rtl .fc-h-event .fc-start-resizer {
674
+ .fc-ltr .fc-h-event.fc-selected .fc-end-resizer,
675
+ .fc-rtl .fc-h-event.fc-selected .fc-start-resizer {
681
676
  margin-right: -4px; /* centers the 8x8 dot on the right edge */
682
677
  }
683
678
 
@@ -720,14 +715,14 @@ be a descendant of the grid when it is being dragged.
720
715
  /* resizer (cursor devices) */
721
716
 
722
717
  /* left resizer */
723
- .fc-cursor.fc-ltr .fc-day-grid-event .fc-start-resizer,
724
- .fc-cursor.fc-rtl .fc-day-grid-event .fc-end-resizer {
718
+ .fc-ltr .fc-day-grid-event.fc-allow-mouse-resize .fc-start-resizer,
719
+ .fc-rtl .fc-day-grid-event.fc-allow-mouse-resize .fc-end-resizer {
725
720
  margin-left: -2px; /* to the day cell's edge */
726
721
  }
727
722
 
728
723
  /* right resizer */
729
- .fc-cursor.fc-ltr .fc-day-grid-event .fc-end-resizer,
730
- .fc-cursor.fc-rtl .fc-day-grid-event .fc-start-resizer {
724
+ .fc-ltr .fc-day-grid-event.fc-allow-mouse-resize .fc-end-resizer,
725
+ .fc-rtl .fc-day-grid-event.fc-allow-mouse-resize .fc-start-resizer {
731
726
  margin-right: -2px; /* to the day cell's edge */
732
727
  }
733
728
 
@@ -1197,7 +1192,7 @@ be a descendant of the grid when it is being dragged.
1197
1192
 
1198
1193
  /* resizer (cursor device) */
1199
1194
 
1200
- .fc-cursor .fc-time-grid-event .fc-resizer {
1195
+ .fc-time-grid-event.fc-allow-mouse-resize .fc-resizer {
1201
1196
  left: 0;
1202
1197
  right: 0;
1203
1198
  bottom: 0;
@@ -1210,13 +1205,13 @@ be a descendant of the grid when it is being dragged.
1210
1205
  cursor: s-resize;
1211
1206
  }
1212
1207
 
1213
- .fc-cursor .fc-time-grid-event .fc-resizer:after {
1208
+ .fc-time-grid-event.fc-allow-mouse-resize .fc-resizer:after {
1214
1209
  content: "=";
1215
1210
  }
1216
1211
 
1217
1212
  /* resizer (touch device) */
1218
1213
 
1219
- .fc-touch .fc-time-grid-event .fc-resizer {
1214
+ .fc-time-grid-event.fc-selected .fc-resizer {
1220
1215
  /* 10x10 dot */
1221
1216
  border-radius: 5px;
1222
1217
  border-width: 1px;
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * FullCalendar v2.7.1 Print Stylesheet
2
+ * FullCalendar v2.7.2 Print Stylesheet
3
3
  * Docs & License: http://fullcalendar.io/
4
4
  * (c) 2016 Adam Shaw
5
5
  */
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: fullcalendar.io-rails
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.7.1
4
+ version: 2.7.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - dbackowski
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2016-05-06 00:00:00.000000000 Z
11
+ date: 2016-05-20 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: jquery-rails
@@ -199,34 +199,63 @@ files:
199
199
  - spec/dummy/tmp/cache/assets/sprockets/v3.0/1z/1zrToN9dimlnr4_kkdSJaL1-bVHicMTTNrygrZbiKmE.cache
200
200
  - spec/dummy/tmp/cache/assets/sprockets/v3.0/2v/2v_enXedOXrk8P_wrCDrUgQBIv8vNep_8WXDcPpOAPk.cache
201
201
  - spec/dummy/tmp/cache/assets/sprockets/v3.0/3F/3FwWB3dso0BiDgmo2rJzOmvMIR9ZsrWRwUOMCoWiczg.cache
202
+ - spec/dummy/tmp/cache/assets/sprockets/v3.0/3W/3WbiO2opoGMt4smgz4ErMgiOFlZmYHXHZbq32_eXrtI.cache
202
203
  - spec/dummy/tmp/cache/assets/sprockets/v3.0/4v/4v74yXsoUNW6CAlmFbD2cqJk2BF_Iik0VWsa0h7Asg4.cache
203
204
  - spec/dummy/tmp/cache/assets/sprockets/v3.0/5P/5PYCfeahBKl0iSuwOCidlYsY453rmAPP0ZNNcF67tqQ.cache
204
205
  - spec/dummy/tmp/cache/assets/sprockets/v3.0/8M/8M1wIdL8evq90VzC-9RI5WSBnPSBA7qcqm-w3Wc5zQk.cache
206
+ - spec/dummy/tmp/cache/assets/sprockets/v3.0/8u/8uJrh-_1h6lrtAE5HZXCchMlGi-eOYO0SH_8WVJZoPQ.cache
205
207
  - spec/dummy/tmp/cache/assets/sprockets/v3.0/Bb/BbaJr2dSDQ-CoLaPJjh5WAi0189AJulGNC4lzLzVqkU.cache
208
+ - spec/dummy/tmp/cache/assets/sprockets/v3.0/Fz/FzdbPGtKVpZ6nDkCriaiHgtArNZYx1ve40vYH158oRA.cache
206
209
  - spec/dummy/tmp/cache/assets/sprockets/v3.0/G_/G_eBie5yKayIsXqQ2t82QYclCtPlk8e0C-Ypy3XrWNE.cache
210
+ - spec/dummy/tmp/cache/assets/sprockets/v3.0/H_/H_AMg2V0XStjP--4CexdXop4Rl3AiH8h4F3l-5i9CT4.cache
211
+ - spec/dummy/tmp/cache/assets/sprockets/v3.0/Il/Il1-ZHURKrBas9WU2p1_KKDGRvtj8sQNdB7mn1rog0c.cache
207
212
  - spec/dummy/tmp/cache/assets/sprockets/v3.0/Ip/IpbN3-B8GDUhWNahkeuBlIwntRm5Fh8Qi0lR6NKGHsQ.cache
208
213
  - spec/dummy/tmp/cache/assets/sprockets/v3.0/LG/LGLCJcDHu0oVE5-mPjAFByMRf17dScWmYXaA1YpjXlk.cache
209
214
  - spec/dummy/tmp/cache/assets/sprockets/v3.0/LX/LX4btAhr-I8jRXhkKHzUc8Faqgbn3ys0o-D0oH6RNF4.cache
215
+ - spec/dummy/tmp/cache/assets/sprockets/v3.0/Mn/MnSdFKH9CP9eCumnvcwL9GWVXpSGfgQ7YGfZm5OJXEg.cache
216
+ - spec/dummy/tmp/cache/assets/sprockets/v3.0/Mo/MouVQPQhx90B7DGl-_xgHJifHwIKkM1LeSml6LgtgZ8.cache
217
+ - spec/dummy/tmp/cache/assets/sprockets/v3.0/O9/O9kviXg4hfnmcC54J0MRPgrAxRWKhnArPSXStaFeI30.cache
218
+ - spec/dummy/tmp/cache/assets/sprockets/v3.0/Ou/OuRZHGf3ALp9XI4jfBOsIKsWVXndtRCtLUtwttuBnn8.cache
219
+ - spec/dummy/tmp/cache/assets/sprockets/v3.0/PD/PD2ZRbVk4maNW8CBg9qVygVgQNiMgV0GZmF5kFWJSxk.cache
210
220
  - spec/dummy/tmp/cache/assets/sprockets/v3.0/PR/PRWglrXMxT3PuZ58zeNxSkFWaHzwxQVjccshc8XgGAk.cache
211
221
  - spec/dummy/tmp/cache/assets/sprockets/v3.0/Pb/PbAKo6a2uKJlGVrfzUz0IlxW9_OK0UAbTFZ4c-ebTfM.cache
212
222
  - spec/dummy/tmp/cache/assets/sprockets/v3.0/Py/PyLoN42JfBw2PAJQZv3EM_p0_zrlHUSZndlW8_9Sg-s.cache
213
223
  - spec/dummy/tmp/cache/assets/sprockets/v3.0/Qs/Qs_rijpiJFWJE4uEHuPBC1xfRqhkIrV0hMo8zDMGqTI.cache
214
224
  - spec/dummy/tmp/cache/assets/sprockets/v3.0/RR/RRmYgXTQIf1QHewBaH8pACfSf3MJWSvj53F68VKeV1Q.cache
225
+ - spec/dummy/tmp/cache/assets/sprockets/v3.0/Ro/RoiPZLDHochxcheNmbSflLdiYxeeeB0udVfH90fZMoY.cache
226
+ - spec/dummy/tmp/cache/assets/sprockets/v3.0/Sz/Sz63PYjJ5GHyNpOgNmSivcjRrZvTOmKgqQUsVPZaoxw.cache
227
+ - spec/dummy/tmp/cache/assets/sprockets/v3.0/VO/VOwlPpsIlEdmiC7yzKRMfZpuG8kmaIKhqvONJvinJL0.cache
215
228
  - spec/dummy/tmp/cache/assets/sprockets/v3.0/W6/W66CRiH8240LjHOrl-iP_PDAWagFYeHve-h7zmvogFY.cache
229
+ - spec/dummy/tmp/cache/assets/sprockets/v3.0/XI/XIB5kXcDIOqve-1dCw9NIeC2sTraclA8MZNWH-Eg-Gc.cache
230
+ - spec/dummy/tmp/cache/assets/sprockets/v3.0/Yw/YwRQST2FfmjmkqBLEM28FNWkAL6PoXPsHrPFgiEdu2Q.cache
231
+ - spec/dummy/tmp/cache/assets/sprockets/v3.0/Zy/Zy-fKbxo3HN5HVfV-NBmL6_YaD7p2XsAjHVOl80NSQA.cache
232
+ - spec/dummy/tmp/cache/assets/sprockets/v3.0/_h/_hYQrEbEMuil6MJp_KL2NcquW52dYHbDcwi3nu-w_VQ.cache
233
+ - spec/dummy/tmp/cache/assets/sprockets/v3.0/_n/_nN6c-BQXZ3AWLGpWMoCfVwF9HxNZP8mie_je7mQFxc.cache
216
234
  - spec/dummy/tmp/cache/assets/sprockets/v3.0/ab/abLztZ6RIpy8ik3QuEnFS7pEaWu_8_d2Q_dUNAvZrlY.cache
235
+ - spec/dummy/tmp/cache/assets/sprockets/v3.0/c6/c6-OeCLASq51m3hakyLc_K0gBEz9shanluuN3Q0o0Pc.cache
217
236
  - spec/dummy/tmp/cache/assets/sprockets/v3.0/cw/cwj7NsjtnwbSAyGolIZE4rjV7_MB071J3J9oUWmfJUA.cache
218
237
  - spec/dummy/tmp/cache/assets/sprockets/v3.0/dL/dLsumIPJ1BortrKmtkZhkTLRQzKjIt7rvdT7wVKQEw8.cache
238
+ - spec/dummy/tmp/cache/assets/sprockets/v3.0/dY/dYXBxXudeAWyE96PzziKRH1EojVkAcdud7xSTHCzV18.cache
219
239
  - spec/dummy/tmp/cache/assets/sprockets/v3.0/fQ/fQF4Nb2ST_kdJsW1xEb26JjDtN0M2L6MpgaJcwzKKjM.cache
240
+ - spec/dummy/tmp/cache/assets/sprockets/v3.0/fo/fode1W4tMDtFpZe5FeINHtwaGES8oc1bVkUyVE5hsE0.cache
241
+ - spec/dummy/tmp/cache/assets/sprockets/v3.0/gP/gPqmECuss-A-RLqP9madF_pKFWHZMwZwmiHDV5Ewr-E.cache
220
242
  - spec/dummy/tmp/cache/assets/sprockets/v3.0/gT/gTvrFJh7Q5YvlX82v262_fyF5eenvG41sbxZ7MwqzMo.cache
221
243
  - spec/dummy/tmp/cache/assets/sprockets/v3.0/gZ/gZSBHrt-mcVTM9d04uNDtPaoYzDMdcDekcn8gs4s1gs.cache
222
244
  - spec/dummy/tmp/cache/assets/sprockets/v3.0/h8/h8vODE9RP0gop3pyz7IptAaJ6IV8k3HJtsEBCavNdzs.cache
245
+ - spec/dummy/tmp/cache/assets/sprockets/v3.0/iD/iDcTlKrrMYW3VupDw4ZcdL3NoDaCS2JiuR7vyOgtiqI.cache
223
246
  - spec/dummy/tmp/cache/assets/sprockets/v3.0/lE/lEcIbUanrpnsXYY0JbuW2Py7GzFX32ZEINj8uT9TTXk.cache
224
247
  - spec/dummy/tmp/cache/assets/sprockets/v3.0/lR/lR5vlgxKHWKnxT-F_nmvBQgz4Sjphq8sMQPauO3VkCQ.cache
225
248
  - spec/dummy/tmp/cache/assets/sprockets/v3.0/m6/m6JlAtdEZ7WJ5YUPFDkb2aDjQmuN90hVNI5QRSbQOgU.cache
249
+ - spec/dummy/tmp/cache/assets/sprockets/v3.0/od/od1V62SeO78vztS37dh-CVvdiGW-MQxCsc117YltWwU.cache
250
+ - spec/dummy/tmp/cache/assets/sprockets/v3.0/r1/r1owugK9kIfLP5ZpsUBZ56ihX0DuIgmyeX4I41lApoY.cache
251
+ - spec/dummy/tmp/cache/assets/sprockets/v3.0/rN/rNXqW6x1bR11OVcs3nPGn0QWihc8p0XmzqRrp4oobTY.cache
226
252
  - spec/dummy/tmp/cache/assets/sprockets/v3.0/rP/rPV-6Lrf4GGkK48HiRlW9KH7JDu8OSOvbr5NoId5G_Q.cache
253
+ - spec/dummy/tmp/cache/assets/sprockets/v3.0/sA/sAwLZYrHoysBb4qQ2gi8BThpDTvtKcxVlcvKz1CgGAw.cache
227
254
  - spec/dummy/tmp/cache/assets/sprockets/v3.0/t1/t1LLf5xvHQaFFYEYGv4e0lW5m_B4wfMX8zjc6qJ2kx0.cache
228
255
  - spec/dummy/tmp/cache/assets/sprockets/v3.0/tO/tOxC1i0yU7Pv0qeh6_DIEtXGQGqCu8PcR3ncjUnKAU0.cache
229
256
  - spec/dummy/tmp/cache/assets/sprockets/v3.0/vK/vKmDWNjBPqpBw4W3ypKlJIbZi6I4pYXwRR5bMPrazXI.cache
257
+ - spec/dummy/tmp/cache/assets/sprockets/v3.0/wk/wkQHj4SqvRDNITiQxLPbntXY-TCW1crkQhN5BRMoGLk.cache
258
+ - spec/dummy/tmp/cache/assets/sprockets/v3.0/yF/yFmF8pySkf4pcqRNBs3J7MRa_iuiTV8g-GZOxbMcajE.cache
230
259
  - spec/dummy/tmp/cache/assets/sprockets/v3.0/z1/z1ychbk3GbeFb0PifITr8-CRFFt0Hry2CNDPUk-O08g.cache
231
260
  - spec/features/assets_spec.rb
232
261
  - spec/spec_helper.rb
@@ -355,35 +384,64 @@ test_files:
355
384
  - spec/dummy/tmp/cache/assets/sprockets/v3.0/5P/5PYCfeahBKl0iSuwOCidlYsY453rmAPP0ZNNcF67tqQ.cache
356
385
  - spec/dummy/tmp/cache/assets/sprockets/v3.0/dL/dLsumIPJ1BortrKmtkZhkTLRQzKjIt7rvdT7wVKQEw8.cache
357
386
  - spec/dummy/tmp/cache/assets/sprockets/v3.0/-T/-TF4g7ysiPxZNjb74I1D6AzI5XvgNMbr95XXvfHMHIo.cache
387
+ - spec/dummy/tmp/cache/assets/sprockets/v3.0/od/od1V62SeO78vztS37dh-CVvdiGW-MQxCsc117YltWwU.cache
388
+ - spec/dummy/tmp/cache/assets/sprockets/v3.0/sA/sAwLZYrHoysBb4qQ2gi8BThpDTvtKcxVlcvKz1CgGAw.cache
358
389
  - spec/dummy/tmp/cache/assets/sprockets/v3.0/vK/vKmDWNjBPqpBw4W3ypKlJIbZi6I4pYXwRR5bMPrazXI.cache
359
390
  - spec/dummy/tmp/cache/assets/sprockets/v3.0/ab/abLztZ6RIpy8ik3QuEnFS7pEaWu_8_d2Q_dUNAvZrlY.cache
360
391
  - spec/dummy/tmp/cache/assets/sprockets/v3.0/LX/LX4btAhr-I8jRXhkKHzUc8Faqgbn3ys0o-D0oH6RNF4.cache
392
+ - spec/dummy/tmp/cache/assets/sprockets/v3.0/Zy/Zy-fKbxo3HN5HVfV-NBmL6_YaD7p2XsAjHVOl80NSQA.cache
361
393
  - spec/dummy/tmp/cache/assets/sprockets/v3.0/Ip/IpbN3-B8GDUhWNahkeuBlIwntRm5Fh8Qi0lR6NKGHsQ.cache
362
394
  - spec/dummy/tmp/cache/assets/sprockets/v3.0/lR/lR5vlgxKHWKnxT-F_nmvBQgz4Sjphq8sMQPauO3VkCQ.cache
363
395
  - spec/dummy/tmp/cache/assets/sprockets/v3.0/LG/LGLCJcDHu0oVE5-mPjAFByMRf17dScWmYXaA1YpjXlk.cache
396
+ - spec/dummy/tmp/cache/assets/sprockets/v3.0/PD/PD2ZRbVk4maNW8CBg9qVygVgQNiMgV0GZmF5kFWJSxk.cache
397
+ - spec/dummy/tmp/cache/assets/sprockets/v3.0/r1/r1owugK9kIfLP5ZpsUBZ56ihX0DuIgmyeX4I41lApoY.cache
364
398
  - spec/dummy/tmp/cache/assets/sprockets/v3.0/0r/0rn-tU1eBUPgW0KozwYPjcPwoscBdQbePooRBwPnl5U.cache
399
+ - spec/dummy/tmp/cache/assets/sprockets/v3.0/Mn/MnSdFKH9CP9eCumnvcwL9GWVXpSGfgQ7YGfZm5OJXEg.cache
365
400
  - spec/dummy/tmp/cache/assets/sprockets/v3.0/cw/cwj7NsjtnwbSAyGolIZE4rjV7_MB071J3J9oUWmfJUA.cache
401
+ - spec/dummy/tmp/cache/assets/sprockets/v3.0/8u/8uJrh-_1h6lrtAE5HZXCchMlGi-eOYO0SH_8WVJZoPQ.cache
366
402
  - spec/dummy/tmp/cache/assets/sprockets/v3.0/fQ/fQF4Nb2ST_kdJsW1xEb26JjDtN0M2L6MpgaJcwzKKjM.cache
367
403
  - spec/dummy/tmp/cache/assets/sprockets/v3.0/8M/8M1wIdL8evq90VzC-9RI5WSBnPSBA7qcqm-w3Wc5zQk.cache
368
404
  - spec/dummy/tmp/cache/assets/sprockets/v3.0/gT/gTvrFJh7Q5YvlX82v262_fyF5eenvG41sbxZ7MwqzMo.cache
405
+ - spec/dummy/tmp/cache/assets/sprockets/v3.0/H_/H_AMg2V0XStjP--4CexdXop4Rl3AiH8h4F3l-5i9CT4.cache
406
+ - spec/dummy/tmp/cache/assets/sprockets/v3.0/XI/XIB5kXcDIOqve-1dCw9NIeC2sTraclA8MZNWH-Eg-Gc.cache
407
+ - spec/dummy/tmp/cache/assets/sprockets/v3.0/wk/wkQHj4SqvRDNITiQxLPbntXY-TCW1crkQhN5BRMoGLk.cache
369
408
  - spec/dummy/tmp/cache/assets/sprockets/v3.0/G_/G_eBie5yKayIsXqQ2t82QYclCtPlk8e0C-Ypy3XrWNE.cache
409
+ - spec/dummy/tmp/cache/assets/sprockets/v3.0/c6/c6-OeCLASq51m3hakyLc_K0gBEz9shanluuN3Q0o0Pc.cache
370
410
  - spec/dummy/tmp/cache/assets/sprockets/v3.0/2v/2v_enXedOXrk8P_wrCDrUgQBIv8vNep_8WXDcPpOAPk.cache
371
411
  - spec/dummy/tmp/cache/assets/sprockets/v3.0/RR/RRmYgXTQIf1QHewBaH8pACfSf3MJWSvj53F68VKeV1Q.cache
372
412
  - spec/dummy/tmp/cache/assets/sprockets/v3.0/rP/rPV-6Lrf4GGkK48HiRlW9KH7JDu8OSOvbr5NoId5G_Q.cache
373
413
  - spec/dummy/tmp/cache/assets/sprockets/v3.0/m6/m6JlAtdEZ7WJ5YUPFDkb2aDjQmuN90hVNI5QRSbQOgU.cache
414
+ - spec/dummy/tmp/cache/assets/sprockets/v3.0/Mo/MouVQPQhx90B7DGl-_xgHJifHwIKkM1LeSml6LgtgZ8.cache
415
+ - spec/dummy/tmp/cache/assets/sprockets/v3.0/iD/iDcTlKrrMYW3VupDw4ZcdL3NoDaCS2JiuR7vyOgtiqI.cache
416
+ - spec/dummy/tmp/cache/assets/sprockets/v3.0/rN/rNXqW6x1bR11OVcs3nPGn0QWihc8p0XmzqRrp4oobTY.cache
374
417
  - spec/dummy/tmp/cache/assets/sprockets/v3.0/h8/h8vODE9RP0gop3pyz7IptAaJ6IV8k3HJtsEBCavNdzs.cache
418
+ - spec/dummy/tmp/cache/assets/sprockets/v3.0/O9/O9kviXg4hfnmcC54J0MRPgrAxRWKhnArPSXStaFeI30.cache
375
419
  - spec/dummy/tmp/cache/assets/sprockets/v3.0/4v/4v74yXsoUNW6CAlmFbD2cqJk2BF_Iik0VWsa0h7Asg4.cache
376
420
  - spec/dummy/tmp/cache/assets/sprockets/v3.0/t1/t1LLf5xvHQaFFYEYGv4e0lW5m_B4wfMX8zjc6qJ2kx0.cache
421
+ - spec/dummy/tmp/cache/assets/sprockets/v3.0/3W/3WbiO2opoGMt4smgz4ErMgiOFlZmYHXHZbq32_eXrtI.cache
422
+ - spec/dummy/tmp/cache/assets/sprockets/v3.0/_n/_nN6c-BQXZ3AWLGpWMoCfVwF9HxNZP8mie_je7mQFxc.cache
423
+ - spec/dummy/tmp/cache/assets/sprockets/v3.0/VO/VOwlPpsIlEdmiC7yzKRMfZpuG8kmaIKhqvONJvinJL0.cache
424
+ - spec/dummy/tmp/cache/assets/sprockets/v3.0/Il/Il1-ZHURKrBas9WU2p1_KKDGRvtj8sQNdB7mn1rog0c.cache
377
425
  - spec/dummy/tmp/cache/assets/sprockets/v3.0/Pb/PbAKo6a2uKJlGVrfzUz0IlxW9_OK0UAbTFZ4c-ebTfM.cache
426
+ - spec/dummy/tmp/cache/assets/sprockets/v3.0/Yw/YwRQST2FfmjmkqBLEM28FNWkAL6PoXPsHrPFgiEdu2Q.cache
378
427
  - spec/dummy/tmp/cache/assets/sprockets/v3.0/W6/W66CRiH8240LjHOrl-iP_PDAWagFYeHve-h7zmvogFY.cache
428
+ - spec/dummy/tmp/cache/assets/sprockets/v3.0/Ro/RoiPZLDHochxcheNmbSflLdiYxeeeB0udVfH90fZMoY.cache
429
+ - spec/dummy/tmp/cache/assets/sprockets/v3.0/gP/gPqmECuss-A-RLqP9madF_pKFWHZMwZwmiHDV5Ewr-E.cache
379
430
  - spec/dummy/tmp/cache/assets/sprockets/v3.0/z1/z1ychbk3GbeFb0PifITr8-CRFFt0Hry2CNDPUk-O08g.cache
431
+ - spec/dummy/tmp/cache/assets/sprockets/v3.0/fo/fode1W4tMDtFpZe5FeINHtwaGES8oc1bVkUyVE5hsE0.cache
432
+ - spec/dummy/tmp/cache/assets/sprockets/v3.0/Sz/Sz63PYjJ5GHyNpOgNmSivcjRrZvTOmKgqQUsVPZaoxw.cache
380
433
  - spec/dummy/tmp/cache/assets/sprockets/v3.0/1j/1jBm32Lhwj7n0HxpBGOR2Z9eCn883XjM94yW_nhGo7s.cache
434
+ - spec/dummy/tmp/cache/assets/sprockets/v3.0/Ou/OuRZHGf3ALp9XI4jfBOsIKsWVXndtRCtLUtwttuBnn8.cache
381
435
  - spec/dummy/tmp/cache/assets/sprockets/v3.0/PR/PRWglrXMxT3PuZ58zeNxSkFWaHzwxQVjccshc8XgGAk.cache
436
+ - spec/dummy/tmp/cache/assets/sprockets/v3.0/yF/yFmF8pySkf4pcqRNBs3J7MRa_iuiTV8g-GZOxbMcajE.cache
382
437
  - spec/dummy/tmp/cache/assets/sprockets/v3.0/gZ/gZSBHrt-mcVTM9d04uNDtPaoYzDMdcDekcn8gs4s1gs.cache
383
438
  - spec/dummy/tmp/cache/assets/sprockets/v3.0/Py/PyLoN42JfBw2PAJQZv3EM_p0_zrlHUSZndlW8_9Sg-s.cache
384
439
  - spec/dummy/tmp/cache/assets/sprockets/v3.0/3F/3FwWB3dso0BiDgmo2rJzOmvMIR9ZsrWRwUOMCoWiczg.cache
385
440
  - spec/dummy/tmp/cache/assets/sprockets/v3.0/Bb/BbaJr2dSDQ-CoLaPJjh5WAi0189AJulGNC4lzLzVqkU.cache
441
+ - spec/dummy/tmp/cache/assets/sprockets/v3.0/Fz/FzdbPGtKVpZ6nDkCriaiHgtArNZYx1ve40vYH158oRA.cache
442
+ - spec/dummy/tmp/cache/assets/sprockets/v3.0/_h/_hYQrEbEMuil6MJp_KL2NcquW52dYHbDcwi3nu-w_VQ.cache
386
443
  - spec/dummy/tmp/cache/assets/sprockets/v3.0/tO/tOxC1i0yU7Pv0qeh6_DIEtXGQGqCu8PcR3ncjUnKAU0.cache
444
+ - spec/dummy/tmp/cache/assets/sprockets/v3.0/dY/dYXBxXudeAWyE96PzziKRH1EojVkAcdud7xSTHCzV18.cache
387
445
  - spec/dummy/config.ru
388
446
  - spec/dummy/db/test.sqlite3
389
447
  - spec/spec_helper.rb