Skip to content

Commit

Permalink
fix calendar-to-calendar dragging, incorrect triggers and args firing
Browse files Browse the repository at this point in the history
  • Loading branch information
arshaw committed Jan 1, 2019
1 parent addfc58 commit fd3e878
Show file tree
Hide file tree
Showing 2 changed files with 108 additions and 2 deletions.
18 changes: 16 additions & 2 deletions src/interactions/EventDragging.ts
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,8 @@ import { diffDates, enableCursor, disableCursor } from '../util/misc'
import { EventRenderRange, getElSeg } from '../component/event-rendering'
import EventApi from '../api/EventApi'
import { __assign } from 'tslib'
import { ExternalDropApi } from '../interactions-external/ExternalElementDragging'
import View from '../View'

export type EventDropTransformers = (mutation: EventMutation, calendar: Calendar) => void

Expand Down Expand Up @@ -216,6 +218,7 @@ export default class EventDragging { // TODO: rename to EventSelectingAndDraggin
let eventApi = new EventApi(initialCalendar, eventDef, eventInstance)
let relevantEvents = this.relevantEvents!
let mutatedRelevantEvents = this.mutatedRelevantEvents!
let { finalHit } = this.hitDragging

this.clearDrag() // must happen after revert animation

Expand Down Expand Up @@ -293,11 +296,22 @@ export default class EventDragging { // TODO: rename to EventSelectingAndDraggin
})
}

let dropArg = receivingCalendar.buildDatePointApi(finalHit.dateSpan) as ExternalDropApi
dropArg.draggedEl = ev.subjectEl as HTMLElement
dropArg.jsEvent = ev.origEvent
dropArg.view = finalHit.component as View // ?

receivingCalendar.publiclyTrigger('drop', [ dropArg ])

receivingCalendar.publiclyTrigger('eventReceive', [
{
draggedEl: ev.subjectEl,
event: new EventApi(receivingCalendar, eventDef, eventInstance),
view: this.hitDragging.finalHit.component
event: new EventApi( // the data AFTER the mutation
receivingCalendar,
mutatedRelevantEvents.defs[eventDef.defId],
mutatedRelevantEvents.instances[eventInstance.instanceId]
),
view: finalHit.component
}
])
}
Expand Down
92 changes: 92 additions & 0 deletions tests/automated/event-drag/between-calendars.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,92 @@
import { Calendar } from 'fullcalendar'
import { getSingleEl } from '../event-render/EventRenderUtils'
import { getDayEl } from '../view-render/DayGridRenderUtils'
import { getRectCenter } from '../lib/geom'

describe('dragging events between calendars', function() {
let DEFAULT_DATE = '2019-01-01'
let el0, el1
let calendar0, calendar1

beforeEach(function() {
el0 = document.createElement('div')
el1 = document.createElement('div')

el0.style.width = el1.style.width = '50%'
el0.style.cssFloat = el1.style.cssFloat = 'left'

document.body.appendChild(el0)
document.body.appendChild(el1)
})

afterEach(function() {
if (calendar0) {
calendar0.destroy()
}

if (calendar1) {
calendar1.destroy()
}

document.body.removeChild(el0)
document.body.removeChild(el1)
})

it('fires all triggers', function(done) {
let triggerNames = []

calendar0 = new Calendar(el0, {
timeZone: 'UTC',
defaultDate: DEFAULT_DATE,
defaultView: 'month',
editable: true,
events: [
{ start: '2019-01-01', id: 'a' }
],
eventLeave: function(info) {
triggerNames.push('eventLeave')
expect(info.draggedEl).toBe(eventEl)
expect(info.event.id).toBe('a')
}
})

calendar1 = new Calendar(el1, {
timeZone: 'UTC',
defaultDate: DEFAULT_DATE,
defaultView: 'month',
editable: true,
droppable: true,
drop: function(info) {
triggerNames.push('drop')
expect(info.draggedEl).toBe(eventEl)
expect(info.date).toEqualDate('2019-01-05')
expect(info.dateStr).toBe('2019-01-05')
expect(info.allDay).toBe(true)
},
eventReceive: function(info) {
triggerNames.push('eventReceive')
expect(info.draggedEl).toBe(eventEl)
expect(info.event.start).toEqualDate('2019-01-05')
}
})

calendar0.render()
calendar1.render()

let eventEl = getSingleEl()[0]
let dayEl = getDayEl('2019-01-05')[1] // the one from the SECOND calendar
let point0 = getRectCenter(eventEl.getBoundingClientRect())
let point1 = getRectCenter(dayEl.getBoundingClientRect())

$(eventEl).simulate('drag', {
debug: true,
point: point0,
end: point1,
callback: function() {
expect(triggerNames).toEqual([ 'eventLeave', 'drop', 'eventReceive' ])
done()
}
})
})

})

0 comments on commit fd3e878

Please sign in to comment.