From aff58934c0c33ad9bf68c0a3b3a0a224fee978ef Mon Sep 17 00:00:00 2001 From: Mario Vavti Date: Tue, 28 Jun 2016 11:56:28 +0200 Subject: update fullcalendar to version 2.8.0 --- library/fullcalendar/fullcalendar.js | 283 ++++++++++++++++++++++++++++------- 1 file changed, 233 insertions(+), 50 deletions(-) (limited to 'library/fullcalendar/fullcalendar.js') diff --git a/library/fullcalendar/fullcalendar.js b/library/fullcalendar/fullcalendar.js index cbe67697d..2460eb5e7 100644 --- a/library/fullcalendar/fullcalendar.js +++ b/library/fullcalendar/fullcalendar.js @@ -1,5 +1,5 @@ /*! - * FullCalendar v2.7.3 + * FullCalendar v2.8.0 * Docs & License: http://fullcalendar.io/ * (c) 2016 Adam Shaw */ @@ -19,7 +19,7 @@ ;; var FC = $.fullCalendar = { - version: "2.7.3", + version: "2.8.0", internalApiVersion: 4 }; var fcViews = FC.views = {}; @@ -1054,6 +1054,20 @@ function debounce(func, wait, immediate) { }; } + +// HACK around jQuery's now A+ promises: execute callback synchronously if already resolved. +// thenFunc shouldn't accept args. +// similar to whenResources in Scheduler plugin. +function syncThen(promise, thenFunc) { + // not a promise, or an already-resolved promise? + if (!promise || !promise.then || promise.state() === 'resolved') { + return $.when(thenFunc()); // resolve immediately + } + else if (thenFunc) { + return promise.then(thenFunc); + } +} + ;; var ambigDateOfMonthRegex = /^\s*\d{4}-\d\d$/; @@ -3960,7 +3974,7 @@ var Grid = FC.Grid = Class.extend(ListenerMixin, MouseIgnorerMixin, { fillSegTag: 'div', // subclasses can override - // Builds the HTML needed for one fill segment. Generic enought o work with different types. + // Builds the HTML needed for one fill segment. Generic enough to work with different types. fillSegHtml: function(type, seg) { // custom hooks per-type @@ -8106,15 +8120,14 @@ var View = FC.View = Class.extend(EmitterMixin, ListenerMixin, { this.calendar.freezeContentHeight(); - return this.clear().then(function() { // clear the content first (async) + return syncThen(this.clear(), function() { // clear the content first return ( _this.displaying = - $.when(_this.displayView(date)) // displayView might return a promise - .then(function() { - _this.forceScroll(_this.computeInitialScroll(scrollState)); - _this.calendar.unfreezeContentHeight(); - _this.triggerRender(); - }) + syncThen(_this.displayView(date), function() { // displayView might return a promise + _this.forceScroll(_this.computeInitialScroll(scrollState)); + _this.calendar.unfreezeContentHeight(); + _this.triggerRender(); + }) ); }); }, @@ -8128,7 +8141,7 @@ var View = FC.View = Class.extend(EmitterMixin, ListenerMixin, { var displaying = this.displaying; if (displaying) { // previously displayed, or in the process of being displayed? - return displaying.then(function() { // wait for the display to finish + return syncThen(displaying, function() { // wait for the display to finish _this.displaying = null; _this.clearEvents(); return _this.clearView(); // might return a promise. chain it @@ -9321,6 +9334,7 @@ function Calendar_constructor(element, overrides) { t.render = render; t.destroy = destroy; t.refetchEvents = refetchEvents; + t.refetchEventSources = refetchEventSources; t.reportEvents = reportEvents; t.reportEventChange = reportEventChange; t.rerenderEvents = renderEvents; // `renderEvents` serves as a rerender. an API method @@ -9511,6 +9525,7 @@ function Calendar_constructor(element, overrides) { EventManager.call(t, options); var isFetchNeeded = t.isFetchNeeded; var fetchEvents = t.fetchEvents; + var fetchEventSources = t.fetchEventSources; @@ -9750,11 +9765,16 @@ function Calendar_constructor(element, overrides) { function refetchEvents() { // can be called as an API method - destroyEvents(); // so that events are cleared before user starts waiting for AJAX fetchAndRenderEvents(); } + // TODO: move this into EventManager? + function refetchEventSources(matchInputs) { + fetchEventSources(t.getEventSourcesByMatchArray(matchInputs)); + } + + function renderEvents() { // destroys old events if previously rendered if (elementVisible()) { freezeContentHeight(); @@ -9762,13 +9782,6 @@ function Calendar_constructor(element, overrides) { unfreezeContentHeight(); } } - - - function destroyEvents() { - freezeContentHeight(); - currentView.clearEvents(); - unfreezeContentHeight(); - } function getAndRenderEvents() { @@ -9979,7 +9992,7 @@ function Calendar_constructor(element, overrides) { Calendar.defaults = { - titleRangeSeparator: ' \u2014 ', // emphasized dash + titleRangeSeparator: ' \u2013 ', // en dash monthYearFormat: 'MMMM YYYY', // required for en. other languages rely on datepicker computable option defaultTimedEventDuration: '02:00:00', @@ -10528,14 +10541,14 @@ function Header(calendar, options) { function disableButton(buttonName) { el.find('.fc-' + buttonName + '-button') - .attr('disabled', 'disabled') + .prop('disabled', true) .addClass(tm + '-state-disabled'); } function enableButton(buttonName) { el.find('.fc-' + buttonName + '-button') - .removeAttr('disabled') + .prop('disabled', false) .removeClass(tm + '-state-disabled'); } @@ -10566,8 +10579,14 @@ function EventManager(options) { // assumed to be a calendar // exports t.isFetchNeeded = isFetchNeeded; t.fetchEvents = fetchEvents; + t.fetchEventSources = fetchEventSources; + t.getEventSources = getEventSources; + t.getEventSourceById = getEventSourceById; + t.getEventSourcesByMatchArray = getEventSourcesByMatchArray; + t.getEventSourcesByMatch = getEventSourcesByMatch; t.addEventSource = addEventSource; t.removeEventSource = removeEventSource; + t.removeEventSources = removeEventSources; t.updateEvent = updateEvent; t.renderEvent = renderEvent; t.removeEvents = removeEvents; @@ -10585,8 +10604,7 @@ function EventManager(options) { // assumed to be a calendar var stickySource = { events: [] }; var sources = [ stickySource ]; var rangeStart, rangeEnd; - var currentFetchID = 0; - var pendingSourceCnt = 0; + var pendingSourceCnt = 0; // outstanding fetch requests, max one per source var cache = []; // holds events that have already been expanded @@ -10616,23 +10634,58 @@ function EventManager(options) { // assumed to be a calendar function fetchEvents(start, end) { rangeStart = start; rangeEnd = end; - cache = []; - var fetchID = ++currentFetchID; - var len = sources.length; - pendingSourceCnt = len; - for (var i=0; i