Adam Shaw пре 7 година
родитељ
комит
82f7e0ca86

+ 2 - 1
src/dnd/FeaturefulElementDragging.ts

@@ -20,7 +20,7 @@ export default class FeaturefulElementDragging extends ElementDragging {
   // the caller can also set the PointerDragging's options as well
   delay: number | null = null
   minDistance: number = 0
-  touchScrollAllowed: boolean = true
+  touchScrollAllowed: boolean = true // prevents drag from starting and blocks scrolling during drag
 
   mirrorNeedsRevert: boolean = false
   isInteracting: boolean = false // is the user validly moving the pointer? lasts until pointerup
@@ -72,6 +72,7 @@ export default class FeaturefulElementDragging extends ElementDragging {
         this.origX = ev.pageX
         this.origY = ev.pageY
 
+        this.mirror.setIsVisible(false) // reset. caller must set-visible
         this.mirror.start(ev.subjectEl as HTMLElement, ev.pageX, ev.pageY)
         this.autoScroller.start(ev.pageX, ev.pageY)
 

+ 23 - 9
src/interactions-external/ExternalDraggable.ts

@@ -1,12 +1,13 @@
 import FeaturefulElementDragging from '../dnd/FeaturefulElementDragging'
 import ExternalElementDragging, { DragMetaGenerator } from './ExternalElementDragging'
+import { globalDefaults } from '../options'
+import { PointerDragEvent } from '../dnd/PointerDragging'
 
 export interface ExternalDraggableSettings {
   eventData?: DragMetaGenerator
   itemSelector?: string
   delay?: number
   minDistance?: number
-  touchScrollAllowed?: boolean
 }
 
 /*
@@ -17,24 +18,37 @@ Leverages FullCalendar's internal drag-n-drop functionality WITHOUT a third-part
 export default class ExternalDraggable {
 
   dragging: FeaturefulElementDragging
+  settings: ExternalDraggableSettings
 
   constructor(el: HTMLElement, settings: ExternalDraggableSettings = {}) {
+    this.settings = settings
+
     let dragging = this.dragging = new FeaturefulElementDragging(el)
+    dragging.touchScrollAllowed = false
 
     if (settings.itemSelector != null) {
       dragging.pointer.selector = settings.itemSelector
     }
-    if (settings.delay != null) {
-      dragging.delay = settings.delay
-    }
-    if (settings.minDistance != null) {
-      dragging.minDistance = settings.minDistance
+
+    dragging.emitter.on('pointerdown', this.handlePointerDown)
+
+    new ExternalElementDragging(dragging, settings.eventData)
+  }
+
+  handlePointerDown = (ev: PointerDragEvent) => {
+    let { dragging } = this
+    let { delay, minDistance } = this.settings
+
+    if (minDistance == null) {
+      minDistance = globalDefaults.eventDragMinDistance
     }
-    if (settings.touchScrollAllowed != null) {
-      dragging.touchScrollAllowed = settings.touchScrollAllowed
+
+    if (delay == null) {
+      delay = globalDefaults.longPressDelay // TODO: eventually read eventLongPressDelay
     }
 
-    new ExternalElementDragging(dragging, settings.eventData)
+    dragging.minDistance = ev.isTouch ? 0 : minDistance
+    dragging.delay = ev.isTouch ? delay : 0
   }
 
   destroy() {

+ 3 - 2
src/interactions-external/ThirdPartyDraggable.ts

@@ -17,14 +17,15 @@ export default class ThirdPartyDraggable {
 
   constructor(
     containerOrSettings?: EventTarget | ThirdPartyDraggableSettings,
-    settings: ThirdPartyDraggableSettings = {}
+    settings?: ThirdPartyDraggableSettings
   ) {
     let containerEl: EventTarget = document
 
     if (containerOrSettings instanceof EventTarget) {
       containerEl = containerOrSettings
+      settings = settings || {}
     } else {
-      settings = containerOrSettings || settings
+      settings = containerOrSettings || {}
     }
 
     let dragging = this.dragging = new InferredElementDragging(containerEl as HTMLElement)

+ 1 - 4
src/interactions/EventDragging.ts

@@ -63,7 +63,7 @@ export default class EventDragging { // TODO: rename to EventSelectingAndDraggin
       eventInstanceId
     )
 
-    dragging.minDistance = ev.isTouch ? 0 : 5
+    dragging.minDistance = ev.isTouch ? 0 : component.opt('eventDragMinDistance')
     dragging.delay =
       // only do a touch delay if touch and this event hasn't been selected yet
       (ev.isTouch && eventInstanceId !== component.eventSelection) ?
@@ -74,9 +74,6 @@ export default class EventDragging { // TODO: rename to EventSelectingAndDraggin
     mirror.opacity = component.opt('dragOpacity')
     mirror.revertDuration = component.opt('dragRevertDuration')
 
-    // to prevent from cloning the sourceEl before it is selected
-    dragging.setMirrorIsVisible(false)
-
     let isValid =
       this.component.isValidSegDownEl(origTarget) &&
       !elementClosest(origTarget, '.fc-resizer')

+ 2 - 1
src/options.ts

@@ -79,7 +79,8 @@ export const globalDefaults = {
   handleWindowResize: true,
   windowResizeDelay: 100, // milliseconds before an updateSize happens
 
-  longPressDelay: 1000
+  longPressDelay: 1000,
+  eventDragMinDistance: 5 // only applies to mouse
 
 }