mirror of
https://github.com/wassname/fullcalendar.git
synced 2026-06-27 16:10:13 +08:00
Fix for drag/drop and resize revert
This commit is contained in:
Vendored
+238
-12
@@ -1979,7 +1979,7 @@ function ResourceManager(options) {
|
||||
// exports
|
||||
t.fetchResources = fetchResources;
|
||||
t.setResources = setResources;
|
||||
|
||||
t.mutateResourceEvent = mutateResourceEvent;
|
||||
// locals
|
||||
var resourceSources = [];
|
||||
var cache;
|
||||
@@ -2110,6 +2110,182 @@ function ResourceManager(options) {
|
||||
normalizers[i](source);
|
||||
}
|
||||
}
|
||||
|
||||
/* Event Modification Math
|
||||
-----------------------------------------------------------------------------------------*/
|
||||
|
||||
|
||||
// Modify the date(s) of an event and make this change propagate to all other events with
|
||||
// the same ID (related repeating events).
|
||||
//
|
||||
// If `newStart`/`newEnd` are not specified, the "new" dates are assumed to be `event.start` and `event.end`.
|
||||
// The "old" dates to be compare against are always `event._start` and `event._end` (set by EventManager).
|
||||
//
|
||||
// Returns an object with delta information and a function to undo all operations.
|
||||
//
|
||||
function mutateResourceEvent(event, newResources, newStart, newEnd) {
|
||||
var oldAllDay = event._allDay;
|
||||
var oldStart = event._start;
|
||||
var oldEnd = event._end;
|
||||
var clearEnd = false;
|
||||
var newAllDay;
|
||||
var dateDelta;
|
||||
var durationDelta;
|
||||
var undoFunc;
|
||||
|
||||
// if no new dates were passed in, compare against the event's existing dates
|
||||
if (!newStart && !newEnd) {
|
||||
newStart = event.start;
|
||||
newEnd = event.end;
|
||||
}
|
||||
|
||||
// NOTE: throughout this function, the initial values of `newStart` and `newEnd` are
|
||||
// preserved. These values may be undefined.
|
||||
|
||||
// detect new allDay
|
||||
if (event.allDay != oldAllDay) { // if value has changed, use it
|
||||
newAllDay = event.allDay;
|
||||
}
|
||||
else { // otherwise, see if any of the new dates are allDay
|
||||
newAllDay = !(newStart || newEnd).hasTime();
|
||||
}
|
||||
|
||||
// normalize the new dates based on allDay
|
||||
if (newAllDay) {
|
||||
if (newStart) {
|
||||
newStart = newStart.clone().stripTime();
|
||||
}
|
||||
if (newEnd) {
|
||||
newEnd = newEnd.clone().stripTime();
|
||||
}
|
||||
}
|
||||
|
||||
// compute dateDelta
|
||||
if (newStart) {
|
||||
if (newAllDay) {
|
||||
dateDelta = dayishDiff(newStart, oldStart.clone().stripTime()); // treat oldStart as allDay
|
||||
}
|
||||
else {
|
||||
dateDelta = dayishDiff(newStart, oldStart);
|
||||
}
|
||||
}
|
||||
|
||||
if (newAllDay != oldAllDay) {
|
||||
// if allDay has changed, always throw away the end
|
||||
clearEnd = true;
|
||||
}
|
||||
else if (newEnd) {
|
||||
durationDelta = dayishDiff(
|
||||
// new duration
|
||||
newEnd || t.getDefaultEventEnd(newAllDay, newStart || oldStart),
|
||||
newStart || oldStart
|
||||
).subtract(dayishDiff(
|
||||
// subtract old duration
|
||||
oldEnd || t.getDefaultEventEnd(oldAllDay, oldStart),
|
||||
oldStart
|
||||
));
|
||||
}
|
||||
|
||||
undoFunc = mutateResourceEvents(
|
||||
t.clientEvents(event._id), // get events with this ID
|
||||
clearEnd,
|
||||
newAllDay,
|
||||
dateDelta,
|
||||
durationDelta,
|
||||
newResources
|
||||
);
|
||||
|
||||
return {
|
||||
dateDelta: dateDelta,
|
||||
durationDelta: durationDelta,
|
||||
undo: undoFunc
|
||||
};
|
||||
}
|
||||
|
||||
|
||||
// Modifies an array of events in the following ways (operations are in order):
|
||||
// - clear the event's `end`
|
||||
// - convert the event to allDay
|
||||
// - add `dateDelta` to the start and end
|
||||
// - add `durationDelta` to the event's duration
|
||||
//
|
||||
// Returns a function that can be called to undo all the operations.
|
||||
//
|
||||
function mutateResourceEvents(events, clearEnd, forceAllDay, dateDelta, durationDelta, newResources) {
|
||||
var isAmbigTimezone = t.getIsAmbigTimezone();
|
||||
var undoFunctions = [];
|
||||
|
||||
$.each(events, function(i, event) {
|
||||
var oldResources = event.resources;
|
||||
var oldAllDay = event._allDay;
|
||||
var oldStart = event._start;
|
||||
var oldEnd = event._end;
|
||||
var newAllDay = forceAllDay != null ? forceAllDay : oldAllDay;
|
||||
var newStart = oldStart.clone();
|
||||
var newEnd = (!clearEnd && oldEnd) ? oldEnd.clone() : null;
|
||||
|
||||
// NOTE: this function is responsible for transforming `newStart` and `newEnd`,
|
||||
// which were initialized to the OLD values first. `newEnd` may be null.
|
||||
|
||||
// normlize newStart/newEnd to be consistent with newAllDay
|
||||
if (newAllDay) {
|
||||
newStart.stripTime();
|
||||
if (newEnd) {
|
||||
newEnd.stripTime();
|
||||
}
|
||||
}
|
||||
else {
|
||||
if (!newStart.hasTime()) {
|
||||
newStart = t.rezoneDate(newStart);
|
||||
}
|
||||
if (newEnd && !newEnd.hasTime()) {
|
||||
newEnd = t.rezoneDate(newEnd);
|
||||
}
|
||||
}
|
||||
|
||||
// ensure we have an end date if necessary
|
||||
if (!newEnd && (options.forceEventDuration || +durationDelta)) {
|
||||
newEnd = t.getDefaultEventEnd(newAllDay, newStart);
|
||||
}
|
||||
|
||||
// translate the dates
|
||||
newStart.add(dateDelta);
|
||||
if (newEnd) {
|
||||
newEnd.add(dateDelta).add(durationDelta);
|
||||
}
|
||||
|
||||
// if the dates have changed, and we know it is impossible to recompute the
|
||||
// timezone offsets, strip the zone.
|
||||
if (isAmbigTimezone) {
|
||||
if (+dateDelta || +durationDelta) {
|
||||
newStart.stripZone();
|
||||
if (newEnd) {
|
||||
newEnd.stripZone();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
event.allDay = newAllDay;
|
||||
event.start = newStart;
|
||||
event.end = newEnd;
|
||||
event.resources = newResources;
|
||||
backupEventDates(event);
|
||||
|
||||
undoFunctions.push(function() {
|
||||
event.allDay = oldAllDay;
|
||||
event.start = oldStart;
|
||||
event.end = oldEnd;
|
||||
event.resources = oldResources;
|
||||
backupEventDates(event);
|
||||
});
|
||||
});
|
||||
|
||||
return function() {
|
||||
for (var i=0; i<undoFunctions.length; i++) {
|
||||
undoFunctions[i]();
|
||||
}
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
;;
|
||||
@@ -5659,7 +5835,6 @@ function ResourceDayView(element, calendar) { // TODO: make a DayView mixin
|
||||
t.incrementDate = incrementDate;
|
||||
t.render = render;
|
||||
|
||||
|
||||
// imports
|
||||
ResourceView.call(t, element, calendar, 'resourceDay');
|
||||
var getResources = t.getResources;
|
||||
@@ -5751,6 +5926,9 @@ function ResourceView(element, calendar, viewName) {
|
||||
|
||||
// imports
|
||||
View.call(t, element, calendar, viewName);
|
||||
t.eventDrop = eventDrop;
|
||||
t.eventResize = eventResize;
|
||||
|
||||
OverlayManager.call(t);
|
||||
SelectionManager.call(t);
|
||||
ResourceEventRenderer.call(t);
|
||||
@@ -5760,14 +5938,13 @@ function ResourceView(element, calendar, viewName) {
|
||||
var clearOverlays = t.clearOverlays;
|
||||
var reportSelection = t.reportSelection;
|
||||
var unselect = t.unselect;
|
||||
//var daySelectionMousedown = t.daySelectionMousedown;
|
||||
var slotSegHtml = t.slotSegHtml;
|
||||
var cellToDate = t.cellToDate;
|
||||
var dateToCell = t.dateToCell;
|
||||
var rangeToSegments = t.rangeToSegments;
|
||||
var formatDate = calendar.formatDate;
|
||||
var calculateWeekNumber = calendar.calculateWeekNumber;
|
||||
|
||||
var reportEventChange = calendar.reportEventChange;
|
||||
|
||||
// locals
|
||||
|
||||
@@ -6594,7 +6771,49 @@ function ResourceView(element, calendar, viewName) {
|
||||
trigger('dayClick', dayBodyCells[dateToCell(date).col], date, ev);
|
||||
}
|
||||
|
||||
/* Event Modification Reporting
|
||||
---------------------------------------------------------------------------------*/
|
||||
|
||||
|
||||
function eventDrop(el, event, newResources, newStart, ev, ui) {
|
||||
var mutateResult = calendar.mutateResourceEvent(event, newResources, newStart, null);
|
||||
|
||||
trigger(
|
||||
'eventDrop',
|
||||
el,
|
||||
event,
|
||||
mutateResult.dateDelta,
|
||||
function() {
|
||||
mutateResult.undo();
|
||||
reportEventChange(event._id);
|
||||
},
|
||||
ev,
|
||||
ui
|
||||
);
|
||||
|
||||
reportEventChange(event._id);
|
||||
}
|
||||
|
||||
|
||||
function eventResize(el, event, newEnd, ev, ui) {
|
||||
var mutateResult = calendar.mutateResourceEvent(event, event.resources, null, newEnd);
|
||||
|
||||
trigger(
|
||||
'eventResize',
|
||||
el,
|
||||
event,
|
||||
mutateResult.durationDelta,
|
||||
function() {
|
||||
mutateResult.undo();
|
||||
reportEventChange(event._id);
|
||||
},
|
||||
ev,
|
||||
ui
|
||||
);
|
||||
|
||||
reportEventChange(event._id);
|
||||
}
|
||||
|
||||
|
||||
/* External Dragging
|
||||
--------------------------------------------------------------------------------*/
|
||||
@@ -6667,7 +6886,6 @@ function ResourceView(element, calendar, viewName) {
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
;;
|
||||
|
||||
function ResourceEventRenderer() {
|
||||
@@ -6696,7 +6914,7 @@ function ResourceEventRenderer() {
|
||||
var colContentLeft = t.colContentLeft;
|
||||
var colContentRight = t.colContentRight;
|
||||
var cellToDate = t.cellToDate;
|
||||
var getColCnt = function() { return resources().length; };
|
||||
var getColCnt = function() { return getResources().length; };
|
||||
var getColWidth = t.getColWidth;
|
||||
var getSnapHeight = t.getSnapHeight;
|
||||
var getSnapDuration = t.getSnapDuration;
|
||||
@@ -6716,7 +6934,7 @@ function ResourceEventRenderer() {
|
||||
var calendar = t.calendar;
|
||||
var formatDate = calendar.formatDate;
|
||||
var getEventEnd = calendar.getEventEnd;
|
||||
var resources = t.getResources;
|
||||
var getResources = t.getResources;
|
||||
|
||||
|
||||
// overrides
|
||||
@@ -6767,7 +6985,7 @@ function ResourceEventRenderer() {
|
||||
|
||||
for (i=0; i<colCnt; i++) {
|
||||
cellDate = cellToDate(0, 0); // updated - should show same day for all
|
||||
var resourceEvents = eventsForResource(resources()[i], events);
|
||||
var resourceEvents = eventsForResource(getResources()[i], events);
|
||||
colSegs = sliceSegs(
|
||||
resourceEvents,
|
||||
cellDate.clone().time(minTime),
|
||||
@@ -7160,9 +7378,14 @@ function ResourceEventRenderer() {
|
||||
else { // changed!
|
||||
// calculate column delta
|
||||
var newCol = Math.round((eventElement.offset().left - getSlotContainer().offset().left) / colWidth);
|
||||
// if (newCol !== origCol){
|
||||
// event.resources = [ resources()[newCol].id ];
|
||||
// }
|
||||
var resources = event.resources;
|
||||
if (newCol !== origCol){
|
||||
event.resources = [ resources()[newCol].id ];
|
||||
resources = [ getResources()[newCol].id ];
|
||||
}
|
||||
|
||||
var eventStart = event.start.clone(); // already assumed to have a stripped time
|
||||
var snapTime;
|
||||
var snapIndex;
|
||||
@@ -7175,6 +7398,7 @@ function ResourceEventRenderer() {
|
||||
eventDrop(
|
||||
eventElement[0],
|
||||
event,
|
||||
resources,
|
||||
eventStart,
|
||||
ev,
|
||||
ui
|
||||
@@ -7308,12 +7532,14 @@ function ResourceEventRenderer() {
|
||||
trigger('eventDragStop', eventElement[0], event, ev, ui);
|
||||
|
||||
if (isInBounds && (isAllDay || resourceDelta || snapDelta)) { // changed!
|
||||
if (resourceDelta){
|
||||
event.resources = [ resources()[origCell.col + resourceDelta].id ];
|
||||
}
|
||||
var resources = event.resources;
|
||||
if (resourceDelta){
|
||||
resources = [ getResources()[origCell.col + resourceDelta].id ];
|
||||
}
|
||||
eventDrop(
|
||||
eventElement[0],
|
||||
event,
|
||||
resources,
|
||||
eventStart,
|
||||
ev,
|
||||
ui
|
||||
|
||||
Vendored
+3
-3
File diff suppressed because one or more lines are too long
Vendored
+1
-1
@@ -1 +1 @@
|
||||
(function(t){"function"==typeof define&&define.amd?define(["jquery","moment"],t):t(jQuery,moment)})(function(t,e){e.lang("en"),t.fullCalendar.lang("en"),t.datepicker&&t.datepicker.setDefaults(t.datepicker.regional[""])});
|
||||
(function(e){"function"==typeof define&&define.amd?define(["jquery","moment"],e):e(jQuery,moment)})(function(e,t){t.lang("en"),e.fullCalendar.lang("en"),e.datepicker&&e.datepicker.setDefaults(e.datepicker.regional[""])});
|
||||
@@ -25,7 +25,7 @@ function ResourceEventRenderer() {
|
||||
var colContentLeft = t.colContentLeft;
|
||||
var colContentRight = t.colContentRight;
|
||||
var cellToDate = t.cellToDate;
|
||||
var getColCnt = function() { return resources().length; };
|
||||
var getColCnt = function() { return getResources().length; };
|
||||
var getColWidth = t.getColWidth;
|
||||
var getSnapHeight = t.getSnapHeight;
|
||||
var getSnapDuration = t.getSnapDuration;
|
||||
@@ -45,7 +45,7 @@ function ResourceEventRenderer() {
|
||||
var calendar = t.calendar;
|
||||
var formatDate = calendar.formatDate;
|
||||
var getEventEnd = calendar.getEventEnd;
|
||||
var resources = t.getResources;
|
||||
var getResources = t.getResources;
|
||||
|
||||
|
||||
// overrides
|
||||
@@ -96,7 +96,7 @@ function ResourceEventRenderer() {
|
||||
|
||||
for (i=0; i<colCnt; i++) {
|
||||
cellDate = cellToDate(0, 0); // updated - should show same day for all
|
||||
var resourceEvents = eventsForResource(resources()[i], events);
|
||||
var resourceEvents = eventsForResource(getResources()[i], events);
|
||||
colSegs = sliceSegs(
|
||||
resourceEvents,
|
||||
cellDate.clone().time(minTime),
|
||||
@@ -492,9 +492,9 @@ function ResourceEventRenderer() {
|
||||
// if (newCol !== origCol){
|
||||
// event.resources = [ resources()[newCol].id ];
|
||||
// }
|
||||
var newResources = event.resources;
|
||||
var resources = event.resources;
|
||||
if (newCol !== origCol){
|
||||
newResources = [ resources()[newCol].id ];
|
||||
resources = [ getResources()[newCol].id ];
|
||||
}
|
||||
|
||||
var eventStart = event.start.clone(); // already assumed to have a stripped time
|
||||
@@ -509,7 +509,7 @@ function ResourceEventRenderer() {
|
||||
eventDrop(
|
||||
eventElement[0],
|
||||
event,
|
||||
newResources,
|
||||
resources,
|
||||
eventStart,
|
||||
ev,
|
||||
ui
|
||||
@@ -645,7 +645,7 @@ function ResourceEventRenderer() {
|
||||
if (isInBounds && (isAllDay || resourceDelta || snapDelta)) { // changed!
|
||||
var resources = event.resources;
|
||||
if (resourceDelta){
|
||||
resources = [ resources()[origCell.col + resourceDelta].id ];
|
||||
resources = [ getResources()[origCell.col + resourceDelta].id ];
|
||||
}
|
||||
eventDrop(
|
||||
eventElement[0],
|
||||
|
||||
@@ -62,12 +62,12 @@ function ResourceView(element, calendar, viewName) {
|
||||
t.dragStart = dragStart;
|
||||
t.dragStop = dragStop;
|
||||
t.getResources = calendar.fetchResources;
|
||||
|
||||
// imports
|
||||
View.call(t, element, calendar, viewName);
|
||||
t.eventDrop = eventDrop;
|
||||
t.eventResize = eventResize;
|
||||
|
||||
// imports
|
||||
// View.call(t, element, calendar, viewName);
|
||||
OverlayManager.call(t);
|
||||
SelectionManager.call(t);
|
||||
ResourceEventRenderer.call(t);
|
||||
@@ -77,7 +77,6 @@ function ResourceView(element, calendar, viewName) {
|
||||
var clearOverlays = t.clearOverlays;
|
||||
var reportSelection = t.reportSelection;
|
||||
var unselect = t.unselect;
|
||||
//var daySelectionMousedown = t.daySelectionMousedown;
|
||||
var slotSegHtml = t.slotSegHtml;
|
||||
var cellToDate = t.cellToDate;
|
||||
var dateToCell = t.dateToCell;
|
||||
@@ -916,7 +915,6 @@ function ResourceView(element, calendar, viewName) {
|
||||
|
||||
|
||||
function eventDrop(el, event, newResources, newStart, ev, ui) {
|
||||
//var mutateResult = calendar.mutateEvent(event, newStart, null);
|
||||
var mutateResult = calendar.mutateResourceEvent(event, newResources, newStart, null);
|
||||
|
||||
trigger(
|
||||
@@ -937,7 +935,7 @@ function ResourceView(element, calendar, viewName) {
|
||||
|
||||
|
||||
function eventResize(el, event, newEnd, ev, ui) {
|
||||
var mutateResult = calendar.mutateResourceEvent(event, null, newEnd);
|
||||
var mutateResult = calendar.mutateResourceEvent(event, event.resources, null, newEnd);
|
||||
|
||||
trigger(
|
||||
'eventResize',
|
||||
|
||||
@@ -104,7 +104,10 @@
|
||||
selectHelper: true,
|
||||
allDaySlot: true,
|
||||
eventDrop: function (event, delta, revertFunc) {
|
||||
revertFunc();
|
||||
//revertFunc();
|
||||
},
|
||||
eventResize: function (event, delta, revertFunc) {
|
||||
//revertFunc();
|
||||
},
|
||||
// weekends: false,
|
||||
header: {
|
||||
|
||||
Reference in New Issue
Block a user