diff --git a/app/coffeescripts/calendar/Calendar.coffee b/app/coffeescripts/calendar/Calendar.coffee index 537abc64e16..26b619f20ef 100644 --- a/app/coffeescripts/calendar/Calendar.coffee +++ b/app/coffeescripts/calendar/Calendar.coffee @@ -173,7 +173,7 @@ define [ @gotoDate(fcUtil.now()) # FullCalendar callbacks - getEvents: (start, end, timezone, cb) => + getEvents: (start, end, timezone, donecb, datacb) => @dataSource.getEvents start, end, @visibleContextList, (events) => if @displayAppointmentEvents @dataSource.getEventsForAppointmentGroup @displayAppointmentEvents, (aEvents) => @@ -185,9 +185,14 @@ define [ event.removeClass('current-appointment-group') for event in aEvents event.addClass('current-appointment-group') - cb(calendarEventFilter(@displayAppointmentEvents, events.concat(aEvents))) + donecb(calendarEventFilter(@displayAppointmentEvents, events.concat(aEvents))) else - cb(calendarEventFilter(@displayAppointmentEvents, events)) + if (datacb?) + donecb([]) + else + donecb(calendarEventFilter(@displayAppointmentEvents, events)) + , datacb? && (events) => + datacb(calendarEventFilter(@displayAppointmentEvents, events)) # Close all event details popup on the page and have them cleaned up. closeEventPopups: -> diff --git a/app/coffeescripts/calendar/EventDataSource.coffee b/app/coffeescripts/calendar/EventDataSource.coffee index d2340f4396d..4ade25b8ff2 100644 --- a/app/coffeescripts/calendar/EventDataSource.coffee +++ b/app/coffeescripts/calendar/EventDataSource.coffee @@ -220,7 +220,7 @@ define [ params = { include: [ 'reserved_times', 'participant_count', 'appointments', 'child_events' ]} @startFetch [[ group.url, params ]], dataCB, (() => cb @cache.appointmentGroups[group.id].appointmentEvents) - getEvents: (start, end, contexts, cb, options = {}) => + getEvents: (start, end, contexts, donecb, datacb, options = {}) => if @inFlightRequest['default'] @pendingRequests.push([@getEvents, arguments, 'default']) return @@ -267,20 +267,25 @@ define [ # Yay, this request can be satisfied by the cache list = @getEventsFromCache(start, end, contexts) list.requestID = options.requestID - cb list + datacb list if datacb? + donecb list @processNextRequest() return requestResults = {} dataCB = (data, url, params) => return unless data + newEvents = [] key = 'type_'+params.type requestResult = requestResults[key] or {events: []} requestResult.next = data.next for e in data event = commonEventFactory(e, @contexts) if event && event.object.workflow_state != 'deleted' + newEvents.push(event) requestResult.events.push(event) + newEvents.requestID = options.requestID + datacb newEvents if datacb? requestResults[key] = requestResult doneCB = () => @@ -324,7 +329,7 @@ define [ list = @getEventsFromCache(start, end, contexts) list.nextPageDate = nextPageDate list.requestID = options.requestID - cb list + donecb list @startFetch [ [ '/api/v1/calendar_events', params ] diff --git a/app/coffeescripts/calendar/MiniCalendar.coffee b/app/coffeescripts/calendar/MiniCalendar.coffee index ce7d74432f3..c732a7cd5b5 100644 --- a/app/coffeescripts/calendar/MiniCalendar.coffee +++ b/app/coffeescripts/calendar/MiniCalendar.coffee @@ -34,7 +34,7 @@ define [ "CommonEvent/eventSaved" : @eventSaved ) - getEvents: (start, end, timezone, cb) => + getEvents: (start, end, timezone, donecb, datacb) => # Since we have caching (lazyFetching) turned off, we can rely on this # getting called every time we switch views, *before* the events are rendered. # That makes this a great place to clear out the previous classes. @@ -42,7 +42,7 @@ define [ @calendar.find(".fc-widget-content td") .removeClass("event slot-available") .removeAttr('title') - @mainCalendar.getEvents start, end, timezone, cb + @mainCalendar.getEvents start, end, timezone, donecb, datacb dayClick: (date) => @mainCalendar.gotoDate(date) diff --git a/app/coffeescripts/views/calendar/AgendaView.coffee b/app/coffeescripts/views/calendar/AgendaView.coffee index 5e5770e6891..e433224247a 100644 --- a/app/coffeescripts/views/calendar/AgendaView.coffee +++ b/app/coffeescripts/views/calendar/AgendaView.coffee @@ -62,7 +62,7 @@ define [ _fetch: (start, callback) -> end = fcUtil.clone(start).year(3000) @lastRequestID = $.guid++ - @dataSource.getEvents start, end, @contexts, callback, {singlePage: true, requestID: @lastRequestID} + @dataSource.getEvents start, end, @contexts, callback, undefined, {singlePage: true, requestID: @lastRequestID} refetch: => return unless @startDate diff --git a/public/javascripts/bower/fullcalendar/dist/fullcalendar.js b/public/javascripts/bower/fullcalendar/dist/fullcalendar.js index 1dcf68f5d06..aaa2a9c4423 100644 --- a/public/javascripts/bower/fullcalendar/dist/fullcalendar.js +++ b/public/javascripts/bower/fullcalendar/dist/fullcalendar.js @@ -9366,11 +9366,17 @@ function EventManager(options) { // assumed to be a calendar reportEvents(cache); } } + }, function(eventInputs) { + if (fetchID == currentFetchID) { + for (i = 0; i < eventInputs.length; i++) { + renderEvent(eventInputs[i]); + } + } }); } - function _fetchEventSource(source, callback) { + function _fetchEventSource(source, callback, dataCallback) { var i; var fetchers = fc.sourceFetchers; var res; @@ -9408,7 +9414,8 @@ function EventManager(options) { // assumed to be a calendar function(events) { callback(events); t.popLoading(); - } + }, + dataCallback ); } else if ($.isArray(events)) { diff --git a/spec/coffeescripts/calendar/EventDataSourceSpec.coffee b/spec/coffeescripts/calendar/EventDataSourceSpec.coffee index 7b375300e96..05f4bbaffe6 100644 --- a/spec/coffeescripts/calendar/EventDataSourceSpec.coffee +++ b/spec/coffeescripts/calendar/EventDataSourceSpec.coffee @@ -151,3 +151,14 @@ define [ equal list.length, 2 ok ['calendar_event_1', 'assignment_3'].indexOf(list[0].id) >= 0 ok ['calendar_event_1', 'assignment_3'].indexOf(list[1].id) >= 0 + + test 'pagination: calls data callback with each page of data if set', -> + @server.addCalendarEvent('course_1', '1', fcUtil.unwrap(@date1).toISOString()) + @server.addAssignment('course_2', '3', fcUtil.unwrap(@date3).toISOString()) + pages = 0 + @source.getEvents @date1, @date4, @contexts, (list) -> + equal list.length, 2 + equal pages, 2 + , (list) -> + pages += 1 + equal list.length, 1