fullcalendar.io-rails 2.9.0 → 2.9.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/fullcalendar.io/rails/version.rb +1 -1
- data/vendor/assets/javascripts/fullcalendar.js +245 -149
- data/vendor/assets/javascripts/fullcalendar/gcal.js +3 -3
- data/vendor/assets/javascripts/fullcalendar/lang-all.js +2 -2
- data/vendor/assets/javascripts/fullcalendar/lang/nn.js +1 -0
- data/vendor/assets/stylesheets/fullcalendar.css +3 -3
- data/vendor/assets/stylesheets/fullcalendar.print.css +3 -3
- metadata +61 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: c0bebf9a03f44e166f1bb2f582fcdefae588048d
|
4
|
+
data.tar.gz: 51203a4a908a30503e0b96986fbd2fb33e5b6d23
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: cee3cb8ea1fd78a1661ae39649aee060232fc87dd6b09fb671dc287e0a526761f128f2849a4028060e1c457978c94ac79fc9de348f399ad7af899cf242bec72b
|
7
|
+
data.tar.gz: 6fe447d37fcc65e6f1463982e668b1fb93ecb8bf405024e32d981a8c61582ff9884e19730ba407df51c63256bd9c83f80635a3a8637605d2041c9323d8a7f37d
|
@@ -1,7 +1,7 @@
|
|
1
1
|
/*!
|
2
|
-
*
|
3
|
-
* Docs & License:
|
4
|
-
* (c)
|
2
|
+
* <%= meta.title %> v<%= meta.version %>
|
3
|
+
* Docs & License: <%= meta.homepage %>
|
4
|
+
* (c) <%= meta.copyright %>
|
5
5
|
*/
|
6
6
|
|
7
7
|
(function(factory) {
|
@@ -19,8 +19,8 @@
|
|
19
19
|
;;
|
20
20
|
|
21
21
|
var FC = $.fullCalendar = {
|
22
|
-
version: "
|
23
|
-
internalApiVersion:
|
22
|
+
version: "<%= meta.version %>",
|
23
|
+
internalApiVersion: 5
|
24
24
|
};
|
25
25
|
var fcViews = FC.views = {};
|
26
26
|
|
@@ -2263,17 +2263,6 @@ var CoordCache = FC.CoordCache = Class.extend({
|
|
2263
2263
|
},
|
2264
2264
|
|
2265
2265
|
|
2266
|
-
// Compute and return what the elements' bounding rectangle is, from the user's perspective.
|
2267
|
-
// Right now, only returns a rectangle if constrained by an overflow:scroll element.
|
2268
|
-
queryBoundingRect: function() {
|
2269
|
-
var scrollParentEl = getScrollParent(this.els.eq(0));
|
2270
|
-
|
2271
|
-
if (!scrollParentEl.is(document)) {
|
2272
|
-
return getClientRect(scrollParentEl);
|
2273
|
-
}
|
2274
|
-
},
|
2275
|
-
|
2276
|
-
|
2277
2266
|
// Populates the left/right internal coordinate arrays
|
2278
2267
|
buildElHorizontals: function() {
|
2279
2268
|
var lefts = [];
|
@@ -2313,42 +2302,36 @@ var CoordCache = FC.CoordCache = Class.extend({
|
|
2313
2302
|
|
2314
2303
|
|
2315
2304
|
// Given a left offset (from document left), returns the index of the el that it horizontally intersects.
|
2316
|
-
// If no intersection is made,
|
2305
|
+
// If no intersection is made, returns undefined.
|
2317
2306
|
getHorizontalIndex: function(leftOffset) {
|
2318
2307
|
this.ensureBuilt();
|
2319
2308
|
|
2320
|
-
var boundingRect = this.boundingRect;
|
2321
2309
|
var lefts = this.lefts;
|
2322
2310
|
var rights = this.rights;
|
2323
2311
|
var len = lefts.length;
|
2324
2312
|
var i;
|
2325
2313
|
|
2326
|
-
|
2327
|
-
|
2328
|
-
|
2329
|
-
return i;
|
2330
|
-
}
|
2314
|
+
for (i = 0; i < len; i++) {
|
2315
|
+
if (leftOffset >= lefts[i] && leftOffset < rights[i]) {
|
2316
|
+
return i;
|
2331
2317
|
}
|
2332
2318
|
}
|
2333
2319
|
},
|
2334
2320
|
|
2335
2321
|
|
2336
2322
|
// Given a top offset (from document top), returns the index of the el that it vertically intersects.
|
2337
|
-
// If no intersection is made,
|
2323
|
+
// If no intersection is made, returns undefined.
|
2338
2324
|
getVerticalIndex: function(topOffset) {
|
2339
2325
|
this.ensureBuilt();
|
2340
2326
|
|
2341
|
-
var boundingRect = this.boundingRect;
|
2342
2327
|
var tops = this.tops;
|
2343
2328
|
var bottoms = this.bottoms;
|
2344
2329
|
var len = tops.length;
|
2345
2330
|
var i;
|
2346
2331
|
|
2347
|
-
|
2348
|
-
|
2349
|
-
|
2350
|
-
return i;
|
2351
|
-
}
|
2332
|
+
for (i = 0; i < len; i++) {
|
2333
|
+
if (topOffset >= tops[i] && topOffset < bottoms[i]) {
|
2334
|
+
return i;
|
2352
2335
|
}
|
2353
2336
|
}
|
2354
2337
|
},
|
@@ -2424,6 +2407,32 @@ var CoordCache = FC.CoordCache = Class.extend({
|
|
2424
2407
|
getHeight: function(topIndex) {
|
2425
2408
|
this.ensureBuilt();
|
2426
2409
|
return this.bottoms[topIndex] - this.tops[topIndex];
|
2410
|
+
},
|
2411
|
+
|
2412
|
+
|
2413
|
+
// Bounding Rect
|
2414
|
+
// TODO: decouple this from CoordCache
|
2415
|
+
|
2416
|
+
// Compute and return what the elements' bounding rectangle is, from the user's perspective.
|
2417
|
+
// Right now, only returns a rectangle if constrained by an overflow:scroll element.
|
2418
|
+
queryBoundingRect: function() {
|
2419
|
+
var scrollParentEl = getScrollParent(this.els.eq(0));
|
2420
|
+
|
2421
|
+
if (!scrollParentEl.is(document)) {
|
2422
|
+
return getClientRect(scrollParentEl);
|
2423
|
+
}
|
2424
|
+
},
|
2425
|
+
|
2426
|
+
isPointInBounds: function(leftOffset, topOffset) {
|
2427
|
+
return this.isLeftInBounds(leftOffset) && this.isTopInBounds(topOffset);
|
2428
|
+
},
|
2429
|
+
|
2430
|
+
isLeftInBounds: function(leftOffset) {
|
2431
|
+
return !this.boundingRect || (leftOffset >= this.boundingRect.left && leftOffset < this.boundingRect.right);
|
2432
|
+
},
|
2433
|
+
|
2434
|
+
isTopInBounds: function(topOffset) {
|
2435
|
+
return !this.boundingRect || (topOffset >= this.boundingRect.top && topOffset < this.boundingRect.bottom);
|
2427
2436
|
}
|
2428
2437
|
|
2429
2438
|
});
|
@@ -3259,11 +3268,11 @@ var MouseFollower = Class.extend(ListenerMixin, {
|
|
3259
3268
|
var _this = this;
|
3260
3269
|
var revertDuration = this.options.revertDuration;
|
3261
3270
|
|
3262
|
-
function complete() {
|
3263
|
-
|
3271
|
+
function complete() { // might be called by .animate(), which might change `this` context
|
3272
|
+
_this.isAnimating = false;
|
3264
3273
|
_this.removeElement();
|
3265
3274
|
|
3266
|
-
|
3275
|
+
_this.top0 = _this.left0 = null; // reset state for future updatePosition calls
|
3267
3276
|
|
3268
3277
|
if (callback) {
|
3269
3278
|
callback();
|
@@ -3583,8 +3592,7 @@ var Grid = FC.Grid = Class.extend(ListenerMixin, MouseIgnorerMixin, {
|
|
3583
3592
|
// jQuery will take care of unregistering them when removeElement gets called.
|
3584
3593
|
this.el.on(name, function(ev) {
|
3585
3594
|
if (
|
3586
|
-
!$(ev.target).is('.fc-event-container *, .fc-more')
|
3587
|
-
!$(ev.target).closest('.fc-popover').length // not on a popover (like the "more.." events one)
|
3595
|
+
!$(ev.target).is('.fc-event-container *, .fc-more') // not an an event element, or "more.." link
|
3588
3596
|
) {
|
3589
3597
|
return handler.call(_this, ev);
|
3590
3598
|
}
|
@@ -3683,6 +3691,7 @@ var Grid = FC.Grid = Class.extend(ListenerMixin, MouseIgnorerMixin, {
|
|
3683
3691
|
scroll: view.opt('dragScroll'),
|
3684
3692
|
interactionStart: function() {
|
3685
3693
|
dayClickHit = dragListener.origHit; // for dayClick, where no dragging happens
|
3694
|
+
selectionSpan = null;
|
3686
3695
|
},
|
3687
3696
|
dragStart: function() {
|
3688
3697
|
view.unselect(); // since we could be rendering a new selection, we want to clear any old one
|
@@ -3709,10 +3718,12 @@ var Grid = FC.Grid = Class.extend(ListenerMixin, MouseIgnorerMixin, {
|
|
3709
3718
|
}
|
3710
3719
|
}
|
3711
3720
|
},
|
3712
|
-
hitOut: function() {
|
3721
|
+
hitOut: function() { // called before mouse moves to a different hit OR moved out of all hits
|
3713
3722
|
dayClickHit = null;
|
3714
3723
|
selectionSpan = null;
|
3715
3724
|
_this.unrenderSelection();
|
3725
|
+
},
|
3726
|
+
hitDone: function() { // called after a hitOut OR before a dragEnd
|
3716
3727
|
enableCursor();
|
3717
3728
|
},
|
3718
3729
|
interactionEnd: function(ev, isCancelled) {
|
@@ -3731,7 +3742,6 @@ var Grid = FC.Grid = Class.extend(ListenerMixin, MouseIgnorerMixin, {
|
|
3731
3742
|
// the selection will already have been rendered. just report it
|
3732
3743
|
view.reportSelection(selectionSpan, ev);
|
3733
3744
|
}
|
3734
|
-
enableCursor();
|
3735
3745
|
}
|
3736
3746
|
}
|
3737
3747
|
});
|
@@ -4172,7 +4182,7 @@ Grid.mixin({
|
|
4172
4182
|
|
4173
4183
|
|
4174
4184
|
// Generates an array of classNames to be used for the default rendering of a background event.
|
4175
|
-
// Called by
|
4185
|
+
// Called by fillSegHtml.
|
4176
4186
|
bgEventSegClasses: function(seg) {
|
4177
4187
|
var event = seg.event;
|
4178
4188
|
var source = event.source || {};
|
@@ -4185,7 +4195,7 @@ Grid.mixin({
|
|
4185
4195
|
|
4186
4196
|
|
4187
4197
|
// Generates a semicolon-separated CSS string to be used for the default rendering of a background event.
|
4188
|
-
// Called by
|
4198
|
+
// Called by fillSegHtml.
|
4189
4199
|
bgEventSegCss: function(seg) {
|
4190
4200
|
return {
|
4191
4201
|
'background-color': this.getSegSkinCss(seg)['background-color']
|
@@ -4194,32 +4204,68 @@ Grid.mixin({
|
|
4194
4204
|
|
4195
4205
|
|
4196
4206
|
// Generates an array of classNames to be used for the rendering business hours overlay. Called by the fill system.
|
4207
|
+
// Called by fillSegHtml.
|
4197
4208
|
businessHoursSegClasses: function(seg) {
|
4198
4209
|
return [ 'fc-nonbusiness', 'fc-bgevent' ];
|
4199
4210
|
},
|
4200
4211
|
|
4201
4212
|
|
4213
|
+
/* Business Hours
|
4214
|
+
------------------------------------------------------------------------------------------------------------------*/
|
4215
|
+
|
4216
|
+
|
4217
|
+
// Compute business hour segs for the grid's current date range.
|
4218
|
+
// Caller must ask if whole-day business hours are needed.
|
4219
|
+
buildBusinessHourSegs: function(wholeDay) {
|
4220
|
+
var events = this.view.calendar.getCurrentBusinessHourEvents(wholeDay);
|
4221
|
+
|
4222
|
+
// HACK. Eventually refactor business hours "events" system.
|
4223
|
+
// If no events are given, but businessHours is activated, this means the entire visible range should be
|
4224
|
+
// marked as *not* business-hours, via inverse-background rendering.
|
4225
|
+
if (
|
4226
|
+
!events.length &&
|
4227
|
+
this.view.calendar.options.businessHours // don't access view option. doesn't update with dynamic options
|
4228
|
+
) {
|
4229
|
+
events = [
|
4230
|
+
$.extend({}, BUSINESS_HOUR_EVENT_DEFAULTS, {
|
4231
|
+
start: this.view.end, // guaranteed out-of-range
|
4232
|
+
end: this.view.end, // "
|
4233
|
+
dow: null
|
4234
|
+
})
|
4235
|
+
];
|
4236
|
+
}
|
4237
|
+
|
4238
|
+
return this.eventsToSegs(events);
|
4239
|
+
},
|
4240
|
+
|
4241
|
+
|
4202
4242
|
/* Handlers
|
4203
4243
|
------------------------------------------------------------------------------------------------------------------*/
|
4204
4244
|
|
4205
4245
|
|
4206
|
-
// Attaches event-element-related handlers
|
4246
|
+
// Attaches event-element-related handlers for *all* rendered event segments of the view.
|
4207
4247
|
bindSegHandlers: function() {
|
4208
|
-
this.
|
4209
|
-
|
4210
|
-
|
4211
|
-
|
4212
|
-
|
4213
|
-
|
4248
|
+
this.bindSegHandlersToEl(this.el);
|
4249
|
+
},
|
4250
|
+
|
4251
|
+
|
4252
|
+
// Attaches event-element-related handlers to an arbitrary container element. leverages bubbling.
|
4253
|
+
bindSegHandlersToEl: function(el) {
|
4254
|
+
this.bindSegHandlerToEl(el, 'touchstart', this.handleSegTouchStart);
|
4255
|
+
this.bindSegHandlerToEl(el, 'touchend', this.handleSegTouchEnd);
|
4256
|
+
this.bindSegHandlerToEl(el, 'mouseenter', this.handleSegMouseover);
|
4257
|
+
this.bindSegHandlerToEl(el, 'mouseleave', this.handleSegMouseout);
|
4258
|
+
this.bindSegHandlerToEl(el, 'mousedown', this.handleSegMousedown);
|
4259
|
+
this.bindSegHandlerToEl(el, 'click', this.handleSegClick);
|
4214
4260
|
},
|
4215
4261
|
|
4216
4262
|
|
4217
4263
|
// Executes a handler for any a user-interaction on a segment.
|
4218
4264
|
// Handler gets called with (seg, ev), and with the `this` context of the Grid
|
4219
|
-
|
4265
|
+
bindSegHandlerToEl: function(el, name, handler) {
|
4220
4266
|
var _this = this;
|
4221
4267
|
|
4222
|
-
|
4268
|
+
el.on(name, '.fc-event-container > *', function(ev) {
|
4223
4269
|
var seg = $(this).data('fc-seg'); // grab segment data. put there by View::renderEvents
|
4224
4270
|
|
4225
4271
|
// only call the handlers if there is not a drag/resize in progress
|
@@ -4353,6 +4399,7 @@ Grid.mixin({
|
|
4353
4399
|
subjectEl: el,
|
4354
4400
|
subjectCenter: true,
|
4355
4401
|
interactionStart: function(ev) {
|
4402
|
+
seg.component = _this; // for renderDrag
|
4356
4403
|
isDragging = false;
|
4357
4404
|
mouseFollower = new MouseFollower(seg.el, {
|
4358
4405
|
additionalClass: 'fc-dragging',
|
@@ -4421,6 +4468,8 @@ Grid.mixin({
|
|
4421
4468
|
enableCursor();
|
4422
4469
|
},
|
4423
4470
|
interactionEnd: function(ev) {
|
4471
|
+
delete seg.component; // prevent side effects
|
4472
|
+
|
4424
4473
|
// do revert animation if hasn't changed. calls a callback when finished (whether animation or not)
|
4425
4474
|
mouseFollower.stop(!dropLocation, function() {
|
4426
4475
|
if (isDragging) {
|
@@ -5656,9 +5705,7 @@ var DayGrid = FC.DayGrid = Grid.extend(DayTableMixin, {
|
|
5656
5705
|
|
5657
5706
|
|
5658
5707
|
renderBusinessHours: function() {
|
5659
|
-
var
|
5660
|
-
var segs = this.eventsToSegs(events);
|
5661
|
-
|
5708
|
+
var segs = this.buildBusinessHourSegs(true); // wholeDay=true
|
5662
5709
|
this.renderFill('businessHours', segs, 'bgevent');
|
5663
5710
|
},
|
5664
5711
|
|
@@ -5814,11 +5861,13 @@ var DayGrid = FC.DayGrid = Grid.extend(DayTableMixin, {
|
|
5814
5861
|
|
5815
5862
|
|
5816
5863
|
queryHit: function(leftOffset, topOffset) {
|
5817
|
-
|
5818
|
-
|
5864
|
+
if (this.colCoordCache.isLeftInBounds(leftOffset) && this.rowCoordCache.isTopInBounds(topOffset)) {
|
5865
|
+
var col = this.colCoordCache.getHorizontalIndex(leftOffset);
|
5866
|
+
var row = this.rowCoordCache.getVerticalIndex(topOffset);
|
5819
5867
|
|
5820
|
-
|
5821
|
-
|
5868
|
+
if (row != null && col != null) {
|
5869
|
+
return this.getCellHit(row, col);
|
5870
|
+
}
|
5822
5871
|
}
|
5823
5872
|
},
|
5824
5873
|
|
@@ -5869,8 +5918,7 @@ var DayGrid = FC.DayGrid = Grid.extend(DayTableMixin, {
|
|
5869
5918
|
this.renderHighlight(this.eventToSpan(eventLocation));
|
5870
5919
|
|
5871
5920
|
// if a segment from the same calendar but another component is being dragged, render a helper event
|
5872
|
-
if (seg &&
|
5873
|
-
|
5921
|
+
if (seg && seg.component !== this) {
|
5874
5922
|
return this.renderEventLocationHelper(eventLocation, seg); // returns mock event elements
|
5875
5923
|
}
|
5876
5924
|
},
|
@@ -6578,7 +6626,7 @@ DayGrid.mixin({
|
|
6578
6626
|
options = {
|
6579
6627
|
className: 'fc-more-popover',
|
6580
6628
|
content: this.renderSegPopoverContent(row, col, segs),
|
6581
|
-
parentEl: this.el,
|
6629
|
+
parentEl: this.view.el, // attach to root of view. guarantees outside of scrollbars.
|
6582
6630
|
top: topEl.offset().top,
|
6583
6631
|
autoHide: true, // when the user clicks elsewhere, hide the popover
|
6584
6632
|
viewportConstrain: view.opt('popoverViewportConstrain'),
|
@@ -6601,6 +6649,10 @@ DayGrid.mixin({
|
|
6601
6649
|
|
6602
6650
|
this.segPopover = new Popover(options);
|
6603
6651
|
this.segPopover.show();
|
6652
|
+
|
6653
|
+
// the popover doesn't live within the grid's container element, and thus won't get the event
|
6654
|
+
// delegated-handlers for free. attach event-related handlers to the popover.
|
6655
|
+
this.bindSegHandlersToEl(this.segPopover.el);
|
6604
6656
|
},
|
6605
6657
|
|
6606
6658
|
|
@@ -6910,27 +6962,30 @@ var TimeGrid = FC.TimeGrid = Grid.extend(DayTableMixin, {
|
|
6910
6962
|
var snapsPerSlot = this.snapsPerSlot;
|
6911
6963
|
var colCoordCache = this.colCoordCache;
|
6912
6964
|
var slatCoordCache = this.slatCoordCache;
|
6913
|
-
|
6914
|
-
|
6915
|
-
|
6916
|
-
|
6917
|
-
|
6918
|
-
|
6919
|
-
|
6920
|
-
|
6921
|
-
|
6922
|
-
|
6923
|
-
|
6924
|
-
|
6925
|
-
|
6926
|
-
|
6927
|
-
|
6928
|
-
|
6929
|
-
|
6930
|
-
|
6931
|
-
|
6932
|
-
|
6933
|
-
|
6965
|
+
|
6966
|
+
if (colCoordCache.isLeftInBounds(leftOffset) && slatCoordCache.isTopInBounds(topOffset)) {
|
6967
|
+
var colIndex = colCoordCache.getHorizontalIndex(leftOffset);
|
6968
|
+
var slatIndex = slatCoordCache.getVerticalIndex(topOffset);
|
6969
|
+
|
6970
|
+
if (colIndex != null && slatIndex != null) {
|
6971
|
+
var slatTop = slatCoordCache.getTopOffset(slatIndex);
|
6972
|
+
var slatHeight = slatCoordCache.getHeight(slatIndex);
|
6973
|
+
var partial = (topOffset - slatTop) / slatHeight; // floating point number between 0 and 1
|
6974
|
+
var localSnapIndex = Math.floor(partial * snapsPerSlot); // the snap # relative to start of slat
|
6975
|
+
var snapIndex = slatIndex * snapsPerSlot + localSnapIndex;
|
6976
|
+
var snapTop = slatTop + (localSnapIndex / snapsPerSlot) * slatHeight;
|
6977
|
+
var snapBottom = slatTop + ((localSnapIndex + 1) / snapsPerSlot) * slatHeight;
|
6978
|
+
|
6979
|
+
return {
|
6980
|
+
col: colIndex,
|
6981
|
+
snap: snapIndex,
|
6982
|
+
component: this, // needed unfortunately :(
|
6983
|
+
left: colCoordCache.getLeftOffset(colIndex),
|
6984
|
+
right: colCoordCache.getRightOffset(colIndex),
|
6985
|
+
top: snapTop,
|
6986
|
+
bottom: snapBottom
|
6987
|
+
};
|
6988
|
+
}
|
6934
6989
|
}
|
6935
6990
|
},
|
6936
6991
|
|
@@ -7133,10 +7188,9 @@ var TimeGrid = FC.TimeGrid = Grid.extend(DayTableMixin, {
|
|
7133
7188
|
|
7134
7189
|
|
7135
7190
|
renderBusinessHours: function() {
|
7136
|
-
|
7137
|
-
|
7138
|
-
|
7139
|
-
this.renderBusinessSegs(segs);
|
7191
|
+
this.renderBusinessSegs(
|
7192
|
+
this.buildBusinessHourSegs()
|
7193
|
+
);
|
7140
7194
|
},
|
7141
7195
|
|
7142
7196
|
|
@@ -9807,16 +9861,33 @@ function Calendar_constructor(element, overrides) {
|
|
9807
9861
|
|
9808
9862
|
|
9809
9863
|
function _calcSize() { // assumes elementVisible
|
9810
|
-
|
9811
|
-
|
9864
|
+
var contentHeightInput = t.options.contentHeight;
|
9865
|
+
var heightInput = t.options.height;
|
9866
|
+
|
9867
|
+
if (typeof contentHeightInput === 'number') { // exists and not 'auto'
|
9868
|
+
suggestedViewHeight = contentHeightInput;
|
9869
|
+
}
|
9870
|
+
else if (typeof contentHeightInput === 'function') { // exists and is a function
|
9871
|
+
suggestedViewHeight = contentHeightInput();
|
9872
|
+
}
|
9873
|
+
else if (typeof heightInput === 'number') { // exists and not 'auto'
|
9874
|
+
suggestedViewHeight = heightInput - queryHeaderHeight();
|
9875
|
+
}
|
9876
|
+
else if (typeof heightInput === 'function') { // exists and is a function
|
9877
|
+
suggestedViewHeight = heightInput() - queryHeaderHeight();
|
9812
9878
|
}
|
9813
|
-
else if (
|
9814
|
-
suggestedViewHeight =
|
9879
|
+
else if (heightInput === 'parent') { // set to height of parent element
|
9880
|
+
suggestedViewHeight = element.parent().height() - queryHeaderHeight();
|
9815
9881
|
}
|
9816
9882
|
else {
|
9817
9883
|
suggestedViewHeight = Math.round(content.width() / Math.max(t.options.aspectRatio, .5));
|
9818
9884
|
}
|
9819
9885
|
}
|
9886
|
+
|
9887
|
+
|
9888
|
+
function queryHeaderHeight() {
|
9889
|
+
return header.el ? header.el.outerHeight(true) : 0; // includes margin
|
9890
|
+
}
|
9820
9891
|
|
9821
9892
|
|
9822
9893
|
function windowResize(ev) {
|
@@ -10272,7 +10343,7 @@ Calendar.defaults = {
|
|
10272
10343
|
dayPopoverFormat: 'LL',
|
10273
10344
|
|
10274
10345
|
handleWindowResize: true,
|
10275
|
-
windowResizeDelay:
|
10346
|
+
windowResizeDelay: 100, // milliseconds before an updateSize happens
|
10276
10347
|
|
10277
10348
|
longPressDelay: 1000
|
10278
10349
|
|
@@ -11495,6 +11566,7 @@ function EventManager() { // assumed to be a calendar
|
|
11495
11566
|
|
11496
11567
|
return out;
|
11497
11568
|
}
|
11569
|
+
t.buildEventFromInput = buildEventFromInput;
|
11498
11570
|
|
11499
11571
|
|
11500
11572
|
// Normalizes and assigns the given dates to the given partially-formed event object.
|
@@ -11618,6 +11690,7 @@ function EventManager() { // assumed to be a calendar
|
|
11618
11690
|
|
11619
11691
|
return events;
|
11620
11692
|
}
|
11693
|
+
t.expandEvent = expandEvent;
|
11621
11694
|
|
11622
11695
|
|
11623
11696
|
|
@@ -11811,53 +11884,6 @@ function EventManager() { // assumed to be a calendar
|
|
11811
11884
|
}
|
11812
11885
|
|
11813
11886
|
|
11814
|
-
/* Business Hours
|
11815
|
-
-----------------------------------------------------------------------------------------*/
|
11816
|
-
|
11817
|
-
t.getBusinessHoursEvents = getBusinessHoursEvents;
|
11818
|
-
|
11819
|
-
|
11820
|
-
// Returns an array of events as to when the business hours occur in the given view.
|
11821
|
-
// Abuse of our event system :(
|
11822
|
-
function getBusinessHoursEvents(wholeDay) {
|
11823
|
-
var optionVal = t.options.businessHours;
|
11824
|
-
var defaultVal = {
|
11825
|
-
className: 'fc-nonbusiness',
|
11826
|
-
start: '09:00',
|
11827
|
-
end: '17:00',
|
11828
|
-
dow: [ 1, 2, 3, 4, 5 ], // monday - friday
|
11829
|
-
rendering: 'inverse-background'
|
11830
|
-
};
|
11831
|
-
var view = t.getView();
|
11832
|
-
var eventInput;
|
11833
|
-
|
11834
|
-
if (optionVal) { // `true` (which means "use the defaults") or an override object
|
11835
|
-
eventInput = $.extend(
|
11836
|
-
{}, // copy to a new object in either case
|
11837
|
-
defaultVal,
|
11838
|
-
typeof optionVal === 'object' ? optionVal : {} // override the defaults
|
11839
|
-
);
|
11840
|
-
}
|
11841
|
-
|
11842
|
-
if (eventInput) {
|
11843
|
-
|
11844
|
-
// if a whole-day series is requested, clear the start/end times
|
11845
|
-
if (wholeDay) {
|
11846
|
-
eventInput.start = null;
|
11847
|
-
eventInput.end = null;
|
11848
|
-
}
|
11849
|
-
|
11850
|
-
return expandEvent(
|
11851
|
-
buildEventFromInput(eventInput),
|
11852
|
-
view.start,
|
11853
|
-
view.end
|
11854
|
-
);
|
11855
|
-
}
|
11856
|
-
|
11857
|
-
return [];
|
11858
|
-
}
|
11859
|
-
|
11860
|
-
|
11861
11887
|
/* Overlapping / Constraining
|
11862
11888
|
-----------------------------------------------------------------------------------------*/
|
11863
11889
|
|
@@ -11929,7 +11955,7 @@ function EventManager() { // assumed to be a calendar
|
|
11929
11955
|
|
11930
11956
|
anyContainment = false;
|
11931
11957
|
for (i = 0; i < constraintEvents.length; i++) {
|
11932
|
-
if (
|
11958
|
+
if (t.spanContainsSpan(constraintEvents[i], span)) {
|
11933
11959
|
anyContainment = true;
|
11934
11960
|
break;
|
11935
11961
|
}
|
@@ -11987,7 +12013,7 @@ function EventManager() { // assumed to be a calendar
|
|
11987
12013
|
function constraintToEvents(constraintInput) {
|
11988
12014
|
|
11989
12015
|
if (constraintInput === 'businessHours') {
|
11990
|
-
return
|
12016
|
+
return t.getCurrentBusinessHourEvents();
|
11991
12017
|
}
|
11992
12018
|
|
11993
12019
|
if (typeof constraintInput === 'object') {
|
@@ -11998,16 +12024,6 @@ function EventManager() { // assumed to be a calendar
|
|
11998
12024
|
}
|
11999
12025
|
|
12000
12026
|
|
12001
|
-
// Does the event's date range fully contain the given range?
|
12002
|
-
// start/end already assumed to have stripped zones :(
|
12003
|
-
function eventContainsRange(event, range) {
|
12004
|
-
var eventStart = event.start.clone().stripZone();
|
12005
|
-
var eventEnd = t.getEventEnd(event).stripZone();
|
12006
|
-
|
12007
|
-
return range.start >= eventStart && range.end <= eventEnd;
|
12008
|
-
}
|
12009
|
-
|
12010
|
-
|
12011
12027
|
// Does the event's date range intersect with the given range?
|
12012
12028
|
// start/end already assumed to have stripped zones :(
|
12013
12029
|
function eventIntersectsRange(event, range) {
|
@@ -12031,6 +12047,16 @@ Calendar.prototype.normalizeEvent = function(event) {
|
|
12031
12047
|
};
|
12032
12048
|
|
12033
12049
|
|
12050
|
+
// Does the given span (start, end, and other location information)
|
12051
|
+
// fully contain the other?
|
12052
|
+
Calendar.prototype.spanContainsSpan = function(outerSpan, innerSpan) {
|
12053
|
+
var eventStart = outerSpan.start.clone().stripZone();
|
12054
|
+
var eventEnd = this.getEventEnd(outerSpan).stripZone();
|
12055
|
+
|
12056
|
+
return innerSpan.start >= eventStart && innerSpan.end <= eventEnd;
|
12057
|
+
};
|
12058
|
+
|
12059
|
+
|
12034
12060
|
// Returns a list of events that the given event should be compared against when being considered for a move to
|
12035
12061
|
// the specified span. Attached to the Calendar's prototype because EventManager is a mixin for a Calendar.
|
12036
12062
|
Calendar.prototype.getPeerEvents = function(span, event) {
|
@@ -12059,6 +12085,76 @@ function backupEventDates(event) {
|
|
12059
12085
|
event._end = event.end ? event.end.clone() : null;
|
12060
12086
|
}
|
12061
12087
|
|
12088
|
+
|
12089
|
+
/* Business Hours
|
12090
|
+
-----------------------------------------------------------------------------------------*/
|
12091
|
+
|
12092
|
+
var BUSINESS_HOUR_EVENT_DEFAULTS = {
|
12093
|
+
id: '_fcBusinessHours', // will relate events from different calls to expandEvent
|
12094
|
+
start: '09:00',
|
12095
|
+
end: '17:00',
|
12096
|
+
dow: [ 1, 2, 3, 4, 5 ], // monday - friday
|
12097
|
+
rendering: 'inverse-background'
|
12098
|
+
// classNames are defined in businessHoursSegClasses
|
12099
|
+
};
|
12100
|
+
|
12101
|
+
// Return events objects for business hours within the current view.
|
12102
|
+
// Abuse of our event system :(
|
12103
|
+
Calendar.prototype.getCurrentBusinessHourEvents = function(wholeDay) {
|
12104
|
+
return this.computeBusinessHourEvents(wholeDay, this.options.businessHours);
|
12105
|
+
};
|
12106
|
+
|
12107
|
+
// Given a raw input value from options, return events objects for business hours within the current view.
|
12108
|
+
Calendar.prototype.computeBusinessHourEvents = function(wholeDay, input) {
|
12109
|
+
if (input === true) {
|
12110
|
+
return this.expandBusinessHourEvents(wholeDay, [ {} ]);
|
12111
|
+
}
|
12112
|
+
else if ($.isPlainObject(input)) {
|
12113
|
+
return this.expandBusinessHourEvents(wholeDay, [ input ]);
|
12114
|
+
}
|
12115
|
+
else if ($.isArray(input)) {
|
12116
|
+
return this.expandBusinessHourEvents(wholeDay, input, true);
|
12117
|
+
}
|
12118
|
+
else {
|
12119
|
+
return [];
|
12120
|
+
}
|
12121
|
+
};
|
12122
|
+
|
12123
|
+
// inputs expected to be an array of objects.
|
12124
|
+
// if ignoreNoDow is true, will ignore entries that don't specify a day-of-week (dow) key.
|
12125
|
+
Calendar.prototype.expandBusinessHourEvents = function(wholeDay, inputs, ignoreNoDow) {
|
12126
|
+
var view = this.getView();
|
12127
|
+
var events = [];
|
12128
|
+
var i, input;
|
12129
|
+
|
12130
|
+
for (i = 0; i < inputs.length; i++) {
|
12131
|
+
input = inputs[i];
|
12132
|
+
|
12133
|
+
if (ignoreNoDow && !input.dow) {
|
12134
|
+
continue;
|
12135
|
+
}
|
12136
|
+
|
12137
|
+
// give defaults. will make a copy
|
12138
|
+
input = $.extend({}, BUSINESS_HOUR_EVENT_DEFAULTS, input);
|
12139
|
+
|
12140
|
+
// if a whole-day series is requested, clear the start/end times
|
12141
|
+
if (wholeDay) {
|
12142
|
+
input.start = null;
|
12143
|
+
input.end = null;
|
12144
|
+
}
|
12145
|
+
|
12146
|
+
events.push.apply(events, // append
|
12147
|
+
this.expandEvent(
|
12148
|
+
this.buildEventFromInput(input),
|
12149
|
+
view.start,
|
12150
|
+
view.end
|
12151
|
+
)
|
12152
|
+
);
|
12153
|
+
}
|
12154
|
+
|
12155
|
+
return events;
|
12156
|
+
};
|
12157
|
+
|
12062
12158
|
;;
|
12063
12159
|
|
12064
12160
|
/* An abstract class for the "basic" views, as well as month view. Renders one or more rows of day cells.
|
@@ -13099,6 +13195,6 @@ fcViews.agendaWeek = {
|
|
13099
13195
|
duration: { weeks: 1 }
|
13100
13196
|
};
|
13101
13197
|
;;
|
13102
|
-
|
13103
|
-
return FC; // export for Node/CommonJS
|
13198
|
+
|
13199
|
+
return FC; // export for Node/CommonJS
|
13104
13200
|
});
|