fullcalendar.io-rails 2.7.1 → 2.7.2

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.
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