fullcalendar.io-rails 2.7.3.0 → 2.8.0
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 +4 -4
- data/lib/fullcalendar.io/rails/version.rb +1 -1
- data/vendor/assets/javascripts/fullcalendar.js +233 -50
- data/vendor/assets/javascripts/fullcalendar/gcal.js +1 -1
- data/vendor/assets/javascripts/fullcalendar/lang-all.js +3 -3
- data/vendor/assets/javascripts/fullcalendar/lang/eu.js +1 -0
- data/vendor/assets/javascripts/fullcalendar/lang/fr-ca.js +1 -1
- data/vendor/assets/javascripts/fullcalendar/lang/fr-ch.js +1 -1
- data/vendor/assets/javascripts/fullcalendar/lang/fr.js +1 -1
- data/vendor/assets/javascripts/fullcalendar/lang/gl.js +1 -0
- data/vendor/assets/javascripts/fullcalendar/lang/lb.js +1 -0
- data/vendor/assets/stylesheets/fullcalendar.css +2 -1
- data/vendor/assets/stylesheets/fullcalendar.print.css +1 -1
- metadata +63 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 97c1c9f136922333dd29691a912b6177fee23405
|
4
|
+
data.tar.gz: 92a2a4efc4388a10ceeaca3df3be51fa28346931
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: e508564ee09050aea7351c7bd31d2122d41e8adae7a99ee05f6678692f988afd1793160e5a8fc16c8cc1f7e2e4e0119962dad3a89e94d509e47a926c34233e02
|
7
|
+
data.tar.gz: 2dc54784ae31c0b61b8c2099acd570ea283ff0b79804f41c597cd01030347700074c780fb3b1bf5cc03ad4ff7f1e8ae13ae9b245e1c2b2a61a3064fcd6057be9
|
@@ -1,5 +1,5 @@
|
|
1
1
|
/*!
|
2
|
-
* FullCalendar v2.
|
2
|
+
* FullCalendar v2.8.0
|
3
3
|
* Docs & License: http://fullcalendar.io/
|
4
4
|
* (c) 2016 Adam Shaw
|
5
5
|
*/
|
@@ -19,7 +19,7 @@
|
|
19
19
|
;;
|
20
20
|
|
21
21
|
var FC = $.fullCalendar = {
|
22
|
-
version: "2.
|
22
|
+
version: "2.8.0",
|
23
23
|
internalApiVersion: 4
|
24
24
|
};
|
25
25
|
var fcViews = FC.views = {};
|
@@ -1054,6 +1054,20 @@ function debounce(func, wait, immediate) {
|
|
1054
1054
|
};
|
1055
1055
|
}
|
1056
1056
|
|
1057
|
+
|
1058
|
+
// HACK around jQuery's now A+ promises: execute callback synchronously if already resolved.
|
1059
|
+
// thenFunc shouldn't accept args.
|
1060
|
+
// similar to whenResources in Scheduler plugin.
|
1061
|
+
function syncThen(promise, thenFunc) {
|
1062
|
+
// not a promise, or an already-resolved promise?
|
1063
|
+
if (!promise || !promise.then || promise.state() === 'resolved') {
|
1064
|
+
return $.when(thenFunc()); // resolve immediately
|
1065
|
+
}
|
1066
|
+
else if (thenFunc) {
|
1067
|
+
return promise.then(thenFunc);
|
1068
|
+
}
|
1069
|
+
}
|
1070
|
+
|
1057
1071
|
;;
|
1058
1072
|
|
1059
1073
|
var ambigDateOfMonthRegex = /^\s*\d{4}-\d\d$/;
|
@@ -3960,7 +3974,7 @@ var Grid = FC.Grid = Class.extend(ListenerMixin, MouseIgnorerMixin, {
|
|
3960
3974
|
fillSegTag: 'div', // subclasses can override
|
3961
3975
|
|
3962
3976
|
|
3963
|
-
// Builds the HTML needed for one fill segment. Generic
|
3977
|
+
// Builds the HTML needed for one fill segment. Generic enough to work with different types.
|
3964
3978
|
fillSegHtml: function(type, seg) {
|
3965
3979
|
|
3966
3980
|
// custom hooks per-type
|
@@ -8106,15 +8120,14 @@ var View = FC.View = Class.extend(EmitterMixin, ListenerMixin, {
|
|
8106
8120
|
|
8107
8121
|
this.calendar.freezeContentHeight();
|
8108
8122
|
|
8109
|
-
return this.clear()
|
8123
|
+
return syncThen(this.clear(), function() { // clear the content first
|
8110
8124
|
return (
|
8111
8125
|
_this.displaying =
|
8112
|
-
|
8113
|
-
.
|
8114
|
-
|
8115
|
-
|
8116
|
-
|
8117
|
-
})
|
8126
|
+
syncThen(_this.displayView(date), function() { // displayView might return a promise
|
8127
|
+
_this.forceScroll(_this.computeInitialScroll(scrollState));
|
8128
|
+
_this.calendar.unfreezeContentHeight();
|
8129
|
+
_this.triggerRender();
|
8130
|
+
})
|
8118
8131
|
);
|
8119
8132
|
});
|
8120
8133
|
},
|
@@ -8128,7 +8141,7 @@ var View = FC.View = Class.extend(EmitterMixin, ListenerMixin, {
|
|
8128
8141
|
var displaying = this.displaying;
|
8129
8142
|
|
8130
8143
|
if (displaying) { // previously displayed, or in the process of being displayed?
|
8131
|
-
return displaying
|
8144
|
+
return syncThen(displaying, function() { // wait for the display to finish
|
8132
8145
|
_this.displaying = null;
|
8133
8146
|
_this.clearEvents();
|
8134
8147
|
return _this.clearView(); // might return a promise. chain it
|
@@ -9321,6 +9334,7 @@ function Calendar_constructor(element, overrides) {
|
|
9321
9334
|
t.render = render;
|
9322
9335
|
t.destroy = destroy;
|
9323
9336
|
t.refetchEvents = refetchEvents;
|
9337
|
+
t.refetchEventSources = refetchEventSources;
|
9324
9338
|
t.reportEvents = reportEvents;
|
9325
9339
|
t.reportEventChange = reportEventChange;
|
9326
9340
|
t.rerenderEvents = renderEvents; // `renderEvents` serves as a rerender. an API method
|
@@ -9511,6 +9525,7 @@ function Calendar_constructor(element, overrides) {
|
|
9511
9525
|
EventManager.call(t, options);
|
9512
9526
|
var isFetchNeeded = t.isFetchNeeded;
|
9513
9527
|
var fetchEvents = t.fetchEvents;
|
9528
|
+
var fetchEventSources = t.fetchEventSources;
|
9514
9529
|
|
9515
9530
|
|
9516
9531
|
|
@@ -9750,11 +9765,16 @@ function Calendar_constructor(element, overrides) {
|
|
9750
9765
|
|
9751
9766
|
|
9752
9767
|
function refetchEvents() { // can be called as an API method
|
9753
|
-
destroyEvents(); // so that events are cleared before user starts waiting for AJAX
|
9754
9768
|
fetchAndRenderEvents();
|
9755
9769
|
}
|
9756
9770
|
|
9757
9771
|
|
9772
|
+
// TODO: move this into EventManager?
|
9773
|
+
function refetchEventSources(matchInputs) {
|
9774
|
+
fetchEventSources(t.getEventSourcesByMatchArray(matchInputs));
|
9775
|
+
}
|
9776
|
+
|
9777
|
+
|
9758
9778
|
function renderEvents() { // destroys old events if previously rendered
|
9759
9779
|
if (elementVisible()) {
|
9760
9780
|
freezeContentHeight();
|
@@ -9762,13 +9782,6 @@ function Calendar_constructor(element, overrides) {
|
|
9762
9782
|
unfreezeContentHeight();
|
9763
9783
|
}
|
9764
9784
|
}
|
9765
|
-
|
9766
|
-
|
9767
|
-
function destroyEvents() {
|
9768
|
-
freezeContentHeight();
|
9769
|
-
currentView.clearEvents();
|
9770
|
-
unfreezeContentHeight();
|
9771
|
-
}
|
9772
9785
|
|
9773
9786
|
|
9774
9787
|
function getAndRenderEvents() {
|
@@ -9979,7 +9992,7 @@ function Calendar_constructor(element, overrides) {
|
|
9979
9992
|
|
9980
9993
|
Calendar.defaults = {
|
9981
9994
|
|
9982
|
-
titleRangeSeparator: ' \
|
9995
|
+
titleRangeSeparator: ' \u2013 ', // en dash
|
9983
9996
|
monthYearFormat: 'MMMM YYYY', // required for en. other languages rely on datepicker computable option
|
9984
9997
|
|
9985
9998
|
defaultTimedEventDuration: '02:00:00',
|
@@ -10528,14 +10541,14 @@ function Header(calendar, options) {
|
|
10528
10541
|
|
10529
10542
|
function disableButton(buttonName) {
|
10530
10543
|
el.find('.fc-' + buttonName + '-button')
|
10531
|
-
.
|
10544
|
+
.prop('disabled', true)
|
10532
10545
|
.addClass(tm + '-state-disabled');
|
10533
10546
|
}
|
10534
10547
|
|
10535
10548
|
|
10536
10549
|
function enableButton(buttonName) {
|
10537
10550
|
el.find('.fc-' + buttonName + '-button')
|
10538
|
-
.
|
10551
|
+
.prop('disabled', false)
|
10539
10552
|
.removeClass(tm + '-state-disabled');
|
10540
10553
|
}
|
10541
10554
|
|
@@ -10566,8 +10579,14 @@ function EventManager(options) { // assumed to be a calendar
|
|
10566
10579
|
// exports
|
10567
10580
|
t.isFetchNeeded = isFetchNeeded;
|
10568
10581
|
t.fetchEvents = fetchEvents;
|
10582
|
+
t.fetchEventSources = fetchEventSources;
|
10583
|
+
t.getEventSources = getEventSources;
|
10584
|
+
t.getEventSourceById = getEventSourceById;
|
10585
|
+
t.getEventSourcesByMatchArray = getEventSourcesByMatchArray;
|
10586
|
+
t.getEventSourcesByMatch = getEventSourcesByMatch;
|
10569
10587
|
t.addEventSource = addEventSource;
|
10570
10588
|
t.removeEventSource = removeEventSource;
|
10589
|
+
t.removeEventSources = removeEventSources;
|
10571
10590
|
t.updateEvent = updateEvent;
|
10572
10591
|
t.renderEvent = renderEvent;
|
10573
10592
|
t.removeEvents = removeEvents;
|
@@ -10585,8 +10604,7 @@ function EventManager(options) { // assumed to be a calendar
|
|
10585
10604
|
var stickySource = { events: [] };
|
10586
10605
|
var sources = [ stickySource ];
|
10587
10606
|
var rangeStart, rangeEnd;
|
10588
|
-
var
|
10589
|
-
var pendingSourceCnt = 0;
|
10607
|
+
var pendingSourceCnt = 0; // outstanding fetch requests, max one per source
|
10590
10608
|
var cache = []; // holds events that have already been expanded
|
10591
10609
|
|
10592
10610
|
|
@@ -10616,23 +10634,58 @@ function EventManager(options) { // assumed to be a calendar
|
|
10616
10634
|
function fetchEvents(start, end) {
|
10617
10635
|
rangeStart = start;
|
10618
10636
|
rangeEnd = end;
|
10619
|
-
|
10620
|
-
|
10621
|
-
|
10622
|
-
|
10623
|
-
|
10624
|
-
|
10637
|
+
fetchEventSources(sources, 'reset');
|
10638
|
+
}
|
10639
|
+
|
10640
|
+
|
10641
|
+
// expects an array of event source objects (the originals, not copies)
|
10642
|
+
// `specialFetchType` is an optimization parameter that affects purging of the event cache.
|
10643
|
+
function fetchEventSources(specificSources, specialFetchType) {
|
10644
|
+
var i, source;
|
10645
|
+
|
10646
|
+
if (specialFetchType === 'reset') {
|
10647
|
+
cache = [];
|
10648
|
+
}
|
10649
|
+
else if (specialFetchType !== 'add') {
|
10650
|
+
cache = excludeEventsBySources(cache, specificSources);
|
10651
|
+
}
|
10652
|
+
|
10653
|
+
for (i = 0; i < specificSources.length; i++) {
|
10654
|
+
source = specificSources[i];
|
10655
|
+
|
10656
|
+
// already-pending sources have already been accounted for in pendingSourceCnt
|
10657
|
+
if (source._status !== 'pending') {
|
10658
|
+
pendingSourceCnt++;
|
10659
|
+
}
|
10660
|
+
|
10661
|
+
source._fetchId = (source._fetchId || 0) + 1;
|
10662
|
+
source._status = 'pending';
|
10663
|
+
}
|
10664
|
+
|
10665
|
+
for (i = 0; i < specificSources.length; i++) {
|
10666
|
+
source = specificSources[i];
|
10667
|
+
|
10668
|
+
tryFetchEventSource(source, source._fetchId);
|
10625
10669
|
}
|
10626
10670
|
}
|
10627
|
-
|
10628
|
-
|
10629
|
-
|
10671
|
+
|
10672
|
+
|
10673
|
+
// fetches an event source and processes its result ONLY if it is still the current fetch.
|
10674
|
+
// caller is responsible for incrementing pendingSourceCnt first.
|
10675
|
+
function tryFetchEventSource(source, fetchId) {
|
10630
10676
|
_fetchEventSource(source, function(eventInputs) {
|
10631
10677
|
var isArraySource = $.isArray(source.events);
|
10632
10678
|
var i, eventInput;
|
10633
10679
|
var abstractEvent;
|
10634
10680
|
|
10635
|
-
if (
|
10681
|
+
if (
|
10682
|
+
// is this the source's most recent fetch?
|
10683
|
+
// if not, rely on an upcoming fetch of this source to decrement pendingSourceCnt
|
10684
|
+
fetchId === source._fetchId &&
|
10685
|
+
// event source no longer valid?
|
10686
|
+
source._status !== 'rejected'
|
10687
|
+
) {
|
10688
|
+
source._status = 'resolved';
|
10636
10689
|
|
10637
10690
|
if (eventInputs) {
|
10638
10691
|
for (i = 0; i < eventInputs.length; i++) {
|
@@ -10654,13 +10707,29 @@ function EventManager(options) { // assumed to be a calendar
|
|
10654
10707
|
}
|
10655
10708
|
}
|
10656
10709
|
|
10657
|
-
|
10658
|
-
if (!pendingSourceCnt) {
|
10659
|
-
reportEvents(cache);
|
10660
|
-
}
|
10710
|
+
decrementPendingSourceCnt();
|
10661
10711
|
}
|
10662
10712
|
});
|
10663
10713
|
}
|
10714
|
+
|
10715
|
+
|
10716
|
+
function rejectEventSource(source) {
|
10717
|
+
var wasPending = source._status === 'pending';
|
10718
|
+
|
10719
|
+
source._status = 'rejected';
|
10720
|
+
|
10721
|
+
if (wasPending) {
|
10722
|
+
decrementPendingSourceCnt();
|
10723
|
+
}
|
10724
|
+
}
|
10725
|
+
|
10726
|
+
|
10727
|
+
function decrementPendingSourceCnt() {
|
10728
|
+
pendingSourceCnt--;
|
10729
|
+
if (!pendingSourceCnt) {
|
10730
|
+
reportEvents(cache);
|
10731
|
+
}
|
10732
|
+
}
|
10664
10733
|
|
10665
10734
|
|
10666
10735
|
function _fetchEventSource(source, callback) {
|
@@ -10776,14 +10845,13 @@ function EventManager(options) { // assumed to be a calendar
|
|
10776
10845
|
|
10777
10846
|
/* Sources
|
10778
10847
|
-----------------------------------------------------------------------------*/
|
10779
|
-
|
10848
|
+
|
10780
10849
|
|
10781
10850
|
function addEventSource(sourceInput) {
|
10782
10851
|
var source = buildEventSource(sourceInput);
|
10783
10852
|
if (source) {
|
10784
10853
|
sources.push(source);
|
10785
|
-
|
10786
|
-
fetchEventSource(source, currentFetchID); // will eventually call reportEvents
|
10854
|
+
fetchEventSources([ source ], 'add'); // will eventually call reportEvents
|
10787
10855
|
}
|
10788
10856
|
}
|
10789
10857
|
|
@@ -10833,19 +10901,120 @@ function EventManager(options) { // assumed to be a calendar
|
|
10833
10901
|
}
|
10834
10902
|
|
10835
10903
|
|
10836
|
-
function removeEventSource(
|
10837
|
-
|
10838
|
-
|
10839
|
-
|
10840
|
-
|
10841
|
-
|
10842
|
-
|
10843
|
-
|
10904
|
+
function removeEventSource(matchInput) {
|
10905
|
+
removeSpecificEventSources(
|
10906
|
+
getEventSourcesByMatch(matchInput)
|
10907
|
+
);
|
10908
|
+
}
|
10909
|
+
|
10910
|
+
|
10911
|
+
// if called with no arguments, removes all.
|
10912
|
+
function removeEventSources(matchInputs) {
|
10913
|
+
if (matchInputs == null) {
|
10914
|
+
removeSpecificEventSources(sources, true); // isAll=true
|
10915
|
+
}
|
10916
|
+
else {
|
10917
|
+
removeSpecificEventSources(
|
10918
|
+
getEventSourcesByMatchArray(matchInputs)
|
10919
|
+
);
|
10920
|
+
}
|
10921
|
+
}
|
10922
|
+
|
10923
|
+
|
10924
|
+
function removeSpecificEventSources(targetSources, isAll) {
|
10925
|
+
var i;
|
10926
|
+
|
10927
|
+
// cancel pending requests
|
10928
|
+
for (i = 0; i < targetSources.length; i++) {
|
10929
|
+
rejectEventSource(targetSources[i]);
|
10930
|
+
}
|
10931
|
+
|
10932
|
+
if (isAll) { // an optimization
|
10933
|
+
sources = [];
|
10934
|
+
cache = [];
|
10935
|
+
}
|
10936
|
+
else {
|
10937
|
+
// remove from persisted source list
|
10938
|
+
sources = $.grep(sources, function(source) {
|
10939
|
+
for (i = 0; i < targetSources.length; i++) {
|
10940
|
+
if (source === targetSources[i]) {
|
10941
|
+
return false; // exclude
|
10942
|
+
}
|
10943
|
+
}
|
10944
|
+
return true; // include
|
10945
|
+
});
|
10946
|
+
|
10947
|
+
cache = excludeEventsBySources(cache, targetSources);
|
10948
|
+
}
|
10949
|
+
|
10844
10950
|
reportEvents(cache);
|
10845
10951
|
}
|
10846
10952
|
|
10847
10953
|
|
10848
|
-
function
|
10954
|
+
function getEventSources() {
|
10955
|
+
return sources.slice(1); // returns a shallow copy of sources with stickySource removed
|
10956
|
+
}
|
10957
|
+
|
10958
|
+
|
10959
|
+
function getEventSourceById(id) {
|
10960
|
+
return $.grep(sources, function(source) {
|
10961
|
+
return source.id && source.id === id;
|
10962
|
+
})[0];
|
10963
|
+
}
|
10964
|
+
|
10965
|
+
|
10966
|
+
// like getEventSourcesByMatch, but accepts multple match criteria (like multiple IDs)
|
10967
|
+
function getEventSourcesByMatchArray(matchInputs) {
|
10968
|
+
|
10969
|
+
// coerce into an array
|
10970
|
+
if (!matchInputs) {
|
10971
|
+
matchInputs = [];
|
10972
|
+
}
|
10973
|
+
else if (!$.isArray(matchInputs)) {
|
10974
|
+
matchInputs = [ matchInputs ];
|
10975
|
+
}
|
10976
|
+
|
10977
|
+
var matchingSources = [];
|
10978
|
+
var i;
|
10979
|
+
|
10980
|
+
// resolve raw inputs to real event source objects
|
10981
|
+
for (i = 0; i < matchInputs.length; i++) {
|
10982
|
+
matchingSources.push.apply( // append
|
10983
|
+
matchingSources,
|
10984
|
+
getEventSourcesByMatch(matchInputs[i])
|
10985
|
+
);
|
10986
|
+
}
|
10987
|
+
|
10988
|
+
return matchingSources;
|
10989
|
+
}
|
10990
|
+
|
10991
|
+
|
10992
|
+
// matchInput can either by a real event source object, an ID, or the function/URL for the source.
|
10993
|
+
// returns an array of matching source objects.
|
10994
|
+
function getEventSourcesByMatch(matchInput) {
|
10995
|
+
var i, source;
|
10996
|
+
|
10997
|
+
// given an proper event source object
|
10998
|
+
for (i = 0; i < sources.length; i++) {
|
10999
|
+
source = sources[i];
|
11000
|
+
if (source === matchInput) {
|
11001
|
+
return [ source ];
|
11002
|
+
}
|
11003
|
+
}
|
11004
|
+
|
11005
|
+
// an ID match
|
11006
|
+
source = getEventSourceById(matchInput);
|
11007
|
+
if (source) {
|
11008
|
+
return [ source ];
|
11009
|
+
}
|
11010
|
+
|
11011
|
+
return $.grep(sources, function(source) {
|
11012
|
+
return isSourcesEquivalent(matchInput, source);
|
11013
|
+
});
|
11014
|
+
}
|
11015
|
+
|
11016
|
+
|
11017
|
+
function isSourcesEquivalent(source1, source2) {
|
10849
11018
|
return source1 && source2 && getSourcePrimitive(source1) == getSourcePrimitive(source2);
|
10850
11019
|
}
|
10851
11020
|
|
@@ -10858,6 +11027,20 @@ function EventManager(options) { // assumed to be a calendar
|
|
10858
11027
|
) ||
|
10859
11028
|
source; // the given argument *is* the primitive
|
10860
11029
|
}
|
11030
|
+
|
11031
|
+
|
11032
|
+
// util
|
11033
|
+
// returns a filtered array without events that are part of any of the given sources
|
11034
|
+
function excludeEventsBySources(specificEvents, specificSources) {
|
11035
|
+
return $.grep(specificEvents, function(event) {
|
11036
|
+
for (var i = 0; i < specificSources.length; i++) {
|
11037
|
+
if (event.source === specificSources[i]) {
|
11038
|
+
return false; // exclude
|
11039
|
+
}
|
11040
|
+
}
|
11041
|
+
return true; // keep
|
11042
|
+
});
|
11043
|
+
}
|
10861
11044
|
|
10862
11045
|
|
10863
11046
|
|