aboutsummaryrefslogtreecommitdiffstats
path: root/library/fullcalendar/packages/interaction
diff options
context:
space:
mode:
Diffstat (limited to 'library/fullcalendar/packages/interaction')
-rw-r--r--library/fullcalendar/packages/interaction/LICENSE.txt20
-rw-r--r--library/fullcalendar/packages/interaction/README.md8
-rw-r--r--library/fullcalendar/packages/interaction/main.d.ts323
-rw-r--r--library/fullcalendar/packages/interaction/main.esm.js2141
-rw-r--r--library/fullcalendar/packages/interaction/main.js2152
-rw-r--r--library/fullcalendar/packages/interaction/main.min.js6
-rw-r--r--library/fullcalendar/packages/interaction/package.json33
7 files changed, 0 insertions, 4683 deletions
diff --git a/library/fullcalendar/packages/interaction/LICENSE.txt b/library/fullcalendar/packages/interaction/LICENSE.txt
deleted file mode 100644
index 2149cfbef..000000000
--- a/library/fullcalendar/packages/interaction/LICENSE.txt
+++ /dev/null
@@ -1,20 +0,0 @@
-Copyright (c) 2019 Adam Shaw
-
-Permission is hereby granted, free of charge, to any person obtaining
-a copy of this software and associated documentation files (the
-"Software"), to deal in the Software without restriction, including
-without limitation the rights to use, copy, modify, merge, publish,
-distribute, sublicense, and/or sell copies of the Software, and to
-permit persons to whom the Software is furnished to do so, subject to
-the following conditions:
-
-The above copyright notice and this permission notice shall be
-included in all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
-EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
-LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
diff --git a/library/fullcalendar/packages/interaction/README.md b/library/fullcalendar/packages/interaction/README.md
deleted file mode 100644
index ee5c738ab..000000000
--- a/library/fullcalendar/packages/interaction/README.md
+++ /dev/null
@@ -1,8 +0,0 @@
-
-# FullCalendar Interaction Plugin
-
-Provides functionality for event drag-n-drop, resizing, dateClick, and selectable actions
-
-[View the docs »](https://fullcalendar.io/docs/editable)
-
-This package was created from the [FullCalendar monorepo »](https://github.com/fullcalendar/fullcalendar)
diff --git a/library/fullcalendar/packages/interaction/main.d.ts b/library/fullcalendar/packages/interaction/main.d.ts
deleted file mode 100644
index b7398ba76..000000000
--- a/library/fullcalendar/packages/interaction/main.d.ts
+++ /dev/null
@@ -1,323 +0,0 @@
-// Generated by dts-bundle v0.7.3-fork.1
-// Dependencies for this module:
-// ../../../../../@fullcalendar/core
-
-declare module '@fullcalendar/interaction' {
- import FeaturefulElementDragging from '@fullcalendar/interaction/dnd/FeaturefulElementDragging';
- const _default: import("@fullcalendar/core").PluginDef;
- export default _default;
- export { FeaturefulElementDragging };
- export { default as PointerDragging } from '@fullcalendar/interaction/dnd/PointerDragging';
- export { default as Draggable } from '@fullcalendar/interaction/interactions-external/ExternalDraggable';
- export { default as ThirdPartyDraggable } from '@fullcalendar/interaction/interactions-external/ThirdPartyDraggable';
-}
-
-declare module '@fullcalendar/interaction/dnd/FeaturefulElementDragging' {
- import { PointerDragEvent, ElementDragging } from '@fullcalendar/core';
- import PointerDragging from '@fullcalendar/interaction/dnd/PointerDragging';
- import ElementMirror from '@fullcalendar/interaction/dnd/ElementMirror';
- import AutoScroller from '@fullcalendar/interaction/dnd/AutoScroller';
- export { FeaturefulElementDragging as default, FeaturefulElementDragging };
- class FeaturefulElementDragging extends ElementDragging {
- pointer: PointerDragging;
- mirror: ElementMirror;
- autoScroller: AutoScroller;
- delay: number | null;
- minDistance: number;
- touchScrollAllowed: boolean;
- mirrorNeedsRevert: boolean;
- isInteracting: boolean;
- isDragging: boolean;
- isDelayEnded: boolean;
- isDistanceSurpassed: boolean;
- delayTimeoutId: number | null;
- constructor(containerEl: HTMLElement);
- destroy(): void;
- onPointerDown: (ev: PointerDragEvent) => void;
- onPointerMove: (ev: PointerDragEvent) => void;
- onPointerUp: (ev: PointerDragEvent) => void;
- startDelay(ev: PointerDragEvent): void;
- handleDelayEnd(ev: PointerDragEvent): void;
- handleDistanceSurpassed(ev: PointerDragEvent): void;
- tryStartDrag(ev: PointerDragEvent): void;
- tryStopDrag(ev: PointerDragEvent): void;
- stopDrag(ev: PointerDragEvent): void;
- setIgnoreMove(bool: boolean): void;
- setMirrorIsVisible(bool: boolean): void;
- setMirrorNeedsRevert(bool: boolean): void;
- setAutoScrollEnabled(bool: boolean): void;
- }
-}
-
-declare module '@fullcalendar/interaction/dnd/PointerDragging' {
- import { EmitterMixin, PointerDragEvent } from '@fullcalendar/core';
- export { PointerDragging as default, PointerDragging };
- class PointerDragging {
- containerEl: EventTarget;
- subjectEl: HTMLElement | null;
- downEl: HTMLElement | null;
- emitter: EmitterMixin;
- selector: string;
- handleSelector: string;
- shouldIgnoreMove: boolean;
- shouldWatchScroll: boolean;
- isDragging: boolean;
- isTouchDragging: boolean;
- wasTouchScroll: boolean;
- origPageX: number;
- origPageY: number;
- prevPageX: number;
- prevPageY: number;
- prevScrollX: number;
- prevScrollY: number;
- constructor(containerEl: EventTarget);
- destroy(): void;
- tryStart(ev: UIEvent): boolean;
- cleanup(): void;
- querySubjectEl(ev: UIEvent): HTMLElement;
- handleMouseDown: (ev: MouseEvent) => void;
- handleMouseMove: (ev: MouseEvent) => void;
- handleMouseUp: (ev: MouseEvent) => void;
- shouldIgnoreMouse(): number | boolean;
- handleTouchStart: (ev: TouchEvent) => void;
- handleTouchMove: (ev: TouchEvent) => void;
- handleTouchEnd: (ev: TouchEvent) => void;
- handleTouchScroll: () => void;
- cancelTouchScroll(): void;
- initScrollWatch(ev: PointerDragEvent): void;
- recordCoords(ev: PointerDragEvent): void;
- handleScroll: (ev: UIEvent) => void;
- destroyScrollWatch(): void;
- createEventFromMouse(ev: MouseEvent, isFirst?: boolean): PointerDragEvent;
- createEventFromTouch(ev: TouchEvent, isFirst?: boolean): PointerDragEvent;
- }
-}
-
-declare module '@fullcalendar/interaction/interactions-external/ExternalDraggable' {
- import { PointerDragEvent } from '@fullcalendar/core';
- import FeaturefulElementDragging from '@fullcalendar/interaction/dnd/FeaturefulElementDragging';
- import { DragMetaGenerator } from '@fullcalendar/interaction/interactions-external/ExternalElementDragging';
- export interface ExternalDraggableSettings {
- eventData?: DragMetaGenerator;
- itemSelector?: string;
- minDistance?: number;
- longPressDelay?: number;
- appendTo?: HTMLElement;
- }
- export { ExternalDraggable as default, ExternalDraggable };
- class ExternalDraggable {
- dragging: FeaturefulElementDragging;
- settings: ExternalDraggableSettings;
- constructor(el: HTMLElement, settings?: ExternalDraggableSettings);
- handlePointerDown: (ev: PointerDragEvent) => void;
- handleDragStart: (ev: PointerDragEvent) => void;
- destroy(): void;
- }
-}
-
-declare module '@fullcalendar/interaction/interactions-external/ThirdPartyDraggable' {
- import { DragMetaGenerator } from '@fullcalendar/interaction/interactions-external/ExternalElementDragging';
- import InferredElementDragging from '@fullcalendar/interaction/interactions-external/InferredElementDragging';
- export interface ThirdPartyDraggableSettings {
- eventData?: DragMetaGenerator;
- itemSelector?: string;
- mirrorSelector?: string;
- }
- export { ThirdPartyDraggable as default, ThirdPartyDraggable };
- class ThirdPartyDraggable {
- dragging: InferredElementDragging;
- constructor(containerOrSettings?: EventTarget | ThirdPartyDraggableSettings, settings?: ThirdPartyDraggableSettings);
- destroy(): void;
- }
-}
-
-declare module '@fullcalendar/interaction/dnd/ElementMirror' {
- import { Rect } from '@fullcalendar/core';
- export { ElementMirror as default, ElementMirror };
- class ElementMirror {
- isVisible: boolean;
- origScreenX?: number;
- origScreenY?: number;
- deltaX?: number;
- deltaY?: number;
- sourceEl: HTMLElement | null;
- mirrorEl: HTMLElement | null;
- sourceElRect: Rect | null;
- parentNode: HTMLElement;
- zIndex: number;
- revertDuration: number;
- start(sourceEl: HTMLElement, pageX: number, pageY: number): void;
- handleMove(pageX: number, pageY: number): void;
- setIsVisible(bool: boolean): void;
- stop(needsRevertAnimation: boolean, callback: () => void): void;
- doRevertAnimation(callback: () => void, revertDuration: number): void;
- cleanup(): void;
- updateElPosition(): void;
- getMirrorEl(): HTMLElement;
- }
-}
-
-declare module '@fullcalendar/interaction/dnd/AutoScroller' {
- import { ScrollGeomCache } from '@fullcalendar/interaction/scroll-geom-cache';
- export { AutoScroller as default, AutoScroller };
- class AutoScroller {
- isEnabled: boolean;
- scrollQuery: (Window | string)[];
- edgeThreshold: number;
- maxVelocity: number;
- pointerScreenX: number | null;
- pointerScreenY: number | null;
- isAnimating: boolean;
- scrollCaches: ScrollGeomCache[] | null;
- msSinceRequest?: number;
- everMovedUp: boolean;
- everMovedDown: boolean;
- everMovedLeft: boolean;
- everMovedRight: boolean;
- start(pageX: number, pageY: number): void;
- handleMove(pageX: number, pageY: number): void;
- stop(): void;
- requestAnimation(now: number): void;
- }
-}
-
-declare module '@fullcalendar/interaction/interactions-external/ExternalElementDragging' {
- import { Hit, PointerDragEvent, EventTuple, DatePointApi, Calendar, EventInteractionState, DragMetaInput, DragMeta, View, ElementDragging } from '@fullcalendar/core';
- import HitDragging from '@fullcalendar/interaction/interactions/HitDragging';
- export type DragMetaGenerator = DragMetaInput | ((el: HTMLElement) => DragMetaInput);
- export interface ExternalDropApi extends DatePointApi {
- draggedEl: HTMLElement;
- jsEvent: UIEvent;
- view: View;
- }
- export { ExternalElementDragging as default, ExternalElementDragging };
- class ExternalElementDragging {
- hitDragging: HitDragging;
- receivingCalendar: Calendar | null;
- droppableEvent: EventTuple | null;
- suppliedDragMeta: DragMetaGenerator | null;
- dragMeta: DragMeta | null;
- constructor(dragging: ElementDragging, suppliedDragMeta?: DragMetaGenerator);
- handleDragStart: (ev: PointerDragEvent) => void;
- buildDragMeta(subjectEl: HTMLElement): DragMeta;
- handleHitUpdate: (hit: Hit, isFinal: boolean, ev: PointerDragEvent) => void;
- handleDragEnd: (pev: PointerDragEvent) => void;
- displayDrag(nextCalendar: Calendar | null, state: EventInteractionState): void;
- clearDrag(): void;
- canDropElOnCalendar(el: HTMLElement, receivingCalendar: Calendar): boolean;
- }
-}
-
-declare module '@fullcalendar/interaction/interactions-external/InferredElementDragging' {
- import { PointerDragEvent, ElementDragging } from '@fullcalendar/core';
- import PointerDragging from '@fullcalendar/interaction/dnd/PointerDragging';
- export { InferredElementDragging as default, InferredElementDragging };
- class InferredElementDragging extends ElementDragging {
- pointer: PointerDragging;
- shouldIgnoreMove: boolean;
- mirrorSelector: string;
- currentMirrorEl: HTMLElement | null;
- constructor(containerEl: HTMLElement);
- destroy(): void;
- handlePointerDown: (ev: PointerDragEvent) => void;
- handlePointerMove: (ev: PointerDragEvent) => void;
- handlePointerUp: (ev: PointerDragEvent) => void;
- setIgnoreMove(bool: boolean): void;
- setMirrorIsVisible(bool: boolean): void;
- }
-}
-
-declare module '@fullcalendar/interaction/scroll-geom-cache' {
- import { Rect, ScrollController } from '@fullcalendar/core';
- export abstract class ScrollGeomCache extends ScrollController {
- clientRect: Rect;
- origScrollTop: number;
- origScrollLeft: number;
- protected scrollController: ScrollController;
- protected doesListening: boolean;
- protected scrollTop: number;
- protected scrollLeft: number;
- protected scrollWidth: number;
- protected scrollHeight: number;
- protected clientWidth: number;
- protected clientHeight: number;
- constructor(scrollController: ScrollController, doesListening: boolean);
- abstract getEventTarget(): EventTarget;
- abstract computeClientRect(): Rect;
- destroy(): void;
- handleScroll: () => void;
- getScrollTop(): number;
- getScrollLeft(): number;
- setScrollTop(top: number): void;
- setScrollLeft(top: number): void;
- getClientWidth(): number;
- getClientHeight(): number;
- getScrollWidth(): number;
- getScrollHeight(): number;
- handleScrollChange(): void;
- }
- export class ElementScrollGeomCache extends ScrollGeomCache {
- constructor(el: HTMLElement, doesListening: boolean);
- getEventTarget(): EventTarget;
- computeClientRect(): {
- left: number;
- right: number;
- top: number;
- bottom: number;
- };
- }
- export class WindowScrollGeomCache extends ScrollGeomCache {
- constructor(doesListening: boolean);
- getEventTarget(): EventTarget;
- computeClientRect(): Rect;
- handleScrollChange(): void;
- }
-}
-
-declare module '@fullcalendar/interaction/interactions/HitDragging' {
- import { EmitterMixin, PointerDragEvent, Point, Hit, InteractionSettingsStore, ElementDragging } from '@fullcalendar/core';
- import OffsetTracker from '@fullcalendar/interaction/OffsetTracker';
- export { HitDragging as default, HitDragging };
- class HitDragging {
- droppableStore: InteractionSettingsStore;
- dragging: ElementDragging;
- emitter: EmitterMixin;
- useSubjectCenter: boolean;
- requireInitial: boolean;
- offsetTrackers: {
- [componentUid: string]: OffsetTracker;
- };
- initialHit: Hit | null;
- movingHit: Hit | null;
- finalHit: Hit | null;
- coordAdjust?: Point;
- constructor(dragging: ElementDragging, droppableStore: InteractionSettingsStore);
- handlePointerDown: (ev: PointerDragEvent) => void;
- processFirstCoord(ev: PointerDragEvent): void;
- handleDragStart: (ev: PointerDragEvent) => void;
- handleDragMove: (ev: PointerDragEvent) => void;
- handlePointerUp: (ev: PointerDragEvent) => void;
- handleDragEnd: (ev: PointerDragEvent) => void;
- handleMove(ev: PointerDragEvent, forceHandle?: boolean): void;
- prepareHits(): void;
- releaseHits(): void;
- queryHitForOffset(offsetLeft: number, offsetTop: number): Hit | null;
- }
- export function isHitsEqual(hit0: Hit | null, hit1: Hit | null): boolean;
-}
-
-declare module '@fullcalendar/interaction/OffsetTracker' {
- import { Rect } from '@fullcalendar/core';
- import { ElementScrollGeomCache } from '@fullcalendar/interaction/scroll-geom-cache';
- export { OffsetTracker as default, OffsetTracker };
- class OffsetTracker {
- scrollCaches: ElementScrollGeomCache[];
- origRect: Rect;
- constructor(el: HTMLElement);
- destroy(): void;
- computeLeft(): number;
- computeTop(): number;
- isWithinClipping(pageX: number, pageY: number): boolean;
- }
-}
-
diff --git a/library/fullcalendar/packages/interaction/main.esm.js b/library/fullcalendar/packages/interaction/main.esm.js
deleted file mode 100644
index af9ef4074..000000000
--- a/library/fullcalendar/packages/interaction/main.esm.js
+++ /dev/null
@@ -1,2141 +0,0 @@
-/*!
-FullCalendar Interaction Plugin v4.4.2
-Docs & License: https://fullcalendar.io/
-(c) 2019 Adam Shaw
-*/
-
-import { config, elementClosest, EmitterMixin, applyStyle, whenTransitionDone, removeElement, ScrollController, ElementScrollController, computeInnerRect, WindowScrollController, preventSelection, preventContextMenu, allowSelection, allowContextMenu, ElementDragging, computeRect, getClippingParents, pointInsideRect, isDateSpansEqual, constrainPoint, intersectRects, getRectCenter, diffPoints, mapHash, rangeContainsRange, interactionSettingsToStore, Interaction, enableCursor, disableCursor, compareNumbers, getElSeg, getRelevantEvents, EventApi, createEmptyEventStore, applyMutationToEventStore, interactionSettingsStore, startOfDay, diffDates, createDuration, eventTupleToStore, isInteractionValid, parseDragMeta, elementMatches, parseEventDef, createEventInstance, globalDefaults, createPlugin } from '@fullcalendar/core';
-
-/*! *****************************************************************************
-Copyright (c) Microsoft Corporation.
-
-Permission to use, copy, modify, and/or distribute this software for any
-purpose with or without fee is hereby granted.
-
-THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
-REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
-AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
-INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
-LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
-OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
-PERFORMANCE OF THIS SOFTWARE.
-***************************************************************************** */
-/* global Reflect, Promise */
-
-var extendStatics = function(d, b) {
- extendStatics = Object.setPrototypeOf ||
- ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
- function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
- return extendStatics(d, b);
-};
-
-function __extends(d, b) {
- extendStatics(d, b);
- function __() { this.constructor = d; }
- d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-}
-
-var __assign = function() {
- __assign = Object.assign || function __assign(t) {
- for (var s, i = 1, n = arguments.length; i < n; i++) {
- s = arguments[i];
- for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];
- }
- return t;
- };
- return __assign.apply(this, arguments);
-};
-
-config.touchMouseIgnoreWait = 500;
-var ignoreMouseDepth = 0;
-var listenerCnt = 0;
-var isWindowTouchMoveCancelled = false;
-/*
-Uses a "pointer" abstraction, which monitors UI events for both mouse and touch.
-Tracks when the pointer "drags" on a certain element, meaning down+move+up.
-
-Also, tracks if there was touch-scrolling.
-Also, can prevent touch-scrolling from happening.
-Also, can fire pointermove events when scrolling happens underneath, even when no real pointer movement.
-
-emits:
-- pointerdown
-- pointermove
-- pointerup
-*/
-var PointerDragging = /** @class */ (function () {
- function PointerDragging(containerEl) {
- var _this = this;
- this.subjectEl = null;
- this.downEl = null;
- // options that can be directly assigned by caller
- this.selector = ''; // will cause subjectEl in all emitted events to be this element
- this.handleSelector = '';
- this.shouldIgnoreMove = false;
- this.shouldWatchScroll = true; // for simulating pointermove on scroll
- // internal states
- this.isDragging = false;
- this.isTouchDragging = false;
- this.wasTouchScroll = false;
- // Mouse
- // ----------------------------------------------------------------------------------------------------
- this.handleMouseDown = function (ev) {
- if (!_this.shouldIgnoreMouse() &&
- isPrimaryMouseButton(ev) &&
- _this.tryStart(ev)) {
- var pev = _this.createEventFromMouse(ev, true);
- _this.emitter.trigger('pointerdown', pev);
- _this.initScrollWatch(pev);
- if (!_this.shouldIgnoreMove) {
- document.addEventListener('mousemove', _this.handleMouseMove);
- }
- document.addEventListener('mouseup', _this.handleMouseUp);
- }
- };
- this.handleMouseMove = function (ev) {
- var pev = _this.createEventFromMouse(ev);
- _this.recordCoords(pev);
- _this.emitter.trigger('pointermove', pev);
- };
- this.handleMouseUp = function (ev) {
- document.removeEventListener('mousemove', _this.handleMouseMove);
- document.removeEventListener('mouseup', _this.handleMouseUp);
- _this.emitter.trigger('pointerup', _this.createEventFromMouse(ev));
- _this.cleanup(); // call last so that pointerup has access to props
- };
- // Touch
- // ----------------------------------------------------------------------------------------------------
- this.handleTouchStart = function (ev) {
- if (_this.tryStart(ev)) {
- _this.isTouchDragging = true;
- var pev = _this.createEventFromTouch(ev, true);
- _this.emitter.trigger('pointerdown', pev);
- _this.initScrollWatch(pev);
- // unlike mouse, need to attach to target, not document
- // https://stackoverflow.com/a/45760014
- var target = ev.target;
- if (!_this.shouldIgnoreMove) {
- target.addEventListener('touchmove', _this.handleTouchMove);
- }
- target.addEventListener('touchend', _this.handleTouchEnd);
- target.addEventListener('touchcancel', _this.handleTouchEnd); // treat it as a touch end
- // attach a handler to get called when ANY scroll action happens on the page.
- // this was impossible to do with normal on/off because 'scroll' doesn't bubble.
- // http://stackoverflow.com/a/32954565/96342
- window.addEventListener('scroll', _this.handleTouchScroll, true // useCapture
- );
- }
- };
- this.handleTouchMove = function (ev) {
- var pev = _this.createEventFromTouch(ev);
- _this.recordCoords(pev);
- _this.emitter.trigger('pointermove', pev);
- };
- this.handleTouchEnd = function (ev) {
- if (_this.isDragging) { // done to guard against touchend followed by touchcancel
- var target = ev.target;
- target.removeEventListener('touchmove', _this.handleTouchMove);
- target.removeEventListener('touchend', _this.handleTouchEnd);
- target.removeEventListener('touchcancel', _this.handleTouchEnd);
- window.removeEventListener('scroll', _this.handleTouchScroll, true); // useCaptured=true
- _this.emitter.trigger('pointerup', _this.createEventFromTouch(ev));
- _this.cleanup(); // call last so that pointerup has access to props
- _this.isTouchDragging = false;
- startIgnoringMouse();
- }
- };
- this.handleTouchScroll = function () {
- _this.wasTouchScroll = true;
- };
- this.handleScroll = function (ev) {
- if (!_this.shouldIgnoreMove) {
- var pageX = (window.pageXOffset - _this.prevScrollX) + _this.prevPageX;
- var pageY = (window.pageYOffset - _this.prevScrollY) + _this.prevPageY;
- _this.emitter.trigger('pointermove', {
- origEvent: ev,
- isTouch: _this.isTouchDragging,
- subjectEl: _this.subjectEl,
- pageX: pageX,
- pageY: pageY,
- deltaX: pageX - _this.origPageX,
- deltaY: pageY - _this.origPageY
- });
- }
- };
- this.containerEl = containerEl;
- this.emitter = new EmitterMixin();
- containerEl.addEventListener('mousedown', this.handleMouseDown);
- containerEl.addEventListener('touchstart', this.handleTouchStart, { passive: true });
- listenerCreated();
- }
- PointerDragging.prototype.destroy = function () {
- this.containerEl.removeEventListener('mousedown', this.handleMouseDown);
- this.containerEl.removeEventListener('touchstart', this.handleTouchStart, { passive: true });
- listenerDestroyed();
- };
- PointerDragging.prototype.tryStart = function (ev) {
- var subjectEl = this.querySubjectEl(ev);
- var downEl = ev.target;
- if (subjectEl &&
- (!this.handleSelector || elementClosest(downEl, this.handleSelector))) {
- this.subjectEl = subjectEl;
- this.downEl = downEl;
- this.isDragging = true; // do this first so cancelTouchScroll will work
- this.wasTouchScroll = false;
- return true;
- }
- return false;
- };
- PointerDragging.prototype.cleanup = function () {
- isWindowTouchMoveCancelled = false;
- this.isDragging = false;
- this.subjectEl = null;
- this.downEl = null;
- // keep wasTouchScroll around for later access
- this.destroyScrollWatch();
- };
- PointerDragging.prototype.querySubjectEl = function (ev) {
- if (this.selector) {
- return elementClosest(ev.target, this.selector);
- }
- else {
- return this.containerEl;
- }
- };
- PointerDragging.prototype.shouldIgnoreMouse = function () {
- return ignoreMouseDepth || this.isTouchDragging;
- };
- // can be called by user of this class, to cancel touch-based scrolling for the current drag
- PointerDragging.prototype.cancelTouchScroll = function () {
- if (this.isDragging) {
- isWindowTouchMoveCancelled = true;
- }
- };
- // Scrolling that simulates pointermoves
- // ----------------------------------------------------------------------------------------------------
- PointerDragging.prototype.initScrollWatch = function (ev) {
- if (this.shouldWatchScroll) {
- this.recordCoords(ev);
- window.addEventListener('scroll', this.handleScroll, true); // useCapture=true
- }
- };
- PointerDragging.prototype.recordCoords = function (ev) {
- if (this.shouldWatchScroll) {
- this.prevPageX = ev.pageX;
- this.prevPageY = ev.pageY;
- this.prevScrollX = window.pageXOffset;
- this.prevScrollY = window.pageYOffset;
- }
- };
- PointerDragging.prototype.destroyScrollWatch = function () {
- if (this.shouldWatchScroll) {
- window.removeEventListener('scroll', this.handleScroll, true); // useCaptured=true
- }
- };
- // Event Normalization
- // ----------------------------------------------------------------------------------------------------
- PointerDragging.prototype.createEventFromMouse = function (ev, isFirst) {
- var deltaX = 0;
- var deltaY = 0;
- // TODO: repeat code
- if (isFirst) {
- this.origPageX = ev.pageX;
- this.origPageY = ev.pageY;
- }
- else {
- deltaX = ev.pageX - this.origPageX;
- deltaY = ev.pageY - this.origPageY;
- }
- return {
- origEvent: ev,
- isTouch: false,
- subjectEl: this.subjectEl,
- pageX: ev.pageX,
- pageY: ev.pageY,
- deltaX: deltaX,
- deltaY: deltaY
- };
- };
- PointerDragging.prototype.createEventFromTouch = function (ev, isFirst) {
- var touches = ev.touches;
- var pageX;
- var pageY;
- var deltaX = 0;
- var deltaY = 0;
- // if touch coords available, prefer,
- // because FF would give bad ev.pageX ev.pageY
- if (touches && touches.length) {
- pageX = touches[0].pageX;
- pageY = touches[0].pageY;
- }
- else {
- pageX = ev.pageX;
- pageY = ev.pageY;
- }
- // TODO: repeat code
- if (isFirst) {
- this.origPageX = pageX;
- this.origPageY = pageY;
- }
- else {
- deltaX = pageX - this.origPageX;
- deltaY = pageY - this.origPageY;
- }
- return {
- origEvent: ev,
- isTouch: true,
- subjectEl: this.subjectEl,
- pageX: pageX,
- pageY: pageY,
- deltaX: deltaX,
- deltaY: deltaY
- };
- };
- return PointerDragging;
-}());
-// Returns a boolean whether this was a left mouse click and no ctrl key (which means right click on Mac)
-function isPrimaryMouseButton(ev) {
- return ev.button === 0 && !ev.ctrlKey;
-}
-// Ignoring fake mouse events generated by touch
-// ----------------------------------------------------------------------------------------------------
-function startIgnoringMouse() {
- ignoreMouseDepth++;
- setTimeout(function () {
- ignoreMouseDepth--;
- }, config.touchMouseIgnoreWait);
-}
-// We want to attach touchmove as early as possible for Safari
-// ----------------------------------------------------------------------------------------------------
-function listenerCreated() {
- if (!(listenerCnt++)) {
- window.addEventListener('touchmove', onWindowTouchMove, { passive: false });
- }
-}
-function listenerDestroyed() {
- if (!(--listenerCnt)) {
- window.removeEventListener('touchmove', onWindowTouchMove, { passive: false });
- }
-}
-function onWindowTouchMove(ev) {
- if (isWindowTouchMoveCancelled) {
- ev.preventDefault();
- }
-}
-
-/*
-An effect in which an element follows the movement of a pointer across the screen.
-The moving element is a clone of some other element.
-Must call start + handleMove + stop.
-*/
-var ElementMirror = /** @class */ (function () {
- function ElementMirror() {
- this.isVisible = false; // must be explicitly enabled
- this.sourceEl = null;
- this.mirrorEl = null;
- this.sourceElRect = null; // screen coords relative to viewport
- // options that can be set directly by caller
- this.parentNode = document.body;
- this.zIndex = 9999;
- this.revertDuration = 0;
- }
- ElementMirror.prototype.start = function (sourceEl, pageX, pageY) {
- this.sourceEl = sourceEl;
- this.sourceElRect = this.sourceEl.getBoundingClientRect();
- this.origScreenX = pageX - window.pageXOffset;
- this.origScreenY = pageY - window.pageYOffset;
- this.deltaX = 0;
- this.deltaY = 0;
- this.updateElPosition();
- };
- ElementMirror.prototype.handleMove = function (pageX, pageY) {
- this.deltaX = (pageX - window.pageXOffset) - this.origScreenX;
- this.deltaY = (pageY - window.pageYOffset) - this.origScreenY;
- this.updateElPosition();
- };
- // can be called before start
- ElementMirror.prototype.setIsVisible = function (bool) {
- if (bool) {
- if (!this.isVisible) {
- if (this.mirrorEl) {
- this.mirrorEl.style.display = '';
- }
- this.isVisible = bool; // needs to happen before updateElPosition
- this.updateElPosition(); // because was not updating the position while invisible
- }
- }
- else {
- if (this.isVisible) {
- if (this.mirrorEl) {
- this.mirrorEl.style.display = 'none';
- }
- this.isVisible = bool;
- }
- }
- };
- // always async
- ElementMirror.prototype.stop = function (needsRevertAnimation, callback) {
- var _this = this;
- var done = function () {
- _this.cleanup();
- callback();
- };
- if (needsRevertAnimation &&
- this.mirrorEl &&
- this.isVisible &&
- this.revertDuration && // if 0, transition won't work
- (this.deltaX || this.deltaY) // if same coords, transition won't work
- ) {
- this.doRevertAnimation(done, this.revertDuration);
- }
- else {
- setTimeout(done, 0);
- }
- };
- ElementMirror.prototype.doRevertAnimation = function (callback, revertDuration) {
- var mirrorEl = this.mirrorEl;
- var finalSourceElRect = this.sourceEl.getBoundingClientRect(); // because autoscrolling might have happened
- mirrorEl.style.transition =
- 'top ' + revertDuration + 'ms,' +
- 'left ' + revertDuration + 'ms';
- applyStyle(mirrorEl, {
- left: finalSourceElRect.left,
- top: finalSourceElRect.top
- });
- whenTransitionDone(mirrorEl, function () {
- mirrorEl.style.transition = '';
- callback();
- });
- };
- ElementMirror.prototype.cleanup = function () {
- if (this.mirrorEl) {
- removeElement(this.mirrorEl);
- this.mirrorEl = null;
- }
- this.sourceEl = null;
- };
- ElementMirror.prototype.updateElPosition = function () {
- if (this.sourceEl && this.isVisible) {
- applyStyle(this.getMirrorEl(), {
- left: this.sourceElRect.left + this.deltaX,
- top: this.sourceElRect.top + this.deltaY
- });
- }
- };
- ElementMirror.prototype.getMirrorEl = function () {
- var sourceElRect = this.sourceElRect;
- var mirrorEl = this.mirrorEl;
- if (!mirrorEl) {
- mirrorEl = this.mirrorEl = this.sourceEl.cloneNode(true); // cloneChildren=true
- // we don't want long taps or any mouse interaction causing selection/menus.
- // would use preventSelection(), but that prevents selectstart, causing problems.
- mirrorEl.classList.add('fc-unselectable');
- mirrorEl.classList.add('fc-dragging');
- applyStyle(mirrorEl, {
- position: 'fixed',
- zIndex: this.zIndex,
- visibility: '',
- boxSizing: 'border-box',
- width: sourceElRect.right - sourceElRect.left,
- height: sourceElRect.bottom - sourceElRect.top,
- right: 'auto',
- bottom: 'auto',
- margin: 0
- });
- this.parentNode.appendChild(mirrorEl);
- }
- return mirrorEl;
- };
- return ElementMirror;
-}());
-
-/*
-Is a cache for a given element's scroll information (all the info that ScrollController stores)
-in addition the "client rectangle" of the element.. the area within the scrollbars.
-
-The cache can be in one of two modes:
-- doesListening:false - ignores when the container is scrolled by someone else
-- doesListening:true - watch for scrolling and update the cache
-*/
-var ScrollGeomCache = /** @class */ (function (_super) {
- __extends(ScrollGeomCache, _super);
- function ScrollGeomCache(scrollController, doesListening) {
- var _this = _super.call(this) || this;
- _this.handleScroll = function () {
- _this.scrollTop = _this.scrollController.getScrollTop();
- _this.scrollLeft = _this.scrollController.getScrollLeft();
- _this.handleScrollChange();
- };
- _this.scrollController = scrollController;
- _this.doesListening = doesListening;
- _this.scrollTop = _this.origScrollTop = scrollController.getScrollTop();
- _this.scrollLeft = _this.origScrollLeft = scrollController.getScrollLeft();
- _this.scrollWidth = scrollController.getScrollWidth();
- _this.scrollHeight = scrollController.getScrollHeight();
- _this.clientWidth = scrollController.getClientWidth();
- _this.clientHeight = scrollController.getClientHeight();
- _this.clientRect = _this.computeClientRect(); // do last in case it needs cached values
- if (_this.doesListening) {
- _this.getEventTarget().addEventListener('scroll', _this.handleScroll);
- }
- return _this;
- }
- ScrollGeomCache.prototype.destroy = function () {
- if (this.doesListening) {
- this.getEventTarget().removeEventListener('scroll', this.handleScroll);
- }
- };
- ScrollGeomCache.prototype.getScrollTop = function () {
- return this.scrollTop;
- };
- ScrollGeomCache.prototype.getScrollLeft = function () {
- return this.scrollLeft;
- };
- ScrollGeomCache.prototype.setScrollTop = function (top) {
- this.scrollController.setScrollTop(top);
- if (!this.doesListening) {
- // we are not relying on the element to normalize out-of-bounds scroll values
- // so we need to sanitize ourselves
- this.scrollTop = Math.max(Math.min(top, this.getMaxScrollTop()), 0);
- this.handleScrollChange();
- }
- };
- ScrollGeomCache.prototype.setScrollLeft = function (top) {
- this.scrollController.setScrollLeft(top);
- if (!this.doesListening) {
- // we are not relying on the element to normalize out-of-bounds scroll values
- // so we need to sanitize ourselves
- this.scrollLeft = Math.max(Math.min(top, this.getMaxScrollLeft()), 0);
- this.handleScrollChange();
- }
- };
- ScrollGeomCache.prototype.getClientWidth = function () {
- return this.clientWidth;
- };
- ScrollGeomCache.prototype.getClientHeight = function () {
- return this.clientHeight;
- };
- ScrollGeomCache.prototype.getScrollWidth = function () {
- return this.scrollWidth;
- };
- ScrollGeomCache.prototype.getScrollHeight = function () {
- return this.scrollHeight;
- };
- ScrollGeomCache.prototype.handleScrollChange = function () {
- };
- return ScrollGeomCache;
-}(ScrollController));
-var ElementScrollGeomCache = /** @class */ (function (_super) {
- __extends(ElementScrollGeomCache, _super);
- function ElementScrollGeomCache(el, doesListening) {
- return _super.call(this, new ElementScrollController(el), doesListening) || this;
- }
- ElementScrollGeomCache.prototype.getEventTarget = function () {
- return this.scrollController.el;
- };
- ElementScrollGeomCache.prototype.computeClientRect = function () {
- return computeInnerRect(this.scrollController.el);
- };
- return ElementScrollGeomCache;
-}(ScrollGeomCache));
-var WindowScrollGeomCache = /** @class */ (function (_super) {
- __extends(WindowScrollGeomCache, _super);
- function WindowScrollGeomCache(doesListening) {
- return _super.call(this, new WindowScrollController(), doesListening) || this;
- }
- WindowScrollGeomCache.prototype.getEventTarget = function () {
- return window;
- };
- WindowScrollGeomCache.prototype.computeClientRect = function () {
- return {
- left: this.scrollLeft,
- right: this.scrollLeft + this.clientWidth,
- top: this.scrollTop,
- bottom: this.scrollTop + this.clientHeight
- };
- };
- // the window is the only scroll object that changes it's rectangle relative
- // to the document's topleft as it scrolls
- WindowScrollGeomCache.prototype.handleScrollChange = function () {
- this.clientRect = this.computeClientRect();
- };
- return WindowScrollGeomCache;
-}(ScrollGeomCache));
-
-// If available we are using native "performance" API instead of "Date"
-// Read more about it on MDN:
-// https://developer.mozilla.org/en-US/docs/Web/API/Performance
-var getTime = typeof performance === 'function' ? performance.now : Date.now;
-/*
-For a pointer interaction, automatically scrolls certain scroll containers when the pointer
-approaches the edge.
-
-The caller must call start + handleMove + stop.
-*/
-var AutoScroller = /** @class */ (function () {
- function AutoScroller() {
- var _this = this;
- // options that can be set by caller
- this.isEnabled = true;
- this.scrollQuery = [window, '.fc-scroller'];
- this.edgeThreshold = 50; // pixels
- this.maxVelocity = 300; // pixels per second
- // internal state
- this.pointerScreenX = null;
- this.pointerScreenY = null;
- this.isAnimating = false;
- this.scrollCaches = null;
- // protect against the initial pointerdown being too close to an edge and starting the scroll
- this.everMovedUp = false;
- this.everMovedDown = false;
- this.everMovedLeft = false;
- this.everMovedRight = false;
- this.animate = function () {
- if (_this.isAnimating) { // wasn't cancelled between animation calls
- var edge = _this.computeBestEdge(_this.pointerScreenX + window.pageXOffset, _this.pointerScreenY + window.pageYOffset);
- if (edge) {
- var now = getTime();
- _this.handleSide(edge, (now - _this.msSinceRequest) / 1000);
- _this.requestAnimation(now);
- }
- else {
- _this.isAnimating = false; // will stop animation
- }
- }
- };
- }
- AutoScroller.prototype.start = function (pageX, pageY) {
- if (this.isEnabled) {
- this.scrollCaches = this.buildCaches();
- this.pointerScreenX = null;
- this.pointerScreenY = null;
- this.everMovedUp = false;
- this.everMovedDown = false;
- this.everMovedLeft = false;
- this.everMovedRight = false;
- this.handleMove(pageX, pageY);
- }
- };
- AutoScroller.prototype.handleMove = function (pageX, pageY) {
- if (this.isEnabled) {
- var pointerScreenX = pageX - window.pageXOffset;
- var pointerScreenY = pageY - window.pageYOffset;
- var yDelta = this.pointerScreenY === null ? 0 : pointerScreenY - this.pointerScreenY;
- var xDelta = this.pointerScreenX === null ? 0 : pointerScreenX - this.pointerScreenX;
- if (yDelta < 0) {
- this.everMovedUp = true;
- }
- else if (yDelta > 0) {
- this.everMovedDown = true;
- }
- if (xDelta < 0) {
- this.everMovedLeft = true;
- }
- else if (xDelta > 0) {
- this.everMovedRight = true;
- }
- this.pointerScreenX = pointerScreenX;
- this.pointerScreenY = pointerScreenY;
- if (!this.isAnimating) {
- this.isAnimating = true;
- this.requestAnimation(getTime());
- }
- }
- };
- AutoScroller.prototype.stop = function () {
- if (this.isEnabled) {
- this.isAnimating = false; // will stop animation
- for (var _i = 0, _a = this.scrollCaches; _i < _a.length; _i++) {
- var scrollCache = _a[_i];
- scrollCache.destroy();
- }
- this.scrollCaches = null;
- }
- };
- AutoScroller.prototype.requestAnimation = function (now) {
- this.msSinceRequest = now;
- requestAnimationFrame(this.animate);
- };
- AutoScroller.prototype.handleSide = function (edge, seconds) {
- var scrollCache = edge.scrollCache;
- var edgeThreshold = this.edgeThreshold;
- var invDistance = edgeThreshold - edge.distance;
- var velocity = // the closer to the edge, the faster we scroll
- (invDistance * invDistance) / (edgeThreshold * edgeThreshold) * // quadratic
- this.maxVelocity * seconds;
- var sign = 1;
- switch (edge.name) {
- case 'left':
- sign = -1;
- // falls through
- case 'right':
- scrollCache.setScrollLeft(scrollCache.getScrollLeft() + velocity * sign);
- break;
- case 'top':
- sign = -1;
- // falls through
- case 'bottom':
- scrollCache.setScrollTop(scrollCache.getScrollTop() + velocity * sign);
- break;
- }
- };
- // left/top are relative to document topleft
- AutoScroller.prototype.computeBestEdge = function (left, top) {
- var edgeThreshold = this.edgeThreshold;
- var bestSide = null;
- for (var _i = 0, _a = this.scrollCaches; _i < _a.length; _i++) {
- var scrollCache = _a[_i];
- var rect = scrollCache.clientRect;
- var leftDist = left - rect.left;
- var rightDist = rect.right - left;
- var topDist = top - rect.top;
- var bottomDist = rect.bottom - top;
- // completely within the rect?
- if (leftDist >= 0 && rightDist >= 0 && topDist >= 0 && bottomDist >= 0) {
- if (topDist <= edgeThreshold && this.everMovedUp && scrollCache.canScrollUp() &&
- (!bestSide || bestSide.distance > topDist)) {
- bestSide = { scrollCache: scrollCache, name: 'top', distance: topDist };
- }
- if (bottomDist <= edgeThreshold && this.everMovedDown && scrollCache.canScrollDown() &&
- (!bestSide || bestSide.distance > bottomDist)) {
- bestSide = { scrollCache: scrollCache, name: 'bottom', distance: bottomDist };
- }
- if (leftDist <= edgeThreshold && this.everMovedLeft && scrollCache.canScrollLeft() &&
- (!bestSide || bestSide.distance > leftDist)) {
- bestSide = { scrollCache: scrollCache, name: 'left', distance: leftDist };
- }
- if (rightDist <= edgeThreshold && this.everMovedRight && scrollCache.canScrollRight() &&
- (!bestSide || bestSide.distance > rightDist)) {
- bestSide = { scrollCache: scrollCache, name: 'right', distance: rightDist };
- }
- }
- }
- return bestSide;
- };
- AutoScroller.prototype.buildCaches = function () {
- return this.queryScrollEls().map(function (el) {
- if (el === window) {
- return new WindowScrollGeomCache(false); // false = don't listen to user-generated scrolls
- }
- else {
- return new ElementScrollGeomCache(el, false); // false = don't listen to user-generated scrolls
- }
- });
- };
- AutoScroller.prototype.queryScrollEls = function () {
- var els = [];
- for (var _i = 0, _a = this.scrollQuery; _i < _a.length; _i++) {
- var query = _a[_i];
- if (typeof query === 'object') {
- els.push(query);
- }
- else {
- els.push.apply(els, Array.prototype.slice.call(document.querySelectorAll(query)));
- }
- }
- return els;
- };
- return AutoScroller;
-}());
-
-/*
-Monitors dragging on an element. Has a number of high-level features:
-- minimum distance required before dragging
-- minimum wait time ("delay") before dragging
-- a mirror element that follows the pointer
-*/
-var FeaturefulElementDragging = /** @class */ (function (_super) {
- __extends(FeaturefulElementDragging, _super);
- function FeaturefulElementDragging(containerEl) {
- var _this = _super.call(this, containerEl) || this;
- // options that can be directly set by caller
- // the caller can also set the PointerDragging's options as well
- _this.delay = null;
- _this.minDistance = 0;
- _this.touchScrollAllowed = true; // prevents drag from starting and blocks scrolling during drag
- _this.mirrorNeedsRevert = false;
- _this.isInteracting = false; // is the user validly moving the pointer? lasts until pointerup
- _this.isDragging = false; // is it INTENTFULLY dragging? lasts until after revert animation
- _this.isDelayEnded = false;
- _this.isDistanceSurpassed = false;
- _this.delayTimeoutId = null;
- _this.onPointerDown = function (ev) {
- if (!_this.isDragging) { // so new drag doesn't happen while revert animation is going
- _this.isInteracting = true;
- _this.isDelayEnded = false;
- _this.isDistanceSurpassed = false;
- preventSelection(document.body);
- preventContextMenu(document.body);
- // prevent links from being visited if there's an eventual drag.
- // also prevents selection in older browsers (maybe?).
- // not necessary for touch, besides, browser would complain about passiveness.
- if (!ev.isTouch) {
- ev.origEvent.preventDefault();
- }
- _this.emitter.trigger('pointerdown', ev);
- if (!_this.pointer.shouldIgnoreMove) {
- // actions related to initiating dragstart+dragmove+dragend...
- _this.mirror.setIsVisible(false); // reset. caller must set-visible
- _this.mirror.start(ev.subjectEl, ev.pageX, ev.pageY); // must happen on first pointer down
- _this.startDelay(ev);
- if (!_this.minDistance) {
- _this.handleDistanceSurpassed(ev);
- }
- }
- }
- };
- _this.onPointerMove = function (ev) {
- if (_this.isInteracting) { // if false, still waiting for previous drag's revert
- _this.emitter.trigger('pointermove', ev);
- if (!_this.isDistanceSurpassed) {
- var minDistance = _this.minDistance;
- var distanceSq = void 0; // current distance from the origin, squared
- var deltaX = ev.deltaX, deltaY = ev.deltaY;
- distanceSq = deltaX * deltaX + deltaY * deltaY;
- if (distanceSq >= minDistance * minDistance) { // use pythagorean theorem
- _this.handleDistanceSurpassed(ev);
- }
- }
- if (_this.isDragging) {
- // a real pointer move? (not one simulated by scrolling)
- if (ev.origEvent.type !== 'scroll') {
- _this.mirror.handleMove(ev.pageX, ev.pageY);
- _this.autoScroller.handleMove(ev.pageX, ev.pageY);
- }
- _this.emitter.trigger('dragmove', ev);
- }
- }
- };
- _this.onPointerUp = function (ev) {
- if (_this.isInteracting) { // if false, still waiting for previous drag's revert
- _this.isInteracting = false;
- allowSelection(document.body);
- allowContextMenu(document.body);
- _this.emitter.trigger('pointerup', ev); // can potentially set mirrorNeedsRevert
- if (_this.isDragging) {
- _this.autoScroller.stop();
- _this.tryStopDrag(ev); // which will stop the mirror
- }
- if (_this.delayTimeoutId) {
- clearTimeout(_this.delayTimeoutId);
- _this.delayTimeoutId = null;
- }
- }
- };
- var pointer = _this.pointer = new PointerDragging(containerEl);
- pointer.emitter.on('pointerdown', _this.onPointerDown);
- pointer.emitter.on('pointermove', _this.onPointerMove);
- pointer.emitter.on('pointerup', _this.onPointerUp);
- _this.mirror = new ElementMirror();
- _this.autoScroller = new AutoScroller();
- return _this;
- }
- FeaturefulElementDragging.prototype.destroy = function () {
- this.pointer.destroy();
- };
- FeaturefulElementDragging.prototype.startDelay = function (ev) {
- var _this = this;
- if (typeof this.delay === 'number') {
- this.delayTimeoutId = setTimeout(function () {
- _this.delayTimeoutId = null;
- _this.handleDelayEnd(ev);
- }, this.delay); // not assignable to number!
- }
- else {
- this.handleDelayEnd(ev);
- }
- };
- FeaturefulElementDragging.prototype.handleDelayEnd = function (ev) {
- this.isDelayEnded = true;
- this.tryStartDrag(ev);
- };
- FeaturefulElementDragging.prototype.handleDistanceSurpassed = function (ev) {
- this.isDistanceSurpassed = true;
- this.tryStartDrag(ev);
- };
- FeaturefulElementDragging.prototype.tryStartDrag = function (ev) {
- if (this.isDelayEnded && this.isDistanceSurpassed) {
- if (!this.pointer.wasTouchScroll || this.touchScrollAllowed) {
- this.isDragging = true;
- this.mirrorNeedsRevert = false;
- this.autoScroller.start(ev.pageX, ev.pageY);
- this.emitter.trigger('dragstart', ev);
- if (this.touchScrollAllowed === false) {
- this.pointer.cancelTouchScroll();
- }
- }
- }
- };
- FeaturefulElementDragging.prototype.tryStopDrag = function (ev) {
- // .stop() is ALWAYS asynchronous, which we NEED because we want all pointerup events
- // that come from the document to fire beforehand. much more convenient this way.
- this.mirror.stop(this.mirrorNeedsRevert, this.stopDrag.bind(this, ev) // bound with args
- );
- };
- FeaturefulElementDragging.prototype.stopDrag = function (ev) {
- this.isDragging = false;
- this.emitter.trigger('dragend', ev);
- };
- // fill in the implementations...
- FeaturefulElementDragging.prototype.setIgnoreMove = function (bool) {
- this.pointer.shouldIgnoreMove = bool;
- };
- FeaturefulElementDragging.prototype.setMirrorIsVisible = function (bool) {
- this.mirror.setIsVisible(bool);
- };
- FeaturefulElementDragging.prototype.setMirrorNeedsRevert = function (bool) {
- this.mirrorNeedsRevert = bool;
- };
- FeaturefulElementDragging.prototype.setAutoScrollEnabled = function (bool) {
- this.autoScroller.isEnabled = bool;
- };
- return FeaturefulElementDragging;
-}(ElementDragging));
-
-/*
-When this class is instantiated, it records the offset of an element (relative to the document topleft),
-and continues to monitor scrolling, updating the cached coordinates if it needs to.
-Does not access the DOM after instantiation, so highly performant.
-
-Also keeps track of all scrolling/overflow:hidden containers that are parents of the given element
-and an determine if a given point is inside the combined clipping rectangle.
-*/
-var OffsetTracker = /** @class */ (function () {
- function OffsetTracker(el) {
- this.origRect = computeRect(el);
- // will work fine for divs that have overflow:hidden
- this.scrollCaches = getClippingParents(el).map(function (el) {
- return new ElementScrollGeomCache(el, true); // listen=true
- });
- }
- OffsetTracker.prototype.destroy = function () {
- for (var _i = 0, _a = this.scrollCaches; _i < _a.length; _i++) {
- var scrollCache = _a[_i];
- scrollCache.destroy();
- }
- };
- OffsetTracker.prototype.computeLeft = function () {
- var left = this.origRect.left;
- for (var _i = 0, _a = this.scrollCaches; _i < _a.length; _i++) {
- var scrollCache = _a[_i];
- left += scrollCache.origScrollLeft - scrollCache.getScrollLeft();
- }
- return left;
- };
- OffsetTracker.prototype.computeTop = function () {
- var top = this.origRect.top;
- for (var _i = 0, _a = this.scrollCaches; _i < _a.length; _i++) {
- var scrollCache = _a[_i];
- top += scrollCache.origScrollTop - scrollCache.getScrollTop();
- }
- return top;
- };
- OffsetTracker.prototype.isWithinClipping = function (pageX, pageY) {
- var point = { left: pageX, top: pageY };
- for (var _i = 0, _a = this.scrollCaches; _i < _a.length; _i++) {
- var scrollCache = _a[_i];
- if (!isIgnoredClipping(scrollCache.getEventTarget()) &&
- !pointInsideRect(point, scrollCache.clientRect)) {
- return false;
- }
- }
- return true;
- };
- return OffsetTracker;
-}());
-// certain clipping containers should never constrain interactions, like <html> and <body>
-// https://github.com/fullcalendar/fullcalendar/issues/3615
-function isIgnoredClipping(node) {
- var tagName = node.tagName;
- return tagName === 'HTML' || tagName === 'BODY';
-}
-
-/*
-Tracks movement over multiple droppable areas (aka "hits")
-that exist in one or more DateComponents.
-Relies on an existing draggable.
-
-emits:
-- pointerdown
-- dragstart
-- hitchange - fires initially, even if not over a hit
-- pointerup
-- (hitchange - again, to null, if ended over a hit)
-- dragend
-*/
-var HitDragging = /** @class */ (function () {
- function HitDragging(dragging, droppableStore) {
- var _this = this;
- // options that can be set by caller
- this.useSubjectCenter = false;
- this.requireInitial = true; // if doesn't start out on a hit, won't emit any events
- this.initialHit = null;
- this.movingHit = null;
- this.finalHit = null; // won't ever be populated if shouldIgnoreMove
- this.handlePointerDown = function (ev) {
- var dragging = _this.dragging;
- _this.initialHit = null;
- _this.movingHit = null;
- _this.finalHit = null;
- _this.prepareHits();
- _this.processFirstCoord(ev);
- if (_this.initialHit || !_this.requireInitial) {
- dragging.setIgnoreMove(false);
- _this.emitter.trigger('pointerdown', ev); // TODO: fire this before computing processFirstCoord, so listeners can cancel. this gets fired by almost every handler :(
- }
- else {
- dragging.setIgnoreMove(true);
- }
- };
- this.handleDragStart = function (ev) {
- _this.emitter.trigger('dragstart', ev);
- _this.handleMove(ev, true); // force = fire even if initially null
- };
- this.handleDragMove = function (ev) {
- _this.emitter.trigger('dragmove', ev);
- _this.handleMove(ev);
- };
- this.handlePointerUp = function (ev) {
- _this.releaseHits();
- _this.emitter.trigger('pointerup', ev);
- };
- this.handleDragEnd = function (ev) {
- if (_this.movingHit) {
- _this.emitter.trigger('hitupdate', null, true, ev);
- }
- _this.finalHit = _this.movingHit;
- _this.movingHit = null;
- _this.emitter.trigger('dragend', ev);
- };
- this.droppableStore = droppableStore;
- dragging.emitter.on('pointerdown', this.handlePointerDown);
- dragging.emitter.on('dragstart', this.handleDragStart);
- dragging.emitter.on('dragmove', this.handleDragMove);
- dragging.emitter.on('pointerup', this.handlePointerUp);
- dragging.emitter.on('dragend', this.handleDragEnd);
- this.dragging = dragging;
- this.emitter = new EmitterMixin();
- }
- // sets initialHit
- // sets coordAdjust
- HitDragging.prototype.processFirstCoord = function (ev) {
- var origPoint = { left: ev.pageX, top: ev.pageY };
- var adjustedPoint = origPoint;
- var subjectEl = ev.subjectEl;
- var subjectRect;
- if (subjectEl !== document) {
- subjectRect = computeRect(subjectEl);
- adjustedPoint = constrainPoint(adjustedPoint, subjectRect);
- }
- var initialHit = this.initialHit = this.queryHitForOffset(adjustedPoint.left, adjustedPoint.top);
- if (initialHit) {
- if (this.useSubjectCenter && subjectRect) {
- var slicedSubjectRect = intersectRects(subjectRect, initialHit.rect);
- if (slicedSubjectRect) {
- adjustedPoint = getRectCenter(slicedSubjectRect);
- }
- }
- this.coordAdjust = diffPoints(adjustedPoint, origPoint);
- }
- else {
- this.coordAdjust = { left: 0, top: 0 };
- }
- };
- HitDragging.prototype.handleMove = function (ev, forceHandle) {
- var hit = this.queryHitForOffset(ev.pageX + this.coordAdjust.left, ev.pageY + this.coordAdjust.top);
- if (forceHandle || !isHitsEqual(this.movingHit, hit)) {
- this.movingHit = hit;
- this.emitter.trigger('hitupdate', hit, false, ev);
- }
- };
- HitDragging.prototype.prepareHits = function () {
- this.offsetTrackers = mapHash(this.droppableStore, function (interactionSettings) {
- interactionSettings.component.buildPositionCaches();
- return new OffsetTracker(interactionSettings.el);
- });
- };
- HitDragging.prototype.releaseHits = function () {
- var offsetTrackers = this.offsetTrackers;
- for (var id in offsetTrackers) {
- offsetTrackers[id].destroy();
- }
- this.offsetTrackers = {};
- };
- HitDragging.prototype.queryHitForOffset = function (offsetLeft, offsetTop) {
- var _a = this, droppableStore = _a.droppableStore, offsetTrackers = _a.offsetTrackers;
- var bestHit = null;
- for (var id in droppableStore) {
- var component = droppableStore[id].component;
- var offsetTracker = offsetTrackers[id];
- if (offsetTracker.isWithinClipping(offsetLeft, offsetTop)) {
- var originLeft = offsetTracker.computeLeft();
- var originTop = offsetTracker.computeTop();
- var positionLeft = offsetLeft - originLeft;
- var positionTop = offsetTop - originTop;
- var origRect = offsetTracker.origRect;
- var width = origRect.right - origRect.left;
- var height = origRect.bottom - origRect.top;
- if (
- // must be within the element's bounds
- positionLeft >= 0 && positionLeft < width &&
- positionTop >= 0 && positionTop < height) {
- var hit = component.queryHit(positionLeft, positionTop, width, height);
- if (hit &&
- (
- // make sure the hit is within activeRange, meaning it's not a deal cell
- !component.props.dateProfile || // hack for DayTile
- rangeContainsRange(component.props.dateProfile.activeRange, hit.dateSpan.range)) &&
- (!bestHit || hit.layer > bestHit.layer)) {
- // TODO: better way to re-orient rectangle
- hit.rect.left += originLeft;
- hit.rect.right += originLeft;
- hit.rect.top += originTop;
- hit.rect.bottom += originTop;
- bestHit = hit;
- }
- }
- }
- }
- return bestHit;
- };
- return HitDragging;
-}());
-function isHitsEqual(hit0, hit1) {
- if (!hit0 && !hit1) {
- return true;
- }
- if (Boolean(hit0) !== Boolean(hit1)) {
- return false;
- }
- return isDateSpansEqual(hit0.dateSpan, hit1.dateSpan);
-}
-
-/*
-Monitors when the user clicks on a specific date/time of a component.
-A pointerdown+pointerup on the same "hit" constitutes a click.
-*/
-var DateClicking = /** @class */ (function (_super) {
- __extends(DateClicking, _super);
- function DateClicking(settings) {
- var _this = _super.call(this, settings) || this;
- _this.handlePointerDown = function (ev) {
- var dragging = _this.dragging;
- // do this in pointerdown (not dragend) because DOM might be mutated by the time dragend is fired
- dragging.setIgnoreMove(!_this.component.isValidDateDownEl(dragging.pointer.downEl));
- };
- // won't even fire if moving was ignored
- _this.handleDragEnd = function (ev) {
- var component = _this.component;
- var _a = component.context, calendar = _a.calendar, view = _a.view;
- var pointer = _this.dragging.pointer;
- if (!pointer.wasTouchScroll) {
- var _b = _this.hitDragging, initialHit = _b.initialHit, finalHit = _b.finalHit;
- if (initialHit && finalHit && isHitsEqual(initialHit, finalHit)) {
- calendar.triggerDateClick(initialHit.dateSpan, initialHit.dayEl, view, ev.origEvent);
- }
- }
- };
- var component = settings.component;
- // we DO want to watch pointer moves because otherwise finalHit won't get populated
- _this.dragging = new FeaturefulElementDragging(component.el);
- _this.dragging.autoScroller.isEnabled = false;
- var hitDragging = _this.hitDragging = new HitDragging(_this.dragging, interactionSettingsToStore(settings));
- hitDragging.emitter.on('pointerdown', _this.handlePointerDown);
- hitDragging.emitter.on('dragend', _this.handleDragEnd);
- return _this;
- }
- DateClicking.prototype.destroy = function () {
- this.dragging.destroy();
- };
- return DateClicking;
-}(Interaction));
-
-/*
-Tracks when the user selects a portion of time of a component,
-constituted by a drag over date cells, with a possible delay at the beginning of the drag.
-*/
-var DateSelecting = /** @class */ (function (_super) {
- __extends(DateSelecting, _super);
- function DateSelecting(settings) {
- var _this = _super.call(this, settings) || this;
- _this.dragSelection = null;
- _this.handlePointerDown = function (ev) {
- var _a = _this, component = _a.component, dragging = _a.dragging;
- var options = component.context.options;
- var canSelect = options.selectable &&
- component.isValidDateDownEl(ev.origEvent.target);
- // don't bother to watch expensive moves if component won't do selection
- dragging.setIgnoreMove(!canSelect);
- // if touch, require user to hold down
- dragging.delay = ev.isTouch ? getComponentTouchDelay(component) : null;
- };
- _this.handleDragStart = function (ev) {
- _this.component.context.calendar.unselect(ev); // unselect previous selections
- };
- _this.handleHitUpdate = function (hit, isFinal) {
- var calendar = _this.component.context.calendar;
- var dragSelection = null;
- var isInvalid = false;
- if (hit) {
- dragSelection = joinHitsIntoSelection(_this.hitDragging.initialHit, hit, calendar.pluginSystem.hooks.dateSelectionTransformers);
- if (!dragSelection || !_this.component.isDateSelectionValid(dragSelection)) {
- isInvalid = true;
- dragSelection = null;
- }
- }
- if (dragSelection) {
- calendar.dispatch({ type: 'SELECT_DATES', selection: dragSelection });
- }
- else if (!isFinal) { // only unselect if moved away while dragging
- calendar.dispatch({ type: 'UNSELECT_DATES' });
- }
- if (!isInvalid) {
- enableCursor();
- }
- else {
- disableCursor();
- }
- if (!isFinal) {
- _this.dragSelection = dragSelection; // only clear if moved away from all hits while dragging
- }
- };
- _this.handlePointerUp = function (pev) {
- if (_this.dragSelection) {
- // selection is already rendered, so just need to report selection
- _this.component.context.calendar.triggerDateSelect(_this.dragSelection, pev);
- _this.dragSelection = null;
- }
- };
- var component = settings.component;
- var options = component.context.options;
- var dragging = _this.dragging = new FeaturefulElementDragging(component.el);
- dragging.touchScrollAllowed = false;
- dragging.minDistance = options.selectMinDistance || 0;
- dragging.autoScroller.isEnabled = options.dragScroll;
- var hitDragging = _this.hitDragging = new HitDragging(_this.dragging, interactionSettingsToStore(settings));
- hitDragging.emitter.on('pointerdown', _this.handlePointerDown);
- hitDragging.emitter.on('dragstart', _this.handleDragStart);
- hitDragging.emitter.on('hitupdate', _this.handleHitUpdate);
- hitDragging.emitter.on('pointerup', _this.handlePointerUp);
- return _this;
- }
- DateSelecting.prototype.destroy = function () {
- this.dragging.destroy();
- };
- return DateSelecting;
-}(Interaction));
-function getComponentTouchDelay(component) {
- var options = component.context.options;
- var delay = options.selectLongPressDelay;
- if (delay == null) {
- delay = options.longPressDelay;
- }
- return delay;
-}
-function joinHitsIntoSelection(hit0, hit1, dateSelectionTransformers) {
- var dateSpan0 = hit0.dateSpan;
- var dateSpan1 = hit1.dateSpan;
- var ms = [
- dateSpan0.range.start,
- dateSpan0.range.end,
- dateSpan1.range.start,
- dateSpan1.range.end
- ];
- ms.sort(compareNumbers);
- var props = {};
- for (var _i = 0, dateSelectionTransformers_1 = dateSelectionTransformers; _i < dateSelectionTransformers_1.length; _i++) {
- var transformer = dateSelectionTransformers_1[_i];
- var res = transformer(hit0, hit1);
- if (res === false) {
- return null;
- }
- else if (res) {
- __assign(props, res);
- }
- }
- props.range = { start: ms[0], end: ms[3] };
- props.allDay = dateSpan0.allDay;
- return props;
-}
-
-var EventDragging = /** @class */ (function (_super) {
- __extends(EventDragging, _super);
- function EventDragging(settings) {
- var _this = _super.call(this, settings) || this;
- // internal state
- _this.subjectSeg = null; // the seg being selected/dragged
- _this.isDragging = false;
- _this.eventRange = null;
- _this.relevantEvents = null; // the events being dragged
- _this.receivingCalendar = null;
- _this.validMutation = null;
- _this.mutatedRelevantEvents = null;
- _this.handlePointerDown = function (ev) {
- var origTarget = ev.origEvent.target;
- var _a = _this, component = _a.component, dragging = _a.dragging;
- var mirror = dragging.mirror;
- var options = component.context.options;
- var initialCalendar = component.context.calendar;
- var subjectSeg = _this.subjectSeg = getElSeg(ev.subjectEl);
- var eventRange = _this.eventRange = subjectSeg.eventRange;
- var eventInstanceId = eventRange.instance.instanceId;
- _this.relevantEvents = getRelevantEvents(initialCalendar.state.eventStore, eventInstanceId);
- dragging.minDistance = ev.isTouch ? 0 : options.eventDragMinDistance;
- dragging.delay =
- // only do a touch delay if touch and this event hasn't been selected yet
- (ev.isTouch && eventInstanceId !== component.props.eventSelection) ?
- getComponentTouchDelay$1(component) :
- null;
- mirror.parentNode = initialCalendar.el;
- mirror.revertDuration = options.dragRevertDuration;
- var isValid = component.isValidSegDownEl(origTarget) &&
- !elementClosest(origTarget, '.fc-resizer'); // NOT on a resizer
- dragging.setIgnoreMove(!isValid);
- // disable dragging for elements that are resizable (ie, selectable)
- // but are not draggable
- _this.isDragging = isValid &&
- ev.subjectEl.classList.contains('fc-draggable');
- };
- _this.handleDragStart = function (ev) {
- var context = _this.component.context;
- var initialCalendar = context.calendar;
- var eventRange = _this.eventRange;
- var eventInstanceId = eventRange.instance.instanceId;
- if (ev.isTouch) {
- // need to select a different event?
- if (eventInstanceId !== _this.component.props.eventSelection) {
- initialCalendar.dispatch({ type: 'SELECT_EVENT', eventInstanceId: eventInstanceId });
- }
- }
- else {
- // if now using mouse, but was previous touch interaction, clear selected event
- initialCalendar.dispatch({ type: 'UNSELECT_EVENT' });
- }
- if (_this.isDragging) {
- initialCalendar.unselect(ev); // unselect *date* selection
- initialCalendar.publiclyTrigger('eventDragStart', [
- {
- el: _this.subjectSeg.el,
- event: new EventApi(initialCalendar, eventRange.def, eventRange.instance),
- jsEvent: ev.origEvent,
- view: context.view
- }
- ]);
- }
- };
- _this.handleHitUpdate = function (hit, isFinal) {
- if (!_this.isDragging) {
- return;
- }
- var relevantEvents = _this.relevantEvents;
- var initialHit = _this.hitDragging.initialHit;
- var initialCalendar = _this.component.context.calendar;
- // states based on new hit
- var receivingCalendar = null;
- var mutation = null;
- var mutatedRelevantEvents = null;
- var isInvalid = false;
- var interaction = {
- affectedEvents: relevantEvents,
- mutatedEvents: createEmptyEventStore(),
- isEvent: true,
- origSeg: _this.subjectSeg
- };
- if (hit) {
- var receivingComponent = hit.component;
- receivingCalendar = receivingComponent.context.calendar;
- var receivingOptions = receivingComponent.context.options;
- if (initialCalendar === receivingCalendar ||
- receivingOptions.editable && receivingOptions.droppable) {
- mutation = computeEventMutation(initialHit, hit, receivingCalendar.pluginSystem.hooks.eventDragMutationMassagers);
- if (mutation) {
- mutatedRelevantEvents = applyMutationToEventStore(relevantEvents, receivingCalendar.eventUiBases, mutation, receivingCalendar);
- interaction.mutatedEvents = mutatedRelevantEvents;
- if (!receivingComponent.isInteractionValid(interaction)) {
- isInvalid = true;
- mutation = null;
- mutatedRelevantEvents = null;
- interaction.mutatedEvents = createEmptyEventStore();
- }
- }
- }
- else {
- receivingCalendar = null;
- }
- }
- _this.displayDrag(receivingCalendar, interaction);
- if (!isInvalid) {
- enableCursor();
- }
- else {
- disableCursor();
- }
- if (!isFinal) {
- if (initialCalendar === receivingCalendar && // TODO: write test for this
- isHitsEqual(initialHit, hit)) {
- mutation = null;
- }
- _this.dragging.setMirrorNeedsRevert(!mutation);
- // render the mirror if no already-rendered mirror
- // TODO: wish we could somehow wait for dispatch to guarantee render
- _this.dragging.setMirrorIsVisible(!hit || !document.querySelector('.fc-mirror'));
- // assign states based on new hit
- _this.receivingCalendar = receivingCalendar;
- _this.validMutation = mutation;
- _this.mutatedRelevantEvents = mutatedRelevantEvents;
- }
- };
- _this.handlePointerUp = function () {
- if (!_this.isDragging) {
- _this.cleanup(); // because handleDragEnd won't fire
- }
- };
- _this.handleDragEnd = function (ev) {
- if (_this.isDragging) {
- var context = _this.component.context;
- var initialCalendar_1 = context.calendar;
- var initialView = context.view;
- var _a = _this, receivingCalendar = _a.receivingCalendar, validMutation = _a.validMutation;
- var eventDef = _this.eventRange.def;
- var eventInstance = _this.eventRange.instance;
- var eventApi = new EventApi(initialCalendar_1, eventDef, eventInstance);
- var relevantEvents_1 = _this.relevantEvents;
- var mutatedRelevantEvents = _this.mutatedRelevantEvents;
- var finalHit = _this.hitDragging.finalHit;
- _this.clearDrag(); // must happen after revert animation
- initialCalendar_1.publiclyTrigger('eventDragStop', [
- {
- el: _this.subjectSeg.el,
- event: eventApi,
- jsEvent: ev.origEvent,
- view: initialView
- }
- ]);
- if (validMutation) {
- // dropped within same calendar
- if (receivingCalendar === initialCalendar_1) {
- initialCalendar_1.dispatch({
- type: 'MERGE_EVENTS',
- eventStore: mutatedRelevantEvents
- });
- var transformed = {};
- for (var _i = 0, _b = initialCalendar_1.pluginSystem.hooks.eventDropTransformers; _i < _b.length; _i++) {
- var transformer = _b[_i];
- __assign(transformed, transformer(validMutation, initialCalendar_1));
- }
- var eventDropArg = __assign({}, transformed, { el: ev.subjectEl, delta: validMutation.datesDelta, oldEvent: eventApi, event: new EventApi(// the data AFTER the mutation
- initialCalendar_1, mutatedRelevantEvents.defs[eventDef.defId], eventInstance ? mutatedRelevantEvents.instances[eventInstance.instanceId] : null), revert: function () {
- initialCalendar_1.dispatch({
- type: 'MERGE_EVENTS',
- eventStore: relevantEvents_1
- });
- }, jsEvent: ev.origEvent, view: initialView });
- initialCalendar_1.publiclyTrigger('eventDrop', [eventDropArg]);
- // dropped in different calendar
- }
- else if (receivingCalendar) {
- initialCalendar_1.publiclyTrigger('eventLeave', [
- {
- draggedEl: ev.subjectEl,
- event: eventApi,
- view: initialView
- }
- ]);
- initialCalendar_1.dispatch({
- type: 'REMOVE_EVENT_INSTANCES',
- instances: _this.mutatedRelevantEvents.instances
- });
- receivingCalendar.dispatch({
- type: 'MERGE_EVENTS',
- eventStore: _this.mutatedRelevantEvents
- });
- if (ev.isTouch) {
- receivingCalendar.dispatch({
- type: 'SELECT_EVENT',
- eventInstanceId: eventInstance.instanceId
- });
- }
- var dropArg = __assign({}, receivingCalendar.buildDatePointApi(finalHit.dateSpan), { draggedEl: ev.subjectEl, jsEvent: ev.origEvent, view: finalHit.component // should this be finalHit.component.view? See #4644
- });
- receivingCalendar.publiclyTrigger('drop', [dropArg]);
- receivingCalendar.publiclyTrigger('eventReceive', [
- {
- draggedEl: ev.subjectEl,
- event: new EventApi(// the data AFTER the mutation
- receivingCalendar, mutatedRelevantEvents.defs[eventDef.defId], mutatedRelevantEvents.instances[eventInstance.instanceId]),
- view: finalHit.component // should this be finalHit.component.view? See #4644
- }
- ]);
- }
- }
- else {
- initialCalendar_1.publiclyTrigger('_noEventDrop');
- }
- }
- _this.cleanup();
- };
- var component = _this.component;
- var options = component.context.options;
- var dragging = _this.dragging = new FeaturefulElementDragging(component.el);
- dragging.pointer.selector = EventDragging.SELECTOR;
- dragging.touchScrollAllowed = false;
- dragging.autoScroller.isEnabled = options.dragScroll;
- var hitDragging = _this.hitDragging = new HitDragging(_this.dragging, interactionSettingsStore);
- hitDragging.useSubjectCenter = settings.useEventCenter;
- hitDragging.emitter.on('pointerdown', _this.handlePointerDown);
- hitDragging.emitter.on('dragstart', _this.handleDragStart);
- hitDragging.emitter.on('hitupdate', _this.handleHitUpdate);
- hitDragging.emitter.on('pointerup', _this.handlePointerUp);
- hitDragging.emitter.on('dragend', _this.handleDragEnd);
- return _this;
- }
- EventDragging.prototype.destroy = function () {
- this.dragging.destroy();
- };
- // render a drag state on the next receivingCalendar
- EventDragging.prototype.displayDrag = function (nextCalendar, state) {
- var initialCalendar = this.component.context.calendar;
- var prevCalendar = this.receivingCalendar;
- // does the previous calendar need to be cleared?
- if (prevCalendar && prevCalendar !== nextCalendar) {
- // does the initial calendar need to be cleared?
- // if so, don't clear all the way. we still need to to hide the affectedEvents
- if (prevCalendar === initialCalendar) {
- prevCalendar.dispatch({
- type: 'SET_EVENT_DRAG',
- state: {
- affectedEvents: state.affectedEvents,
- mutatedEvents: createEmptyEventStore(),
- isEvent: true,
- origSeg: state.origSeg
- }
- });
- // completely clear the old calendar if it wasn't the initial
- }
- else {
- prevCalendar.dispatch({ type: 'UNSET_EVENT_DRAG' });
- }
- }
- if (nextCalendar) {
- nextCalendar.dispatch({ type: 'SET_EVENT_DRAG', state: state });
- }
- };
- EventDragging.prototype.clearDrag = function () {
- var initialCalendar = this.component.context.calendar;
- var receivingCalendar = this.receivingCalendar;
- if (receivingCalendar) {
- receivingCalendar.dispatch({ type: 'UNSET_EVENT_DRAG' });
- }
- // the initial calendar might have an dummy drag state from displayDrag
- if (initialCalendar !== receivingCalendar) {
- initialCalendar.dispatch({ type: 'UNSET_EVENT_DRAG' });
- }
- };
- EventDragging.prototype.cleanup = function () {
- this.subjectSeg = null;
- this.isDragging = false;
- this.eventRange = null;
- this.relevantEvents = null;
- this.receivingCalendar = null;
- this.validMutation = null;
- this.mutatedRelevantEvents = null;
- };
- EventDragging.SELECTOR = '.fc-draggable, .fc-resizable'; // TODO: test this in IE11
- return EventDragging;
-}(Interaction));
-function computeEventMutation(hit0, hit1, massagers) {
- var dateSpan0 = hit0.dateSpan;
- var dateSpan1 = hit1.dateSpan;
- var date0 = dateSpan0.range.start;
- var date1 = dateSpan1.range.start;
- var standardProps = {};
- if (dateSpan0.allDay !== dateSpan1.allDay) {
- standardProps.allDay = dateSpan1.allDay;
- standardProps.hasEnd = hit1.component.context.options.allDayMaintainDuration;
- if (dateSpan1.allDay) {
- // means date1 is already start-of-day,
- // but date0 needs to be converted
- date0 = startOfDay(date0);
- }
- }
- var delta = diffDates(date0, date1, hit0.component.context.dateEnv, hit0.component === hit1.component ?
- hit0.component.largeUnit :
- null);
- if (delta.milliseconds) { // has hours/minutes/seconds
- standardProps.allDay = false;
- }
- var mutation = {
- datesDelta: delta,
- standardProps: standardProps
- };
- for (var _i = 0, massagers_1 = massagers; _i < massagers_1.length; _i++) {
- var massager = massagers_1[_i];
- massager(mutation, hit0, hit1);
- }
- return mutation;
-}
-function getComponentTouchDelay$1(component) {
- var options = component.context.options;
- var delay = options.eventLongPressDelay;
- if (delay == null) {
- delay = options.longPressDelay;
- }
- return delay;
-}
-
-var EventDragging$1 = /** @class */ (function (_super) {
- __extends(EventDragging, _super);
- function EventDragging(settings) {
- var _this = _super.call(this, settings) || this;
- // internal state
- _this.draggingSeg = null; // TODO: rename to resizingSeg? subjectSeg?
- _this.eventRange = null;
- _this.relevantEvents = null;
- _this.validMutation = null;
- _this.mutatedRelevantEvents = null;
- _this.handlePointerDown = function (ev) {
- var component = _this.component;
- var seg = _this.querySeg(ev);
- var eventRange = _this.eventRange = seg.eventRange;
- _this.dragging.minDistance = component.context.options.eventDragMinDistance;
- // if touch, need to be working with a selected event
- _this.dragging.setIgnoreMove(!_this.component.isValidSegDownEl(ev.origEvent.target) ||
- (ev.isTouch && _this.component.props.eventSelection !== eventRange.instance.instanceId));
- };
- _this.handleDragStart = function (ev) {
- var _a = _this.component.context, calendar = _a.calendar, view = _a.view;
- var eventRange = _this.eventRange;
- _this.relevantEvents = getRelevantEvents(calendar.state.eventStore, _this.eventRange.instance.instanceId);
- _this.draggingSeg = _this.querySeg(ev);
- calendar.unselect();
- calendar.publiclyTrigger('eventResizeStart', [
- {
- el: _this.draggingSeg.el,
- event: new EventApi(calendar, eventRange.def, eventRange.instance),
- jsEvent: ev.origEvent,
- view: view
- }
- ]);
- };
- _this.handleHitUpdate = function (hit, isFinal, ev) {
- var calendar = _this.component.context.calendar;
- var relevantEvents = _this.relevantEvents;
- var initialHit = _this.hitDragging.initialHit;
- var eventInstance = _this.eventRange.instance;
- var mutation = null;
- var mutatedRelevantEvents = null;
- var isInvalid = false;
- var interaction = {
- affectedEvents: relevantEvents,
- mutatedEvents: createEmptyEventStore(),
- isEvent: true,
- origSeg: _this.draggingSeg
- };
- if (hit) {
- mutation = computeMutation(initialHit, hit, ev.subjectEl.classList.contains('fc-start-resizer'), eventInstance.range, calendar.pluginSystem.hooks.eventResizeJoinTransforms);
- }
- if (mutation) {
- mutatedRelevantEvents = applyMutationToEventStore(relevantEvents, calendar.eventUiBases, mutation, calendar);
- interaction.mutatedEvents = mutatedRelevantEvents;
- if (!_this.component.isInteractionValid(interaction)) {
- isInvalid = true;
- mutation = null;
- mutatedRelevantEvents = null;
- interaction.mutatedEvents = null;
- }
- }
- if (mutatedRelevantEvents) {
- calendar.dispatch({
- type: 'SET_EVENT_RESIZE',
- state: interaction
- });
- }
- else {
- calendar.dispatch({ type: 'UNSET_EVENT_RESIZE' });
- }
- if (!isInvalid) {
- enableCursor();
- }
- else {
- disableCursor();
- }
- if (!isFinal) {
- if (mutation && isHitsEqual(initialHit, hit)) {
- mutation = null;
- }
- _this.validMutation = mutation;
- _this.mutatedRelevantEvents = mutatedRelevantEvents;
- }
- };
- _this.handleDragEnd = function (ev) {
- var _a = _this.component.context, calendar = _a.calendar, view = _a.view;
- var eventDef = _this.eventRange.def;
- var eventInstance = _this.eventRange.instance;
- var eventApi = new EventApi(calendar, eventDef, eventInstance);
- var relevantEvents = _this.relevantEvents;
- var mutatedRelevantEvents = _this.mutatedRelevantEvents;
- calendar.publiclyTrigger('eventResizeStop', [
- {
- el: _this.draggingSeg.el,
- event: eventApi,
- jsEvent: ev.origEvent,
- view: view
- }
- ]);
- if (_this.validMutation) {
- calendar.dispatch({
- type: 'MERGE_EVENTS',
- eventStore: mutatedRelevantEvents
- });
- calendar.publiclyTrigger('eventResize', [
- {
- el: _this.draggingSeg.el,
- startDelta: _this.validMutation.startDelta || createDuration(0),
- endDelta: _this.validMutation.endDelta || createDuration(0),
- prevEvent: eventApi,
- event: new EventApi(// the data AFTER the mutation
- calendar, mutatedRelevantEvents.defs[eventDef.defId], eventInstance ? mutatedRelevantEvents.instances[eventInstance.instanceId] : null),
- revert: function () {
- calendar.dispatch({
- type: 'MERGE_EVENTS',
- eventStore: relevantEvents
- });
- },
- jsEvent: ev.origEvent,
- view: view
- }
- ]);
- }
- else {
- calendar.publiclyTrigger('_noEventResize');
- }
- // reset all internal state
- _this.draggingSeg = null;
- _this.relevantEvents = null;
- _this.validMutation = null;
- // okay to keep eventInstance around. useful to set it in handlePointerDown
- };
- var component = settings.component;
- var dragging = _this.dragging = new FeaturefulElementDragging(component.el);
- dragging.pointer.selector = '.fc-resizer';
- dragging.touchScrollAllowed = false;
- dragging.autoScroller.isEnabled = component.context.options.dragScroll;
- var hitDragging = _this.hitDragging = new HitDragging(_this.dragging, interactionSettingsToStore(settings));
- hitDragging.emitter.on('pointerdown', _this.handlePointerDown);
- hitDragging.emitter.on('dragstart', _this.handleDragStart);
- hitDragging.emitter.on('hitupdate', _this.handleHitUpdate);
- hitDragging.emitter.on('dragend', _this.handleDragEnd);
- return _this;
- }
- EventDragging.prototype.destroy = function () {
- this.dragging.destroy();
- };
- EventDragging.prototype.querySeg = function (ev) {
- return getElSeg(elementClosest(ev.subjectEl, this.component.fgSegSelector));
- };
- return EventDragging;
-}(Interaction));
-function computeMutation(hit0, hit1, isFromStart, instanceRange, transforms) {
- var dateEnv = hit0.component.context.dateEnv;
- var date0 = hit0.dateSpan.range.start;
- var date1 = hit1.dateSpan.range.start;
- var delta = diffDates(date0, date1, dateEnv, hit0.component.largeUnit);
- var props = {};
- for (var _i = 0, transforms_1 = transforms; _i < transforms_1.length; _i++) {
- var transform = transforms_1[_i];
- var res = transform(hit0, hit1);
- if (res === false) {
- return null;
- }
- else if (res) {
- __assign(props, res);
- }
- }
- if (isFromStart) {
- if (dateEnv.add(instanceRange.start, delta) < instanceRange.end) {
- props.startDelta = delta;
- return props;
- }
- }
- else {
- if (dateEnv.add(instanceRange.end, delta) > instanceRange.start) {
- props.endDelta = delta;
- return props;
- }
- }
- return null;
-}
-
-var UnselectAuto = /** @class */ (function () {
- function UnselectAuto(calendar) {
- var _this = this;
- this.isRecentPointerDateSelect = false; // wish we could use a selector to detect date selection, but uses hit system
- this.onSelect = function (selectInfo) {
- if (selectInfo.jsEvent) {
- _this.isRecentPointerDateSelect = true;
- }
- };
- this.onDocumentPointerUp = function (pev) {
- var _a = _this, calendar = _a.calendar, documentPointer = _a.documentPointer;
- var state = calendar.state;
- // touch-scrolling should never unfocus any type of selection
- if (!documentPointer.wasTouchScroll) {
- if (state.dateSelection && // an existing date selection?
- !_this.isRecentPointerDateSelect // a new pointer-initiated date selection since last onDocumentPointerUp?
- ) {
- var unselectAuto = calendar.viewOpt('unselectAuto');
- var unselectCancel = calendar.viewOpt('unselectCancel');
- if (unselectAuto && (!unselectAuto || !elementClosest(documentPointer.downEl, unselectCancel))) {
- calendar.unselect(pev);
- }
- }
- if (state.eventSelection && // an existing event selected?
- !elementClosest(documentPointer.downEl, EventDragging.SELECTOR) // interaction DIDN'T start on an event
- ) {
- calendar.dispatch({ type: 'UNSELECT_EVENT' });
- }
- }
- _this.isRecentPointerDateSelect = false;
- };
- this.calendar = calendar;
- var documentPointer = this.documentPointer = new PointerDragging(document);
- documentPointer.shouldIgnoreMove = true;
- documentPointer.shouldWatchScroll = false;
- documentPointer.emitter.on('pointerup', this.onDocumentPointerUp);
- /*
- TODO: better way to know about whether there was a selection with the pointer
- */
- calendar.on('select', this.onSelect);
- }
- UnselectAuto.prototype.destroy = function () {
- this.calendar.off('select', this.onSelect);
- this.documentPointer.destroy();
- };
- return UnselectAuto;
-}());
-
-/*
-Given an already instantiated draggable object for one-or-more elements,
-Interprets any dragging as an attempt to drag an events that lives outside
-of a calendar onto a calendar.
-*/
-var ExternalElementDragging = /** @class */ (function () {
- function ExternalElementDragging(dragging, suppliedDragMeta) {
- var _this = this;
- this.receivingCalendar = null;
- this.droppableEvent = null; // will exist for all drags, even if create:false
- this.suppliedDragMeta = null;
- this.dragMeta = null;
- this.handleDragStart = function (ev) {
- _this.dragMeta = _this.buildDragMeta(ev.subjectEl);
- };
- this.handleHitUpdate = function (hit, isFinal, ev) {
- var dragging = _this.hitDragging.dragging;
- var receivingCalendar = null;
- var droppableEvent = null;
- var isInvalid = false;
- var interaction = {
- affectedEvents: createEmptyEventStore(),
- mutatedEvents: createEmptyEventStore(),
- isEvent: _this.dragMeta.create,
- origSeg: null
- };
- if (hit) {
- receivingCalendar = hit.component.context.calendar;
- if (_this.canDropElOnCalendar(ev.subjectEl, receivingCalendar)) {
- droppableEvent = computeEventForDateSpan(hit.dateSpan, _this.dragMeta, receivingCalendar);
- interaction.mutatedEvents = eventTupleToStore(droppableEvent);
- isInvalid = !isInteractionValid(interaction, receivingCalendar);
- if (isInvalid) {
- interaction.mutatedEvents = createEmptyEventStore();
- droppableEvent = null;
- }
- }
- }
- _this.displayDrag(receivingCalendar, interaction);
- // show mirror if no already-rendered mirror element OR if we are shutting down the mirror (?)
- // TODO: wish we could somehow wait for dispatch to guarantee render
- dragging.setMirrorIsVisible(isFinal || !droppableEvent || !document.querySelector('.fc-mirror'));
- if (!isInvalid) {
- enableCursor();
- }
- else {
- disableCursor();
- }
- if (!isFinal) {
- dragging.setMirrorNeedsRevert(!droppableEvent);
- _this.receivingCalendar = receivingCalendar;
- _this.droppableEvent = droppableEvent;
- }
- };
- this.handleDragEnd = function (pev) {
- var _a = _this, receivingCalendar = _a.receivingCalendar, droppableEvent = _a.droppableEvent;
- _this.clearDrag();
- if (receivingCalendar && droppableEvent) {
- var finalHit = _this.hitDragging.finalHit;
- var finalView = finalHit.component.context.view;
- var dragMeta = _this.dragMeta;
- var arg = __assign({}, receivingCalendar.buildDatePointApi(finalHit.dateSpan), { draggedEl: pev.subjectEl, jsEvent: pev.origEvent, view: finalView });
- receivingCalendar.publiclyTrigger('drop', [arg]);
- if (dragMeta.create) {
- receivingCalendar.dispatch({
- type: 'MERGE_EVENTS',
- eventStore: eventTupleToStore(droppableEvent)
- });
- if (pev.isTouch) {
- receivingCalendar.dispatch({
- type: 'SELECT_EVENT',
- eventInstanceId: droppableEvent.instance.instanceId
- });
- }
- // signal that an external event landed
- receivingCalendar.publiclyTrigger('eventReceive', [
- {
- draggedEl: pev.subjectEl,
- event: new EventApi(receivingCalendar, droppableEvent.def, droppableEvent.instance),
- view: finalView
- }
- ]);
- }
- }
- _this.receivingCalendar = null;
- _this.droppableEvent = null;
- };
- var hitDragging = this.hitDragging = new HitDragging(dragging, interactionSettingsStore);
- hitDragging.requireInitial = false; // will start outside of a component
- hitDragging.emitter.on('dragstart', this.handleDragStart);
- hitDragging.emitter.on('hitupdate', this.handleHitUpdate);
- hitDragging.emitter.on('dragend', this.handleDragEnd);
- this.suppliedDragMeta = suppliedDragMeta;
- }
- ExternalElementDragging.prototype.buildDragMeta = function (subjectEl) {
- if (typeof this.suppliedDragMeta === 'object') {
- return parseDragMeta(this.suppliedDragMeta);
- }
- else if (typeof this.suppliedDragMeta === 'function') {
- return parseDragMeta(this.suppliedDragMeta(subjectEl));
- }
- else {
- return getDragMetaFromEl(subjectEl);
- }
- };
- ExternalElementDragging.prototype.displayDrag = function (nextCalendar, state) {
- var prevCalendar = this.receivingCalendar;
- if (prevCalendar && prevCalendar !== nextCalendar) {
- prevCalendar.dispatch({ type: 'UNSET_EVENT_DRAG' });
- }
- if (nextCalendar) {
- nextCalendar.dispatch({ type: 'SET_EVENT_DRAG', state: state });
- }
- };
- ExternalElementDragging.prototype.clearDrag = function () {
- if (this.receivingCalendar) {
- this.receivingCalendar.dispatch({ type: 'UNSET_EVENT_DRAG' });
- }
- };
- ExternalElementDragging.prototype.canDropElOnCalendar = function (el, receivingCalendar) {
- var dropAccept = receivingCalendar.opt('dropAccept');
- if (typeof dropAccept === 'function') {
- return dropAccept(el);
- }
- else if (typeof dropAccept === 'string' && dropAccept) {
- return Boolean(elementMatches(el, dropAccept));
- }
- return true;
- };
- return ExternalElementDragging;
-}());
-// Utils for computing event store from the DragMeta
-// ----------------------------------------------------------------------------------------------------
-function computeEventForDateSpan(dateSpan, dragMeta, calendar) {
- var defProps = __assign({}, dragMeta.leftoverProps);
- for (var _i = 0, _a = calendar.pluginSystem.hooks.externalDefTransforms; _i < _a.length; _i++) {
- var transform = _a[_i];
- __assign(defProps, transform(dateSpan, dragMeta));
- }
- var def = parseEventDef(defProps, dragMeta.sourceId, dateSpan.allDay, calendar.opt('forceEventDuration') || Boolean(dragMeta.duration), // hasEnd
- calendar);
- var start = dateSpan.range.start;
- // only rely on time info if drop zone is all-day,
- // otherwise, we already know the time
- if (dateSpan.allDay && dragMeta.startTime) {
- start = calendar.dateEnv.add(start, dragMeta.startTime);
- }
- var end = dragMeta.duration ?
- calendar.dateEnv.add(start, dragMeta.duration) :
- calendar.getDefaultEventEnd(dateSpan.allDay, start);
- var instance = createEventInstance(def.defId, { start: start, end: end });
- return { def: def, instance: instance };
-}
-// Utils for extracting data from element
-// ----------------------------------------------------------------------------------------------------
-function getDragMetaFromEl(el) {
- var str = getEmbeddedElData(el, 'event');
- var obj = str ?
- JSON.parse(str) :
- { create: false }; // if no embedded data, assume no event creation
- return parseDragMeta(obj);
-}
-config.dataAttrPrefix = '';
-function getEmbeddedElData(el, name) {
- var prefix = config.dataAttrPrefix;
- var prefixedName = (prefix ? prefix + '-' : '') + name;
- return el.getAttribute('data-' + prefixedName) || '';
-}
-
-/*
-Makes an element (that is *external* to any calendar) draggable.
-Can pass in data that determines how an event will be created when dropped onto a calendar.
-Leverages FullCalendar's internal drag-n-drop functionality WITHOUT a third-party drag system.
-*/
-var ExternalDraggable = /** @class */ (function () {
- function ExternalDraggable(el, settings) {
- var _this = this;
- if (settings === void 0) { settings = {}; }
- this.handlePointerDown = function (ev) {
- var dragging = _this.dragging;
- var _a = _this.settings, minDistance = _a.minDistance, longPressDelay = _a.longPressDelay;
- dragging.minDistance =
- minDistance != null ?
- minDistance :
- (ev.isTouch ? 0 : globalDefaults.eventDragMinDistance);
- dragging.delay =
- ev.isTouch ? // TODO: eventually read eventLongPressDelay instead vvv
- (longPressDelay != null ? longPressDelay : globalDefaults.longPressDelay) :
- 0;
- };
- this.handleDragStart = function (ev) {
- if (ev.isTouch &&
- _this.dragging.delay &&
- ev.subjectEl.classList.contains('fc-event')) {
- _this.dragging.mirror.getMirrorEl().classList.add('fc-selected');
- }
- };
- this.settings = settings;
- var dragging = this.dragging = new FeaturefulElementDragging(el);
- dragging.touchScrollAllowed = false;
- if (settings.itemSelector != null) {
- dragging.pointer.selector = settings.itemSelector;
- }
- if (settings.appendTo != null) {
- dragging.mirror.parentNode = settings.appendTo; // TODO: write tests
- }
- dragging.emitter.on('pointerdown', this.handlePointerDown);
- dragging.emitter.on('dragstart', this.handleDragStart);
- new ExternalElementDragging(dragging, settings.eventData);
- }
- ExternalDraggable.prototype.destroy = function () {
- this.dragging.destroy();
- };
- return ExternalDraggable;
-}());
-
-/*
-Detects when a *THIRD-PARTY* drag-n-drop system interacts with elements.
-The third-party system is responsible for drawing the visuals effects of the drag.
-This class simply monitors for pointer movements and fires events.
-It also has the ability to hide the moving element (the "mirror") during the drag.
-*/
-var InferredElementDragging = /** @class */ (function (_super) {
- __extends(InferredElementDragging, _super);
- function InferredElementDragging(containerEl) {
- var _this = _super.call(this, containerEl) || this;
- _this.shouldIgnoreMove = false;
- _this.mirrorSelector = '';
- _this.currentMirrorEl = null;
- _this.handlePointerDown = function (ev) {
- _this.emitter.trigger('pointerdown', ev);
- if (!_this.shouldIgnoreMove) {
- // fire dragstart right away. does not support delay or min-distance
- _this.emitter.trigger('dragstart', ev);
- }
- };
- _this.handlePointerMove = function (ev) {
- if (!_this.shouldIgnoreMove) {
- _this.emitter.trigger('dragmove', ev);
- }
- };
- _this.handlePointerUp = function (ev) {
- _this.emitter.trigger('pointerup', ev);
- if (!_this.shouldIgnoreMove) {
- // fire dragend right away. does not support a revert animation
- _this.emitter.trigger('dragend', ev);
- }
- };
- var pointer = _this.pointer = new PointerDragging(containerEl);
- pointer.emitter.on('pointerdown', _this.handlePointerDown);
- pointer.emitter.on('pointermove', _this.handlePointerMove);
- pointer.emitter.on('pointerup', _this.handlePointerUp);
- return _this;
- }
- InferredElementDragging.prototype.destroy = function () {
- this.pointer.destroy();
- };
- InferredElementDragging.prototype.setIgnoreMove = function (bool) {
- this.shouldIgnoreMove = bool;
- };
- InferredElementDragging.prototype.setMirrorIsVisible = function (bool) {
- if (bool) {
- // restore a previously hidden element.
- // use the reference in case the selector class has already been removed.
- if (this.currentMirrorEl) {
- this.currentMirrorEl.style.visibility = '';
- this.currentMirrorEl = null;
- }
- }
- else {
- var mirrorEl = this.mirrorSelector ?
- document.querySelector(this.mirrorSelector) :
- null;
- if (mirrorEl) {
- this.currentMirrorEl = mirrorEl;
- mirrorEl.style.visibility = 'hidden';
- }
- }
- };
- return InferredElementDragging;
-}(ElementDragging));
-
-/*
-Bridges third-party drag-n-drop systems with FullCalendar.
-Must be instantiated and destroyed by caller.
-*/
-var ThirdPartyDraggable = /** @class */ (function () {
- function ThirdPartyDraggable(containerOrSettings, settings) {
- var containerEl = document;
- if (
- // wish we could just test instanceof EventTarget, but doesn't work in IE11
- containerOrSettings === document ||
- containerOrSettings instanceof Element) {
- containerEl = containerOrSettings;
- settings = settings || {};
- }
- else {
- settings = (containerOrSettings || {});
- }
- var dragging = this.dragging = new InferredElementDragging(containerEl);
- if (typeof settings.itemSelector === 'string') {
- dragging.pointer.selector = settings.itemSelector;
- }
- else if (containerEl === document) {
- dragging.pointer.selector = '[data-event]';
- }
- if (typeof settings.mirrorSelector === 'string') {
- dragging.mirrorSelector = settings.mirrorSelector;
- }
- new ExternalElementDragging(dragging, settings.eventData);
- }
- ThirdPartyDraggable.prototype.destroy = function () {
- this.dragging.destroy();
- };
- return ThirdPartyDraggable;
-}());
-
-var main = createPlugin({
- componentInteractions: [DateClicking, DateSelecting, EventDragging, EventDragging$1],
- calendarInteractions: [UnselectAuto],
- elementDraggingImpl: FeaturefulElementDragging
-});
-
-export default main;
-export { ExternalDraggable as Draggable, FeaturefulElementDragging, PointerDragging, ThirdPartyDraggable };
diff --git a/library/fullcalendar/packages/interaction/main.js b/library/fullcalendar/packages/interaction/main.js
deleted file mode 100644
index 4420650fb..000000000
--- a/library/fullcalendar/packages/interaction/main.js
+++ /dev/null
@@ -1,2152 +0,0 @@
-/*!
-FullCalendar Interaction Plugin v4.4.2
-Docs & License: https://fullcalendar.io/
-(c) 2019 Adam Shaw
-*/
-
-(function (global, factory) {
- typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('@fullcalendar/core')) :
- typeof define === 'function' && define.amd ? define(['exports', '@fullcalendar/core'], factory) :
- (global = global || self, factory(global.FullCalendarInteraction = {}, global.FullCalendar));
-}(this, function (exports, core) { 'use strict';
-
- /*! *****************************************************************************
- Copyright (c) Microsoft Corporation.
-
- Permission to use, copy, modify, and/or distribute this software for any
- purpose with or without fee is hereby granted.
-
- THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
- REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
- AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
- INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
- LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
- OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
- PERFORMANCE OF THIS SOFTWARE.
- ***************************************************************************** */
- /* global Reflect, Promise */
-
- var extendStatics = function(d, b) {
- extendStatics = Object.setPrototypeOf ||
- ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
- function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
- return extendStatics(d, b);
- };
-
- function __extends(d, b) {
- extendStatics(d, b);
- function __() { this.constructor = d; }
- d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
- }
-
- var __assign = function() {
- __assign = Object.assign || function __assign(t) {
- for (var s, i = 1, n = arguments.length; i < n; i++) {
- s = arguments[i];
- for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];
- }
- return t;
- };
- return __assign.apply(this, arguments);
- };
-
- core.config.touchMouseIgnoreWait = 500;
- var ignoreMouseDepth = 0;
- var listenerCnt = 0;
- var isWindowTouchMoveCancelled = false;
- /*
- Uses a "pointer" abstraction, which monitors UI events for both mouse and touch.
- Tracks when the pointer "drags" on a certain element, meaning down+move+up.
-
- Also, tracks if there was touch-scrolling.
- Also, can prevent touch-scrolling from happening.
- Also, can fire pointermove events when scrolling happens underneath, even when no real pointer movement.
-
- emits:
- - pointerdown
- - pointermove
- - pointerup
- */
- var PointerDragging = /** @class */ (function () {
- function PointerDragging(containerEl) {
- var _this = this;
- this.subjectEl = null;
- this.downEl = null;
- // options that can be directly assigned by caller
- this.selector = ''; // will cause subjectEl in all emitted events to be this element
- this.handleSelector = '';
- this.shouldIgnoreMove = false;
- this.shouldWatchScroll = true; // for simulating pointermove on scroll
- // internal states
- this.isDragging = false;
- this.isTouchDragging = false;
- this.wasTouchScroll = false;
- // Mouse
- // ----------------------------------------------------------------------------------------------------
- this.handleMouseDown = function (ev) {
- if (!_this.shouldIgnoreMouse() &&
- isPrimaryMouseButton(ev) &&
- _this.tryStart(ev)) {
- var pev = _this.createEventFromMouse(ev, true);
- _this.emitter.trigger('pointerdown', pev);
- _this.initScrollWatch(pev);
- if (!_this.shouldIgnoreMove) {
- document.addEventListener('mousemove', _this.handleMouseMove);
- }
- document.addEventListener('mouseup', _this.handleMouseUp);
- }
- };
- this.handleMouseMove = function (ev) {
- var pev = _this.createEventFromMouse(ev);
- _this.recordCoords(pev);
- _this.emitter.trigger('pointermove', pev);
- };
- this.handleMouseUp = function (ev) {
- document.removeEventListener('mousemove', _this.handleMouseMove);
- document.removeEventListener('mouseup', _this.handleMouseUp);
- _this.emitter.trigger('pointerup', _this.createEventFromMouse(ev));
- _this.cleanup(); // call last so that pointerup has access to props
- };
- // Touch
- // ----------------------------------------------------------------------------------------------------
- this.handleTouchStart = function (ev) {
- if (_this.tryStart(ev)) {
- _this.isTouchDragging = true;
- var pev = _this.createEventFromTouch(ev, true);
- _this.emitter.trigger('pointerdown', pev);
- _this.initScrollWatch(pev);
- // unlike mouse, need to attach to target, not document
- // https://stackoverflow.com/a/45760014
- var target = ev.target;
- if (!_this.shouldIgnoreMove) {
- target.addEventListener('touchmove', _this.handleTouchMove);
- }
- target.addEventListener('touchend', _this.handleTouchEnd);
- target.addEventListener('touchcancel', _this.handleTouchEnd); // treat it as a touch end
- // attach a handler to get called when ANY scroll action happens on the page.
- // this was impossible to do with normal on/off because 'scroll' doesn't bubble.
- // http://stackoverflow.com/a/32954565/96342
- window.addEventListener('scroll', _this.handleTouchScroll, true // useCapture
- );
- }
- };
- this.handleTouchMove = function (ev) {
- var pev = _this.createEventFromTouch(ev);
- _this.recordCoords(pev);
- _this.emitter.trigger('pointermove', pev);
- };
- this.handleTouchEnd = function (ev) {
- if (_this.isDragging) { // done to guard against touchend followed by touchcancel
- var target = ev.target;
- target.removeEventListener('touchmove', _this.handleTouchMove);
- target.removeEventListener('touchend', _this.handleTouchEnd);
- target.removeEventListener('touchcancel', _this.handleTouchEnd);
- window.removeEventListener('scroll', _this.handleTouchScroll, true); // useCaptured=true
- _this.emitter.trigger('pointerup', _this.createEventFromTouch(ev));
- _this.cleanup(); // call last so that pointerup has access to props
- _this.isTouchDragging = false;
- startIgnoringMouse();
- }
- };
- this.handleTouchScroll = function () {
- _this.wasTouchScroll = true;
- };
- this.handleScroll = function (ev) {
- if (!_this.shouldIgnoreMove) {
- var pageX = (window.pageXOffset - _this.prevScrollX) + _this.prevPageX;
- var pageY = (window.pageYOffset - _this.prevScrollY) + _this.prevPageY;
- _this.emitter.trigger('pointermove', {
- origEvent: ev,
- isTouch: _this.isTouchDragging,
- subjectEl: _this.subjectEl,
- pageX: pageX,
- pageY: pageY,
- deltaX: pageX - _this.origPageX,
- deltaY: pageY - _this.origPageY
- });
- }
- };
- this.containerEl = containerEl;
- this.emitter = new core.EmitterMixin();
- containerEl.addEventListener('mousedown', this.handleMouseDown);
- containerEl.addEventListener('touchstart', this.handleTouchStart, { passive: true });
- listenerCreated();
- }
- PointerDragging.prototype.destroy = function () {
- this.containerEl.removeEventListener('mousedown', this.handleMouseDown);
- this.containerEl.removeEventListener('touchstart', this.handleTouchStart, { passive: true });
- listenerDestroyed();
- };
- PointerDragging.prototype.tryStart = function (ev) {
- var subjectEl = this.querySubjectEl(ev);
- var downEl = ev.target;
- if (subjectEl &&
- (!this.handleSelector || core.elementClosest(downEl, this.handleSelector))) {
- this.subjectEl = subjectEl;
- this.downEl = downEl;
- this.isDragging = true; // do this first so cancelTouchScroll will work
- this.wasTouchScroll = false;
- return true;
- }
- return false;
- };
- PointerDragging.prototype.cleanup = function () {
- isWindowTouchMoveCancelled = false;
- this.isDragging = false;
- this.subjectEl = null;
- this.downEl = null;
- // keep wasTouchScroll around for later access
- this.destroyScrollWatch();
- };
- PointerDragging.prototype.querySubjectEl = function (ev) {
- if (this.selector) {
- return core.elementClosest(ev.target, this.selector);
- }
- else {
- return this.containerEl;
- }
- };
- PointerDragging.prototype.shouldIgnoreMouse = function () {
- return ignoreMouseDepth || this.isTouchDragging;
- };
- // can be called by user of this class, to cancel touch-based scrolling for the current drag
- PointerDragging.prototype.cancelTouchScroll = function () {
- if (this.isDragging) {
- isWindowTouchMoveCancelled = true;
- }
- };
- // Scrolling that simulates pointermoves
- // ----------------------------------------------------------------------------------------------------
- PointerDragging.prototype.initScrollWatch = function (ev) {
- if (this.shouldWatchScroll) {
- this.recordCoords(ev);
- window.addEventListener('scroll', this.handleScroll, true); // useCapture=true
- }
- };
- PointerDragging.prototype.recordCoords = function (ev) {
- if (this.shouldWatchScroll) {
- this.prevPageX = ev.pageX;
- this.prevPageY = ev.pageY;
- this.prevScrollX = window.pageXOffset;
- this.prevScrollY = window.pageYOffset;
- }
- };
- PointerDragging.prototype.destroyScrollWatch = function () {
- if (this.shouldWatchScroll) {
- window.removeEventListener('scroll', this.handleScroll, true); // useCaptured=true
- }
- };
- // Event Normalization
- // ----------------------------------------------------------------------------------------------------
- PointerDragging.prototype.createEventFromMouse = function (ev, isFirst) {
- var deltaX = 0;
- var deltaY = 0;
- // TODO: repeat code
- if (isFirst) {
- this.origPageX = ev.pageX;
- this.origPageY = ev.pageY;
- }
- else {
- deltaX = ev.pageX - this.origPageX;
- deltaY = ev.pageY - this.origPageY;
- }
- return {
- origEvent: ev,
- isTouch: false,
- subjectEl: this.subjectEl,
- pageX: ev.pageX,
- pageY: ev.pageY,
- deltaX: deltaX,
- deltaY: deltaY
- };
- };
- PointerDragging.prototype.createEventFromTouch = function (ev, isFirst) {
- var touches = ev.touches;
- var pageX;
- var pageY;
- var deltaX = 0;
- var deltaY = 0;
- // if touch coords available, prefer,
- // because FF would give bad ev.pageX ev.pageY
- if (touches && touches.length) {
- pageX = touches[0].pageX;
- pageY = touches[0].pageY;
- }
- else {
- pageX = ev.pageX;
- pageY = ev.pageY;
- }
- // TODO: repeat code
- if (isFirst) {
- this.origPageX = pageX;
- this.origPageY = pageY;
- }
- else {
- deltaX = pageX - this.origPageX;
- deltaY = pageY - this.origPageY;
- }
- return {
- origEvent: ev,
- isTouch: true,
- subjectEl: this.subjectEl,
- pageX: pageX,
- pageY: pageY,
- deltaX: deltaX,
- deltaY: deltaY
- };
- };
- return PointerDragging;
- }());
- // Returns a boolean whether this was a left mouse click and no ctrl key (which means right click on Mac)
- function isPrimaryMouseButton(ev) {
- return ev.button === 0 && !ev.ctrlKey;
- }
- // Ignoring fake mouse events generated by touch
- // ----------------------------------------------------------------------------------------------------
- function startIgnoringMouse() {
- ignoreMouseDepth++;
- setTimeout(function () {
- ignoreMouseDepth--;
- }, core.config.touchMouseIgnoreWait);
- }
- // We want to attach touchmove as early as possible for Safari
- // ----------------------------------------------------------------------------------------------------
- function listenerCreated() {
- if (!(listenerCnt++)) {
- window.addEventListener('touchmove', onWindowTouchMove, { passive: false });
- }
- }
- function listenerDestroyed() {
- if (!(--listenerCnt)) {
- window.removeEventListener('touchmove', onWindowTouchMove, { passive: false });
- }
- }
- function onWindowTouchMove(ev) {
- if (isWindowTouchMoveCancelled) {
- ev.preventDefault();
- }
- }
-
- /*
- An effect in which an element follows the movement of a pointer across the screen.
- The moving element is a clone of some other element.
- Must call start + handleMove + stop.
- */
- var ElementMirror = /** @class */ (function () {
- function ElementMirror() {
- this.isVisible = false; // must be explicitly enabled
- this.sourceEl = null;
- this.mirrorEl = null;
- this.sourceElRect = null; // screen coords relative to viewport
- // options that can be set directly by caller
- this.parentNode = document.body;
- this.zIndex = 9999;
- this.revertDuration = 0;
- }
- ElementMirror.prototype.start = function (sourceEl, pageX, pageY) {
- this.sourceEl = sourceEl;
- this.sourceElRect = this.sourceEl.getBoundingClientRect();
- this.origScreenX = pageX - window.pageXOffset;
- this.origScreenY = pageY - window.pageYOffset;
- this.deltaX = 0;
- this.deltaY = 0;
- this.updateElPosition();
- };
- ElementMirror.prototype.handleMove = function (pageX, pageY) {
- this.deltaX = (pageX - window.pageXOffset) - this.origScreenX;
- this.deltaY = (pageY - window.pageYOffset) - this.origScreenY;
- this.updateElPosition();
- };
- // can be called before start
- ElementMirror.prototype.setIsVisible = function (bool) {
- if (bool) {
- if (!this.isVisible) {
- if (this.mirrorEl) {
- this.mirrorEl.style.display = '';
- }
- this.isVisible = bool; // needs to happen before updateElPosition
- this.updateElPosition(); // because was not updating the position while invisible
- }
- }
- else {
- if (this.isVisible) {
- if (this.mirrorEl) {
- this.mirrorEl.style.display = 'none';
- }
- this.isVisible = bool;
- }
- }
- };
- // always async
- ElementMirror.prototype.stop = function (needsRevertAnimation, callback) {
- var _this = this;
- var done = function () {
- _this.cleanup();
- callback();
- };
- if (needsRevertAnimation &&
- this.mirrorEl &&
- this.isVisible &&
- this.revertDuration && // if 0, transition won't work
- (this.deltaX || this.deltaY) // if same coords, transition won't work
- ) {
- this.doRevertAnimation(done, this.revertDuration);
- }
- else {
- setTimeout(done, 0);
- }
- };
- ElementMirror.prototype.doRevertAnimation = function (callback, revertDuration) {
- var mirrorEl = this.mirrorEl;
- var finalSourceElRect = this.sourceEl.getBoundingClientRect(); // because autoscrolling might have happened
- mirrorEl.style.transition =
- 'top ' + revertDuration + 'ms,' +
- 'left ' + revertDuration + 'ms';
- core.applyStyle(mirrorEl, {
- left: finalSourceElRect.left,
- top: finalSourceElRect.top
- });
- core.whenTransitionDone(mirrorEl, function () {
- mirrorEl.style.transition = '';
- callback();
- });
- };
- ElementMirror.prototype.cleanup = function () {
- if (this.mirrorEl) {
- core.removeElement(this.mirrorEl);
- this.mirrorEl = null;
- }
- this.sourceEl = null;
- };
- ElementMirror.prototype.updateElPosition = function () {
- if (this.sourceEl && this.isVisible) {
- core.applyStyle(this.getMirrorEl(), {
- left: this.sourceElRect.left + this.deltaX,
- top: this.sourceElRect.top + this.deltaY
- });
- }
- };
- ElementMirror.prototype.getMirrorEl = function () {
- var sourceElRect = this.sourceElRect;
- var mirrorEl = this.mirrorEl;
- if (!mirrorEl) {
- mirrorEl = this.mirrorEl = this.sourceEl.cloneNode(true); // cloneChildren=true
- // we don't want long taps or any mouse interaction causing selection/menus.
- // would use preventSelection(), but that prevents selectstart, causing problems.
- mirrorEl.classList.add('fc-unselectable');
- mirrorEl.classList.add('fc-dragging');
- core.applyStyle(mirrorEl, {
- position: 'fixed',
- zIndex: this.zIndex,
- visibility: '',
- boxSizing: 'border-box',
- width: sourceElRect.right - sourceElRect.left,
- height: sourceElRect.bottom - sourceElRect.top,
- right: 'auto',
- bottom: 'auto',
- margin: 0
- });
- this.parentNode.appendChild(mirrorEl);
- }
- return mirrorEl;
- };
- return ElementMirror;
- }());
-
- /*
- Is a cache for a given element's scroll information (all the info that ScrollController stores)
- in addition the "client rectangle" of the element.. the area within the scrollbars.
-
- The cache can be in one of two modes:
- - doesListening:false - ignores when the container is scrolled by someone else
- - doesListening:true - watch for scrolling and update the cache
- */
- var ScrollGeomCache = /** @class */ (function (_super) {
- __extends(ScrollGeomCache, _super);
- function ScrollGeomCache(scrollController, doesListening) {
- var _this = _super.call(this) || this;
- _this.handleScroll = function () {
- _this.scrollTop = _this.scrollController.getScrollTop();
- _this.scrollLeft = _this.scrollController.getScrollLeft();
- _this.handleScrollChange();
- };
- _this.scrollController = scrollController;
- _this.doesListening = doesListening;
- _this.scrollTop = _this.origScrollTop = scrollController.getScrollTop();
- _this.scrollLeft = _this.origScrollLeft = scrollController.getScrollLeft();
- _this.scrollWidth = scrollController.getScrollWidth();
- _this.scrollHeight = scrollController.getScrollHeight();
- _this.clientWidth = scrollController.getClientWidth();
- _this.clientHeight = scrollController.getClientHeight();
- _this.clientRect = _this.computeClientRect(); // do last in case it needs cached values
- if (_this.doesListening) {
- _this.getEventTarget().addEventListener('scroll', _this.handleScroll);
- }
- return _this;
- }
- ScrollGeomCache.prototype.destroy = function () {
- if (this.doesListening) {
- this.getEventTarget().removeEventListener('scroll', this.handleScroll);
- }
- };
- ScrollGeomCache.prototype.getScrollTop = function () {
- return this.scrollTop;
- };
- ScrollGeomCache.prototype.getScrollLeft = function () {
- return this.scrollLeft;
- };
- ScrollGeomCache.prototype.setScrollTop = function (top) {
- this.scrollController.setScrollTop(top);
- if (!this.doesListening) {
- // we are not relying on the element to normalize out-of-bounds scroll values
- // so we need to sanitize ourselves
- this.scrollTop = Math.max(Math.min(top, this.getMaxScrollTop()), 0);
- this.handleScrollChange();
- }
- };
- ScrollGeomCache.prototype.setScrollLeft = function (top) {
- this.scrollController.setScrollLeft(top);
- if (!this.doesListening) {
- // we are not relying on the element to normalize out-of-bounds scroll values
- // so we need to sanitize ourselves
- this.scrollLeft = Math.max(Math.min(top, this.getMaxScrollLeft()), 0);
- this.handleScrollChange();
- }
- };
- ScrollGeomCache.prototype.getClientWidth = function () {
- return this.clientWidth;
- };
- ScrollGeomCache.prototype.getClientHeight = function () {
- return this.clientHeight;
- };
- ScrollGeomCache.prototype.getScrollWidth = function () {
- return this.scrollWidth;
- };
- ScrollGeomCache.prototype.getScrollHeight = function () {
- return this.scrollHeight;
- };
- ScrollGeomCache.prototype.handleScrollChange = function () {
- };
- return ScrollGeomCache;
- }(core.ScrollController));
- var ElementScrollGeomCache = /** @class */ (function (_super) {
- __extends(ElementScrollGeomCache, _super);
- function ElementScrollGeomCache(el, doesListening) {
- return _super.call(this, new core.ElementScrollController(el), doesListening) || this;
- }
- ElementScrollGeomCache.prototype.getEventTarget = function () {
- return this.scrollController.el;
- };
- ElementScrollGeomCache.prototype.computeClientRect = function () {
- return core.computeInnerRect(this.scrollController.el);
- };
- return ElementScrollGeomCache;
- }(ScrollGeomCache));
- var WindowScrollGeomCache = /** @class */ (function (_super) {
- __extends(WindowScrollGeomCache, _super);
- function WindowScrollGeomCache(doesListening) {
- return _super.call(this, new core.WindowScrollController(), doesListening) || this;
- }
- WindowScrollGeomCache.prototype.getEventTarget = function () {
- return window;
- };
- WindowScrollGeomCache.prototype.computeClientRect = function () {
- return {
- left: this.scrollLeft,
- right: this.scrollLeft + this.clientWidth,
- top: this.scrollTop,
- bottom: this.scrollTop + this.clientHeight
- };
- };
- // the window is the only scroll object that changes it's rectangle relative
- // to the document's topleft as it scrolls
- WindowScrollGeomCache.prototype.handleScrollChange = function () {
- this.clientRect = this.computeClientRect();
- };
- return WindowScrollGeomCache;
- }(ScrollGeomCache));
-
- // If available we are using native "performance" API instead of "Date"
- // Read more about it on MDN:
- // https://developer.mozilla.org/en-US/docs/Web/API/Performance
- var getTime = typeof performance === 'function' ? performance.now : Date.now;
- /*
- For a pointer interaction, automatically scrolls certain scroll containers when the pointer
- approaches the edge.
-
- The caller must call start + handleMove + stop.
- */
- var AutoScroller = /** @class */ (function () {
- function AutoScroller() {
- var _this = this;
- // options that can be set by caller
- this.isEnabled = true;
- this.scrollQuery = [window, '.fc-scroller'];
- this.edgeThreshold = 50; // pixels
- this.maxVelocity = 300; // pixels per second
- // internal state
- this.pointerScreenX = null;
- this.pointerScreenY = null;
- this.isAnimating = false;
- this.scrollCaches = null;
- // protect against the initial pointerdown being too close to an edge and starting the scroll
- this.everMovedUp = false;
- this.everMovedDown = false;
- this.everMovedLeft = false;
- this.everMovedRight = false;
- this.animate = function () {
- if (_this.isAnimating) { // wasn't cancelled between animation calls
- var edge = _this.computeBestEdge(_this.pointerScreenX + window.pageXOffset, _this.pointerScreenY + window.pageYOffset);
- if (edge) {
- var now = getTime();
- _this.handleSide(edge, (now - _this.msSinceRequest) / 1000);
- _this.requestAnimation(now);
- }
- else {
- _this.isAnimating = false; // will stop animation
- }
- }
- };
- }
- AutoScroller.prototype.start = function (pageX, pageY) {
- if (this.isEnabled) {
- this.scrollCaches = this.buildCaches();
- this.pointerScreenX = null;
- this.pointerScreenY = null;
- this.everMovedUp = false;
- this.everMovedDown = false;
- this.everMovedLeft = false;
- this.everMovedRight = false;
- this.handleMove(pageX, pageY);
- }
- };
- AutoScroller.prototype.handleMove = function (pageX, pageY) {
- if (this.isEnabled) {
- var pointerScreenX = pageX - window.pageXOffset;
- var pointerScreenY = pageY - window.pageYOffset;
- var yDelta = this.pointerScreenY === null ? 0 : pointerScreenY - this.pointerScreenY;
- var xDelta = this.pointerScreenX === null ? 0 : pointerScreenX - this.pointerScreenX;
- if (yDelta < 0) {
- this.everMovedUp = true;
- }
- else if (yDelta > 0) {
- this.everMovedDown = true;
- }
- if (xDelta < 0) {
- this.everMovedLeft = true;
- }
- else if (xDelta > 0) {
- this.everMovedRight = true;
- }
- this.pointerScreenX = pointerScreenX;
- this.pointerScreenY = pointerScreenY;
- if (!this.isAnimating) {
- this.isAnimating = true;
- this.requestAnimation(getTime());
- }
- }
- };
- AutoScroller.prototype.stop = function () {
- if (this.isEnabled) {
- this.isAnimating = false; // will stop animation
- for (var _i = 0, _a = this.scrollCaches; _i < _a.length; _i++) {
- var scrollCache = _a[_i];
- scrollCache.destroy();
- }
- this.scrollCaches = null;
- }
- };
- AutoScroller.prototype.requestAnimation = function (now) {
- this.msSinceRequest = now;
- requestAnimationFrame(this.animate);
- };
- AutoScroller.prototype.handleSide = function (edge, seconds) {
- var scrollCache = edge.scrollCache;
- var edgeThreshold = this.edgeThreshold;
- var invDistance = edgeThreshold - edge.distance;
- var velocity = // the closer to the edge, the faster we scroll
- (invDistance * invDistance) / (edgeThreshold * edgeThreshold) * // quadratic
- this.maxVelocity * seconds;
- var sign = 1;
- switch (edge.name) {
- case 'left':
- sign = -1;
- // falls through
- case 'right':
- scrollCache.setScrollLeft(scrollCache.getScrollLeft() + velocity * sign);
- break;
- case 'top':
- sign = -1;
- // falls through
- case 'bottom':
- scrollCache.setScrollTop(scrollCache.getScrollTop() + velocity * sign);
- break;
- }
- };
- // left/top are relative to document topleft
- AutoScroller.prototype.computeBestEdge = function (left, top) {
- var edgeThreshold = this.edgeThreshold;
- var bestSide = null;
- for (var _i = 0, _a = this.scrollCaches; _i < _a.length; _i++) {
- var scrollCache = _a[_i];
- var rect = scrollCache.clientRect;
- var leftDist = left - rect.left;
- var rightDist = rect.right - left;
- var topDist = top - rect.top;
- var bottomDist = rect.bottom - top;
- // completely within the rect?
- if (leftDist >= 0 && rightDist >= 0 && topDist >= 0 && bottomDist >= 0) {
- if (topDist <= edgeThreshold && this.everMovedUp && scrollCache.canScrollUp() &&
- (!bestSide || bestSide.distance > topDist)) {
- bestSide = { scrollCache: scrollCache, name: 'top', distance: topDist };
- }
- if (bottomDist <= edgeThreshold && this.everMovedDown && scrollCache.canScrollDown() &&
- (!bestSide || bestSide.distance > bottomDist)) {
- bestSide = { scrollCache: scrollCache, name: 'bottom', distance: bottomDist };
- }
- if (leftDist <= edgeThreshold && this.everMovedLeft && scrollCache.canScrollLeft() &&
- (!bestSide || bestSide.distance > leftDist)) {
- bestSide = { scrollCache: scrollCache, name: 'left', distance: leftDist };
- }
- if (rightDist <= edgeThreshold && this.everMovedRight && scrollCache.canScrollRight() &&
- (!bestSide || bestSide.distance > rightDist)) {
- bestSide = { scrollCache: scrollCache, name: 'right', distance: rightDist };
- }
- }
- }
- return bestSide;
- };
- AutoScroller.prototype.buildCaches = function () {
- return this.queryScrollEls().map(function (el) {
- if (el === window) {
- return new WindowScrollGeomCache(false); // false = don't listen to user-generated scrolls
- }
- else {
- return new ElementScrollGeomCache(el, false); // false = don't listen to user-generated scrolls
- }
- });
- };
- AutoScroller.prototype.queryScrollEls = function () {
- var els = [];
- for (var _i = 0, _a = this.scrollQuery; _i < _a.length; _i++) {
- var query = _a[_i];
- if (typeof query === 'object') {
- els.push(query);
- }
- else {
- els.push.apply(els, Array.prototype.slice.call(document.querySelectorAll(query)));
- }
- }
- return els;
- };
- return AutoScroller;
- }());
-
- /*
- Monitors dragging on an element. Has a number of high-level features:
- - minimum distance required before dragging
- - minimum wait time ("delay") before dragging
- - a mirror element that follows the pointer
- */
- var FeaturefulElementDragging = /** @class */ (function (_super) {
- __extends(FeaturefulElementDragging, _super);
- function FeaturefulElementDragging(containerEl) {
- var _this = _super.call(this, containerEl) || this;
- // options that can be directly set by caller
- // the caller can also set the PointerDragging's options as well
- _this.delay = null;
- _this.minDistance = 0;
- _this.touchScrollAllowed = true; // prevents drag from starting and blocks scrolling during drag
- _this.mirrorNeedsRevert = false;
- _this.isInteracting = false; // is the user validly moving the pointer? lasts until pointerup
- _this.isDragging = false; // is it INTENTFULLY dragging? lasts until after revert animation
- _this.isDelayEnded = false;
- _this.isDistanceSurpassed = false;
- _this.delayTimeoutId = null;
- _this.onPointerDown = function (ev) {
- if (!_this.isDragging) { // so new drag doesn't happen while revert animation is going
- _this.isInteracting = true;
- _this.isDelayEnded = false;
- _this.isDistanceSurpassed = false;
- core.preventSelection(document.body);
- core.preventContextMenu(document.body);
- // prevent links from being visited if there's an eventual drag.
- // also prevents selection in older browsers (maybe?).
- // not necessary for touch, besides, browser would complain about passiveness.
- if (!ev.isTouch) {
- ev.origEvent.preventDefault();
- }
- _this.emitter.trigger('pointerdown', ev);
- if (!_this.pointer.shouldIgnoreMove) {
- // actions related to initiating dragstart+dragmove+dragend...
- _this.mirror.setIsVisible(false); // reset. caller must set-visible
- _this.mirror.start(ev.subjectEl, ev.pageX, ev.pageY); // must happen on first pointer down
- _this.startDelay(ev);
- if (!_this.minDistance) {
- _this.handleDistanceSurpassed(ev);
- }
- }
- }
- };
- _this.onPointerMove = function (ev) {
- if (_this.isInteracting) { // if false, still waiting for previous drag's revert
- _this.emitter.trigger('pointermove', ev);
- if (!_this.isDistanceSurpassed) {
- var minDistance = _this.minDistance;
- var distanceSq = void 0; // current distance from the origin, squared
- var deltaX = ev.deltaX, deltaY = ev.deltaY;
- distanceSq = deltaX * deltaX + deltaY * deltaY;
- if (distanceSq >= minDistance * minDistance) { // use pythagorean theorem
- _this.handleDistanceSurpassed(ev);
- }
- }
- if (_this.isDragging) {
- // a real pointer move? (not one simulated by scrolling)
- if (ev.origEvent.type !== 'scroll') {
- _this.mirror.handleMove(ev.pageX, ev.pageY);
- _this.autoScroller.handleMove(ev.pageX, ev.pageY);
- }
- _this.emitter.trigger('dragmove', ev);
- }
- }
- };
- _this.onPointerUp = function (ev) {
- if (_this.isInteracting) { // if false, still waiting for previous drag's revert
- _this.isInteracting = false;
- core.allowSelection(document.body);
- core.allowContextMenu(document.body);
- _this.emitter.trigger('pointerup', ev); // can potentially set mirrorNeedsRevert
- if (_this.isDragging) {
- _this.autoScroller.stop();
- _this.tryStopDrag(ev); // which will stop the mirror
- }
- if (_this.delayTimeoutId) {
- clearTimeout(_this.delayTimeoutId);
- _this.delayTimeoutId = null;
- }
- }
- };
- var pointer = _this.pointer = new PointerDragging(containerEl);
- pointer.emitter.on('pointerdown', _this.onPointerDown);
- pointer.emitter.on('pointermove', _this.onPointerMove);
- pointer.emitter.on('pointerup', _this.onPointerUp);
- _this.mirror = new ElementMirror();
- _this.autoScroller = new AutoScroller();
- return _this;
- }
- FeaturefulElementDragging.prototype.destroy = function () {
- this.pointer.destroy();
- };
- FeaturefulElementDragging.prototype.startDelay = function (ev) {
- var _this = this;
- if (typeof this.delay === 'number') {
- this.delayTimeoutId = setTimeout(function () {
- _this.delayTimeoutId = null;
- _this.handleDelayEnd(ev);
- }, this.delay); // not assignable to number!
- }
- else {
- this.handleDelayEnd(ev);
- }
- };
- FeaturefulElementDragging.prototype.handleDelayEnd = function (ev) {
- this.isDelayEnded = true;
- this.tryStartDrag(ev);
- };
- FeaturefulElementDragging.prototype.handleDistanceSurpassed = function (ev) {
- this.isDistanceSurpassed = true;
- this.tryStartDrag(ev);
- };
- FeaturefulElementDragging.prototype.tryStartDrag = function (ev) {
- if (this.isDelayEnded && this.isDistanceSurpassed) {
- if (!this.pointer.wasTouchScroll || this.touchScrollAllowed) {
- this.isDragging = true;
- this.mirrorNeedsRevert = false;
- this.autoScroller.start(ev.pageX, ev.pageY);
- this.emitter.trigger('dragstart', ev);
- if (this.touchScrollAllowed === false) {
- this.pointer.cancelTouchScroll();
- }
- }
- }
- };
- FeaturefulElementDragging.prototype.tryStopDrag = function (ev) {
- // .stop() is ALWAYS asynchronous, which we NEED because we want all pointerup events
- // that come from the document to fire beforehand. much more convenient this way.
- this.mirror.stop(this.mirrorNeedsRevert, this.stopDrag.bind(this, ev) // bound with args
- );
- };
- FeaturefulElementDragging.prototype.stopDrag = function (ev) {
- this.isDragging = false;
- this.emitter.trigger('dragend', ev);
- };
- // fill in the implementations...
- FeaturefulElementDragging.prototype.setIgnoreMove = function (bool) {
- this.pointer.shouldIgnoreMove = bool;
- };
- FeaturefulElementDragging.prototype.setMirrorIsVisible = function (bool) {
- this.mirror.setIsVisible(bool);
- };
- FeaturefulElementDragging.prototype.setMirrorNeedsRevert = function (bool) {
- this.mirrorNeedsRevert = bool;
- };
- FeaturefulElementDragging.prototype.setAutoScrollEnabled = function (bool) {
- this.autoScroller.isEnabled = bool;
- };
- return FeaturefulElementDragging;
- }(core.ElementDragging));
-
- /*
- When this class is instantiated, it records the offset of an element (relative to the document topleft),
- and continues to monitor scrolling, updating the cached coordinates if it needs to.
- Does not access the DOM after instantiation, so highly performant.
-
- Also keeps track of all scrolling/overflow:hidden containers that are parents of the given element
- and an determine if a given point is inside the combined clipping rectangle.
- */
- var OffsetTracker = /** @class */ (function () {
- function OffsetTracker(el) {
- this.origRect = core.computeRect(el);
- // will work fine for divs that have overflow:hidden
- this.scrollCaches = core.getClippingParents(el).map(function (el) {
- return new ElementScrollGeomCache(el, true); // listen=true
- });
- }
- OffsetTracker.prototype.destroy = function () {
- for (var _i = 0, _a = this.scrollCaches; _i < _a.length; _i++) {
- var scrollCache = _a[_i];
- scrollCache.destroy();
- }
- };
- OffsetTracker.prototype.computeLeft = function () {
- var left = this.origRect.left;
- for (var _i = 0, _a = this.scrollCaches; _i < _a.length; _i++) {
- var scrollCache = _a[_i];
- left += scrollCache.origScrollLeft - scrollCache.getScrollLeft();
- }
- return left;
- };
- OffsetTracker.prototype.computeTop = function () {
- var top = this.origRect.top;
- for (var _i = 0, _a = this.scrollCaches; _i < _a.length; _i++) {
- var scrollCache = _a[_i];
- top += scrollCache.origScrollTop - scrollCache.getScrollTop();
- }
- return top;
- };
- OffsetTracker.prototype.isWithinClipping = function (pageX, pageY) {
- var point = { left: pageX, top: pageY };
- for (var _i = 0, _a = this.scrollCaches; _i < _a.length; _i++) {
- var scrollCache = _a[_i];
- if (!isIgnoredClipping(scrollCache.getEventTarget()) &&
- !core.pointInsideRect(point, scrollCache.clientRect)) {
- return false;
- }
- }
- return true;
- };
- return OffsetTracker;
- }());
- // certain clipping containers should never constrain interactions, like <html> and <body>
- // https://github.com/fullcalendar/fullcalendar/issues/3615
- function isIgnoredClipping(node) {
- var tagName = node.tagName;
- return tagName === 'HTML' || tagName === 'BODY';
- }
-
- /*
- Tracks movement over multiple droppable areas (aka "hits")
- that exist in one or more DateComponents.
- Relies on an existing draggable.
-
- emits:
- - pointerdown
- - dragstart
- - hitchange - fires initially, even if not over a hit
- - pointerup
- - (hitchange - again, to null, if ended over a hit)
- - dragend
- */
- var HitDragging = /** @class */ (function () {
- function HitDragging(dragging, droppableStore) {
- var _this = this;
- // options that can be set by caller
- this.useSubjectCenter = false;
- this.requireInitial = true; // if doesn't start out on a hit, won't emit any events
- this.initialHit = null;
- this.movingHit = null;
- this.finalHit = null; // won't ever be populated if shouldIgnoreMove
- this.handlePointerDown = function (ev) {
- var dragging = _this.dragging;
- _this.initialHit = null;
- _this.movingHit = null;
- _this.finalHit = null;
- _this.prepareHits();
- _this.processFirstCoord(ev);
- if (_this.initialHit || !_this.requireInitial) {
- dragging.setIgnoreMove(false);
- _this.emitter.trigger('pointerdown', ev); // TODO: fire this before computing processFirstCoord, so listeners can cancel. this gets fired by almost every handler :(
- }
- else {
- dragging.setIgnoreMove(true);
- }
- };
- this.handleDragStart = function (ev) {
- _this.emitter.trigger('dragstart', ev);
- _this.handleMove(ev, true); // force = fire even if initially null
- };
- this.handleDragMove = function (ev) {
- _this.emitter.trigger('dragmove', ev);
- _this.handleMove(ev);
- };
- this.handlePointerUp = function (ev) {
- _this.releaseHits();
- _this.emitter.trigger('pointerup', ev);
- };
- this.handleDragEnd = function (ev) {
- if (_this.movingHit) {
- _this.emitter.trigger('hitupdate', null, true, ev);
- }
- _this.finalHit = _this.movingHit;
- _this.movingHit = null;
- _this.emitter.trigger('dragend', ev);
- };
- this.droppableStore = droppableStore;
- dragging.emitter.on('pointerdown', this.handlePointerDown);
- dragging.emitter.on('dragstart', this.handleDragStart);
- dragging.emitter.on('dragmove', this.handleDragMove);
- dragging.emitter.on('pointerup', this.handlePointerUp);
- dragging.emitter.on('dragend', this.handleDragEnd);
- this.dragging = dragging;
- this.emitter = new core.EmitterMixin();
- }
- // sets initialHit
- // sets coordAdjust
- HitDragging.prototype.processFirstCoord = function (ev) {
- var origPoint = { left: ev.pageX, top: ev.pageY };
- var adjustedPoint = origPoint;
- var subjectEl = ev.subjectEl;
- var subjectRect;
- if (subjectEl !== document) {
- subjectRect = core.computeRect(subjectEl);
- adjustedPoint = core.constrainPoint(adjustedPoint, subjectRect);
- }
- var initialHit = this.initialHit = this.queryHitForOffset(adjustedPoint.left, adjustedPoint.top);
- if (initialHit) {
- if (this.useSubjectCenter && subjectRect) {
- var slicedSubjectRect = core.intersectRects(subjectRect, initialHit.rect);
- if (slicedSubjectRect) {
- adjustedPoint = core.getRectCenter(slicedSubjectRect);
- }
- }
- this.coordAdjust = core.diffPoints(adjustedPoint, origPoint);
- }
- else {
- this.coordAdjust = { left: 0, top: 0 };
- }
- };
- HitDragging.prototype.handleMove = function (ev, forceHandle) {
- var hit = this.queryHitForOffset(ev.pageX + this.coordAdjust.left, ev.pageY + this.coordAdjust.top);
- if (forceHandle || !isHitsEqual(this.movingHit, hit)) {
- this.movingHit = hit;
- this.emitter.trigger('hitupdate', hit, false, ev);
- }
- };
- HitDragging.prototype.prepareHits = function () {
- this.offsetTrackers = core.mapHash(this.droppableStore, function (interactionSettings) {
- interactionSettings.component.buildPositionCaches();
- return new OffsetTracker(interactionSettings.el);
- });
- };
- HitDragging.prototype.releaseHits = function () {
- var offsetTrackers = this.offsetTrackers;
- for (var id in offsetTrackers) {
- offsetTrackers[id].destroy();
- }
- this.offsetTrackers = {};
- };
- HitDragging.prototype.queryHitForOffset = function (offsetLeft, offsetTop) {
- var _a = this, droppableStore = _a.droppableStore, offsetTrackers = _a.offsetTrackers;
- var bestHit = null;
- for (var id in droppableStore) {
- var component = droppableStore[id].component;
- var offsetTracker = offsetTrackers[id];
- if (offsetTracker.isWithinClipping(offsetLeft, offsetTop)) {
- var originLeft = offsetTracker.computeLeft();
- var originTop = offsetTracker.computeTop();
- var positionLeft = offsetLeft - originLeft;
- var positionTop = offsetTop - originTop;
- var origRect = offsetTracker.origRect;
- var width = origRect.right - origRect.left;
- var height = origRect.bottom - origRect.top;
- if (
- // must be within the element's bounds
- positionLeft >= 0 && positionLeft < width &&
- positionTop >= 0 && positionTop < height) {
- var hit = component.queryHit(positionLeft, positionTop, width, height);
- if (hit &&
- (
- // make sure the hit is within activeRange, meaning it's not a deal cell
- !component.props.dateProfile || // hack for DayTile
- core.rangeContainsRange(component.props.dateProfile.activeRange, hit.dateSpan.range)) &&
- (!bestHit || hit.layer > bestHit.layer)) {
- // TODO: better way to re-orient rectangle
- hit.rect.left += originLeft;
- hit.rect.right += originLeft;
- hit.rect.top += originTop;
- hit.rect.bottom += originTop;
- bestHit = hit;
- }
- }
- }
- }
- return bestHit;
- };
- return HitDragging;
- }());
- function isHitsEqual(hit0, hit1) {
- if (!hit0 && !hit1) {
- return true;
- }
- if (Boolean(hit0) !== Boolean(hit1)) {
- return false;
- }
- return core.isDateSpansEqual(hit0.dateSpan, hit1.dateSpan);
- }
-
- /*
- Monitors when the user clicks on a specific date/time of a component.
- A pointerdown+pointerup on the same "hit" constitutes a click.
- */
- var DateClicking = /** @class */ (function (_super) {
- __extends(DateClicking, _super);
- function DateClicking(settings) {
- var _this = _super.call(this, settings) || this;
- _this.handlePointerDown = function (ev) {
- var dragging = _this.dragging;
- // do this in pointerdown (not dragend) because DOM might be mutated by the time dragend is fired
- dragging.setIgnoreMove(!_this.component.isValidDateDownEl(dragging.pointer.downEl));
- };
- // won't even fire if moving was ignored
- _this.handleDragEnd = function (ev) {
- var component = _this.component;
- var _a = component.context, calendar = _a.calendar, view = _a.view;
- var pointer = _this.dragging.pointer;
- if (!pointer.wasTouchScroll) {
- var _b = _this.hitDragging, initialHit = _b.initialHit, finalHit = _b.finalHit;
- if (initialHit && finalHit && isHitsEqual(initialHit, finalHit)) {
- calendar.triggerDateClick(initialHit.dateSpan, initialHit.dayEl, view, ev.origEvent);
- }
- }
- };
- var component = settings.component;
- // we DO want to watch pointer moves because otherwise finalHit won't get populated
- _this.dragging = new FeaturefulElementDragging(component.el);
- _this.dragging.autoScroller.isEnabled = false;
- var hitDragging = _this.hitDragging = new HitDragging(_this.dragging, core.interactionSettingsToStore(settings));
- hitDragging.emitter.on('pointerdown', _this.handlePointerDown);
- hitDragging.emitter.on('dragend', _this.handleDragEnd);
- return _this;
- }
- DateClicking.prototype.destroy = function () {
- this.dragging.destroy();
- };
- return DateClicking;
- }(core.Interaction));
-
- /*
- Tracks when the user selects a portion of time of a component,
- constituted by a drag over date cells, with a possible delay at the beginning of the drag.
- */
- var DateSelecting = /** @class */ (function (_super) {
- __extends(DateSelecting, _super);
- function DateSelecting(settings) {
- var _this = _super.call(this, settings) || this;
- _this.dragSelection = null;
- _this.handlePointerDown = function (ev) {
- var _a = _this, component = _a.component, dragging = _a.dragging;
- var options = component.context.options;
- var canSelect = options.selectable &&
- component.isValidDateDownEl(ev.origEvent.target);
- // don't bother to watch expensive moves if component won't do selection
- dragging.setIgnoreMove(!canSelect);
- // if touch, require user to hold down
- dragging.delay = ev.isTouch ? getComponentTouchDelay(component) : null;
- };
- _this.handleDragStart = function (ev) {
- _this.component.context.calendar.unselect(ev); // unselect previous selections
- };
- _this.handleHitUpdate = function (hit, isFinal) {
- var calendar = _this.component.context.calendar;
- var dragSelection = null;
- var isInvalid = false;
- if (hit) {
- dragSelection = joinHitsIntoSelection(_this.hitDragging.initialHit, hit, calendar.pluginSystem.hooks.dateSelectionTransformers);
- if (!dragSelection || !_this.component.isDateSelectionValid(dragSelection)) {
- isInvalid = true;
- dragSelection = null;
- }
- }
- if (dragSelection) {
- calendar.dispatch({ type: 'SELECT_DATES', selection: dragSelection });
- }
- else if (!isFinal) { // only unselect if moved away while dragging
- calendar.dispatch({ type: 'UNSELECT_DATES' });
- }
- if (!isInvalid) {
- core.enableCursor();
- }
- else {
- core.disableCursor();
- }
- if (!isFinal) {
- _this.dragSelection = dragSelection; // only clear if moved away from all hits while dragging
- }
- };
- _this.handlePointerUp = function (pev) {
- if (_this.dragSelection) {
- // selection is already rendered, so just need to report selection
- _this.component.context.calendar.triggerDateSelect(_this.dragSelection, pev);
- _this.dragSelection = null;
- }
- };
- var component = settings.component;
- var options = component.context.options;
- var dragging = _this.dragging = new FeaturefulElementDragging(component.el);
- dragging.touchScrollAllowed = false;
- dragging.minDistance = options.selectMinDistance || 0;
- dragging.autoScroller.isEnabled = options.dragScroll;
- var hitDragging = _this.hitDragging = new HitDragging(_this.dragging, core.interactionSettingsToStore(settings));
- hitDragging.emitter.on('pointerdown', _this.handlePointerDown);
- hitDragging.emitter.on('dragstart', _this.handleDragStart);
- hitDragging.emitter.on('hitupdate', _this.handleHitUpdate);
- hitDragging.emitter.on('pointerup', _this.handlePointerUp);
- return _this;
- }
- DateSelecting.prototype.destroy = function () {
- this.dragging.destroy();
- };
- return DateSelecting;
- }(core.Interaction));
- function getComponentTouchDelay(component) {
- var options = component.context.options;
- var delay = options.selectLongPressDelay;
- if (delay == null) {
- delay = options.longPressDelay;
- }
- return delay;
- }
- function joinHitsIntoSelection(hit0, hit1, dateSelectionTransformers) {
- var dateSpan0 = hit0.dateSpan;
- var dateSpan1 = hit1.dateSpan;
- var ms = [
- dateSpan0.range.start,
- dateSpan0.range.end,
- dateSpan1.range.start,
- dateSpan1.range.end
- ];
- ms.sort(core.compareNumbers);
- var props = {};
- for (var _i = 0, dateSelectionTransformers_1 = dateSelectionTransformers; _i < dateSelectionTransformers_1.length; _i++) {
- var transformer = dateSelectionTransformers_1[_i];
- var res = transformer(hit0, hit1);
- if (res === false) {
- return null;
- }
- else if (res) {
- __assign(props, res);
- }
- }
- props.range = { start: ms[0], end: ms[3] };
- props.allDay = dateSpan0.allDay;
- return props;
- }
-
- var EventDragging = /** @class */ (function (_super) {
- __extends(EventDragging, _super);
- function EventDragging(settings) {
- var _this = _super.call(this, settings) || this;
- // internal state
- _this.subjectSeg = null; // the seg being selected/dragged
- _this.isDragging = false;
- _this.eventRange = null;
- _this.relevantEvents = null; // the events being dragged
- _this.receivingCalendar = null;
- _this.validMutation = null;
- _this.mutatedRelevantEvents = null;
- _this.handlePointerDown = function (ev) {
- var origTarget = ev.origEvent.target;
- var _a = _this, component = _a.component, dragging = _a.dragging;
- var mirror = dragging.mirror;
- var options = component.context.options;
- var initialCalendar = component.context.calendar;
- var subjectSeg = _this.subjectSeg = core.getElSeg(ev.subjectEl);
- var eventRange = _this.eventRange = subjectSeg.eventRange;
- var eventInstanceId = eventRange.instance.instanceId;
- _this.relevantEvents = core.getRelevantEvents(initialCalendar.state.eventStore, eventInstanceId);
- dragging.minDistance = ev.isTouch ? 0 : options.eventDragMinDistance;
- dragging.delay =
- // only do a touch delay if touch and this event hasn't been selected yet
- (ev.isTouch && eventInstanceId !== component.props.eventSelection) ?
- getComponentTouchDelay$1(component) :
- null;
- mirror.parentNode = initialCalendar.el;
- mirror.revertDuration = options.dragRevertDuration;
- var isValid = component.isValidSegDownEl(origTarget) &&
- !core.elementClosest(origTarget, '.fc-resizer'); // NOT on a resizer
- dragging.setIgnoreMove(!isValid);
- // disable dragging for elements that are resizable (ie, selectable)
- // but are not draggable
- _this.isDragging = isValid &&
- ev.subjectEl.classList.contains('fc-draggable');
- };
- _this.handleDragStart = function (ev) {
- var context = _this.component.context;
- var initialCalendar = context.calendar;
- var eventRange = _this.eventRange;
- var eventInstanceId = eventRange.instance.instanceId;
- if (ev.isTouch) {
- // need to select a different event?
- if (eventInstanceId !== _this.component.props.eventSelection) {
- initialCalendar.dispatch({ type: 'SELECT_EVENT', eventInstanceId: eventInstanceId });
- }
- }
- else {
- // if now using mouse, but was previous touch interaction, clear selected event
- initialCalendar.dispatch({ type: 'UNSELECT_EVENT' });
- }
- if (_this.isDragging) {
- initialCalendar.unselect(ev); // unselect *date* selection
- initialCalendar.publiclyTrigger('eventDragStart', [
- {
- el: _this.subjectSeg.el,
- event: new core.EventApi(initialCalendar, eventRange.def, eventRange.instance),
- jsEvent: ev.origEvent,
- view: context.view
- }
- ]);
- }
- };
- _this.handleHitUpdate = function (hit, isFinal) {
- if (!_this.isDragging) {
- return;
- }
- var relevantEvents = _this.relevantEvents;
- var initialHit = _this.hitDragging.initialHit;
- var initialCalendar = _this.component.context.calendar;
- // states based on new hit
- var receivingCalendar = null;
- var mutation = null;
- var mutatedRelevantEvents = null;
- var isInvalid = false;
- var interaction = {
- affectedEvents: relevantEvents,
- mutatedEvents: core.createEmptyEventStore(),
- isEvent: true,
- origSeg: _this.subjectSeg
- };
- if (hit) {
- var receivingComponent = hit.component;
- receivingCalendar = receivingComponent.context.calendar;
- var receivingOptions = receivingComponent.context.options;
- if (initialCalendar === receivingCalendar ||
- receivingOptions.editable && receivingOptions.droppable) {
- mutation = computeEventMutation(initialHit, hit, receivingCalendar.pluginSystem.hooks.eventDragMutationMassagers);
- if (mutation) {
- mutatedRelevantEvents = core.applyMutationToEventStore(relevantEvents, receivingCalendar.eventUiBases, mutation, receivingCalendar);
- interaction.mutatedEvents = mutatedRelevantEvents;
- if (!receivingComponent.isInteractionValid(interaction)) {
- isInvalid = true;
- mutation = null;
- mutatedRelevantEvents = null;
- interaction.mutatedEvents = core.createEmptyEventStore();
- }
- }
- }
- else {
- receivingCalendar = null;
- }
- }
- _this.displayDrag(receivingCalendar, interaction);
- if (!isInvalid) {
- core.enableCursor();
- }
- else {
- core.disableCursor();
- }
- if (!isFinal) {
- if (initialCalendar === receivingCalendar && // TODO: write test for this
- isHitsEqual(initialHit, hit)) {
- mutation = null;
- }
- _this.dragging.setMirrorNeedsRevert(!mutation);
- // render the mirror if no already-rendered mirror
- // TODO: wish we could somehow wait for dispatch to guarantee render
- _this.dragging.setMirrorIsVisible(!hit || !document.querySelector('.fc-mirror'));
- // assign states based on new hit
- _this.receivingCalendar = receivingCalendar;
- _this.validMutation = mutation;
- _this.mutatedRelevantEvents = mutatedRelevantEvents;
- }
- };
- _this.handlePointerUp = function () {
- if (!_this.isDragging) {
- _this.cleanup(); // because handleDragEnd won't fire
- }
- };
- _this.handleDragEnd = function (ev) {
- if (_this.isDragging) {
- var context = _this.component.context;
- var initialCalendar_1 = context.calendar;
- var initialView = context.view;
- var _a = _this, receivingCalendar = _a.receivingCalendar, validMutation = _a.validMutation;
- var eventDef = _this.eventRange.def;
- var eventInstance = _this.eventRange.instance;
- var eventApi = new core.EventApi(initialCalendar_1, eventDef, eventInstance);
- var relevantEvents_1 = _this.relevantEvents;
- var mutatedRelevantEvents = _this.mutatedRelevantEvents;
- var finalHit = _this.hitDragging.finalHit;
- _this.clearDrag(); // must happen after revert animation
- initialCalendar_1.publiclyTrigger('eventDragStop', [
- {
- el: _this.subjectSeg.el,
- event: eventApi,
- jsEvent: ev.origEvent,
- view: initialView
- }
- ]);
- if (validMutation) {
- // dropped within same calendar
- if (receivingCalendar === initialCalendar_1) {
- initialCalendar_1.dispatch({
- type: 'MERGE_EVENTS',
- eventStore: mutatedRelevantEvents
- });
- var transformed = {};
- for (var _i = 0, _b = initialCalendar_1.pluginSystem.hooks.eventDropTransformers; _i < _b.length; _i++) {
- var transformer = _b[_i];
- __assign(transformed, transformer(validMutation, initialCalendar_1));
- }
- var eventDropArg = __assign({}, transformed, { el: ev.subjectEl, delta: validMutation.datesDelta, oldEvent: eventApi, event: new core.EventApi(// the data AFTER the mutation
- initialCalendar_1, mutatedRelevantEvents.defs[eventDef.defId], eventInstance ? mutatedRelevantEvents.instances[eventInstance.instanceId] : null), revert: function () {
- initialCalendar_1.dispatch({
- type: 'MERGE_EVENTS',
- eventStore: relevantEvents_1
- });
- }, jsEvent: ev.origEvent, view: initialView });
- initialCalendar_1.publiclyTrigger('eventDrop', [eventDropArg]);
- // dropped in different calendar
- }
- else if (receivingCalendar) {
- initialCalendar_1.publiclyTrigger('eventLeave', [
- {
- draggedEl: ev.subjectEl,
- event: eventApi,
- view: initialView
- }
- ]);
- initialCalendar_1.dispatch({
- type: 'REMOVE_EVENT_INSTANCES',
- instances: _this.mutatedRelevantEvents.instances
- });
- receivingCalendar.dispatch({
- type: 'MERGE_EVENTS',
- eventStore: _this.mutatedRelevantEvents
- });
- if (ev.isTouch) {
- receivingCalendar.dispatch({
- type: 'SELECT_EVENT',
- eventInstanceId: eventInstance.instanceId
- });
- }
- var dropArg = __assign({}, receivingCalendar.buildDatePointApi(finalHit.dateSpan), { draggedEl: ev.subjectEl, jsEvent: ev.origEvent, view: finalHit.component // should this be finalHit.component.view? See #4644
- });
- receivingCalendar.publiclyTrigger('drop', [dropArg]);
- receivingCalendar.publiclyTrigger('eventReceive', [
- {
- draggedEl: ev.subjectEl,
- event: new core.EventApi(// the data AFTER the mutation
- receivingCalendar, mutatedRelevantEvents.defs[eventDef.defId], mutatedRelevantEvents.instances[eventInstance.instanceId]),
- view: finalHit.component // should this be finalHit.component.view? See #4644
- }
- ]);
- }
- }
- else {
- initialCalendar_1.publiclyTrigger('_noEventDrop');
- }
- }
- _this.cleanup();
- };
- var component = _this.component;
- var options = component.context.options;
- var dragging = _this.dragging = new FeaturefulElementDragging(component.el);
- dragging.pointer.selector = EventDragging.SELECTOR;
- dragging.touchScrollAllowed = false;
- dragging.autoScroller.isEnabled = options.dragScroll;
- var hitDragging = _this.hitDragging = new HitDragging(_this.dragging, core.interactionSettingsStore);
- hitDragging.useSubjectCenter = settings.useEventCenter;
- hitDragging.emitter.on('pointerdown', _this.handlePointerDown);
- hitDragging.emitter.on('dragstart', _this.handleDragStart);
- hitDragging.emitter.on('hitupdate', _this.handleHitUpdate);
- hitDragging.emitter.on('pointerup', _this.handlePointerUp);
- hitDragging.emitter.on('dragend', _this.handleDragEnd);
- return _this;
- }
- EventDragging.prototype.destroy = function () {
- this.dragging.destroy();
- };
- // render a drag state on the next receivingCalendar
- EventDragging.prototype.displayDrag = function (nextCalendar, state) {
- var initialCalendar = this.component.context.calendar;
- var prevCalendar = this.receivingCalendar;
- // does the previous calendar need to be cleared?
- if (prevCalendar && prevCalendar !== nextCalendar) {
- // does the initial calendar need to be cleared?
- // if so, don't clear all the way. we still need to to hide the affectedEvents
- if (prevCalendar === initialCalendar) {
- prevCalendar.dispatch({
- type: 'SET_EVENT_DRAG',
- state: {
- affectedEvents: state.affectedEvents,
- mutatedEvents: core.createEmptyEventStore(),
- isEvent: true,
- origSeg: state.origSeg
- }
- });
- // completely clear the old calendar if it wasn't the initial
- }
- else {
- prevCalendar.dispatch({ type: 'UNSET_EVENT_DRAG' });
- }
- }
- if (nextCalendar) {
- nextCalendar.dispatch({ type: 'SET_EVENT_DRAG', state: state });
- }
- };
- EventDragging.prototype.clearDrag = function () {
- var initialCalendar = this.component.context.calendar;
- var receivingCalendar = this.receivingCalendar;
- if (receivingCalendar) {
- receivingCalendar.dispatch({ type: 'UNSET_EVENT_DRAG' });
- }
- // the initial calendar might have an dummy drag state from displayDrag
- if (initialCalendar !== receivingCalendar) {
- initialCalendar.dispatch({ type: 'UNSET_EVENT_DRAG' });
- }
- };
- EventDragging.prototype.cleanup = function () {
- this.subjectSeg = null;
- this.isDragging = false;
- this.eventRange = null;
- this.relevantEvents = null;
- this.receivingCalendar = null;
- this.validMutation = null;
- this.mutatedRelevantEvents = null;
- };
- EventDragging.SELECTOR = '.fc-draggable, .fc-resizable'; // TODO: test this in IE11
- return EventDragging;
- }(core.Interaction));
- function computeEventMutation(hit0, hit1, massagers) {
- var dateSpan0 = hit0.dateSpan;
- var dateSpan1 = hit1.dateSpan;
- var date0 = dateSpan0.range.start;
- var date1 = dateSpan1.range.start;
- var standardProps = {};
- if (dateSpan0.allDay !== dateSpan1.allDay) {
- standardProps.allDay = dateSpan1.allDay;
- standardProps.hasEnd = hit1.component.context.options.allDayMaintainDuration;
- if (dateSpan1.allDay) {
- // means date1 is already start-of-day,
- // but date0 needs to be converted
- date0 = core.startOfDay(date0);
- }
- }
- var delta = core.diffDates(date0, date1, hit0.component.context.dateEnv, hit0.component === hit1.component ?
- hit0.component.largeUnit :
- null);
- if (delta.milliseconds) { // has hours/minutes/seconds
- standardProps.allDay = false;
- }
- var mutation = {
- datesDelta: delta,
- standardProps: standardProps
- };
- for (var _i = 0, massagers_1 = massagers; _i < massagers_1.length; _i++) {
- var massager = massagers_1[_i];
- massager(mutation, hit0, hit1);
- }
- return mutation;
- }
- function getComponentTouchDelay$1(component) {
- var options = component.context.options;
- var delay = options.eventLongPressDelay;
- if (delay == null) {
- delay = options.longPressDelay;
- }
- return delay;
- }
-
- var EventDragging$1 = /** @class */ (function (_super) {
- __extends(EventDragging, _super);
- function EventDragging(settings) {
- var _this = _super.call(this, settings) || this;
- // internal state
- _this.draggingSeg = null; // TODO: rename to resizingSeg? subjectSeg?
- _this.eventRange = null;
- _this.relevantEvents = null;
- _this.validMutation = null;
- _this.mutatedRelevantEvents = null;
- _this.handlePointerDown = function (ev) {
- var component = _this.component;
- var seg = _this.querySeg(ev);
- var eventRange = _this.eventRange = seg.eventRange;
- _this.dragging.minDistance = component.context.options.eventDragMinDistance;
- // if touch, need to be working with a selected event
- _this.dragging.setIgnoreMove(!_this.component.isValidSegDownEl(ev.origEvent.target) ||
- (ev.isTouch && _this.component.props.eventSelection !== eventRange.instance.instanceId));
- };
- _this.handleDragStart = function (ev) {
- var _a = _this.component.context, calendar = _a.calendar, view = _a.view;
- var eventRange = _this.eventRange;
- _this.relevantEvents = core.getRelevantEvents(calendar.state.eventStore, _this.eventRange.instance.instanceId);
- _this.draggingSeg = _this.querySeg(ev);
- calendar.unselect();
- calendar.publiclyTrigger('eventResizeStart', [
- {
- el: _this.draggingSeg.el,
- event: new core.EventApi(calendar, eventRange.def, eventRange.instance),
- jsEvent: ev.origEvent,
- view: view
- }
- ]);
- };
- _this.handleHitUpdate = function (hit, isFinal, ev) {
- var calendar = _this.component.context.calendar;
- var relevantEvents = _this.relevantEvents;
- var initialHit = _this.hitDragging.initialHit;
- var eventInstance = _this.eventRange.instance;
- var mutation = null;
- var mutatedRelevantEvents = null;
- var isInvalid = false;
- var interaction = {
- affectedEvents: relevantEvents,
- mutatedEvents: core.createEmptyEventStore(),
- isEvent: true,
- origSeg: _this.draggingSeg
- };
- if (hit) {
- mutation = computeMutation(initialHit, hit, ev.subjectEl.classList.contains('fc-start-resizer'), eventInstance.range, calendar.pluginSystem.hooks.eventResizeJoinTransforms);
- }
- if (mutation) {
- mutatedRelevantEvents = core.applyMutationToEventStore(relevantEvents, calendar.eventUiBases, mutation, calendar);
- interaction.mutatedEvents = mutatedRelevantEvents;
- if (!_this.component.isInteractionValid(interaction)) {
- isInvalid = true;
- mutation = null;
- mutatedRelevantEvents = null;
- interaction.mutatedEvents = null;
- }
- }
- if (mutatedRelevantEvents) {
- calendar.dispatch({
- type: 'SET_EVENT_RESIZE',
- state: interaction
- });
- }
- else {
- calendar.dispatch({ type: 'UNSET_EVENT_RESIZE' });
- }
- if (!isInvalid) {
- core.enableCursor();
- }
- else {
- core.disableCursor();
- }
- if (!isFinal) {
- if (mutation && isHitsEqual(initialHit, hit)) {
- mutation = null;
- }
- _this.validMutation = mutation;
- _this.mutatedRelevantEvents = mutatedRelevantEvents;
- }
- };
- _this.handleDragEnd = function (ev) {
- var _a = _this.component.context, calendar = _a.calendar, view = _a.view;
- var eventDef = _this.eventRange.def;
- var eventInstance = _this.eventRange.instance;
- var eventApi = new core.EventApi(calendar, eventDef, eventInstance);
- var relevantEvents = _this.relevantEvents;
- var mutatedRelevantEvents = _this.mutatedRelevantEvents;
- calendar.publiclyTrigger('eventResizeStop', [
- {
- el: _this.draggingSeg.el,
- event: eventApi,
- jsEvent: ev.origEvent,
- view: view
- }
- ]);
- if (_this.validMutation) {
- calendar.dispatch({
- type: 'MERGE_EVENTS',
- eventStore: mutatedRelevantEvents
- });
- calendar.publiclyTrigger('eventResize', [
- {
- el: _this.draggingSeg.el,
- startDelta: _this.validMutation.startDelta || core.createDuration(0),
- endDelta: _this.validMutation.endDelta || core.createDuration(0),
- prevEvent: eventApi,
- event: new core.EventApi(// the data AFTER the mutation
- calendar, mutatedRelevantEvents.defs[eventDef.defId], eventInstance ? mutatedRelevantEvents.instances[eventInstance.instanceId] : null),
- revert: function () {
- calendar.dispatch({
- type: 'MERGE_EVENTS',
- eventStore: relevantEvents
- });
- },
- jsEvent: ev.origEvent,
- view: view
- }
- ]);
- }
- else {
- calendar.publiclyTrigger('_noEventResize');
- }
- // reset all internal state
- _this.draggingSeg = null;
- _this.relevantEvents = null;
- _this.validMutation = null;
- // okay to keep eventInstance around. useful to set it in handlePointerDown
- };
- var component = settings.component;
- var dragging = _this.dragging = new FeaturefulElementDragging(component.el);
- dragging.pointer.selector = '.fc-resizer';
- dragging.touchScrollAllowed = false;
- dragging.autoScroller.isEnabled = component.context.options.dragScroll;
- var hitDragging = _this.hitDragging = new HitDragging(_this.dragging, core.interactionSettingsToStore(settings));
- hitDragging.emitter.on('pointerdown', _this.handlePointerDown);
- hitDragging.emitter.on('dragstart', _this.handleDragStart);
- hitDragging.emitter.on('hitupdate', _this.handleHitUpdate);
- hitDragging.emitter.on('dragend', _this.handleDragEnd);
- return _this;
- }
- EventDragging.prototype.destroy = function () {
- this.dragging.destroy();
- };
- EventDragging.prototype.querySeg = function (ev) {
- return core.getElSeg(core.elementClosest(ev.subjectEl, this.component.fgSegSelector));
- };
- return EventDragging;
- }(core.Interaction));
- function computeMutation(hit0, hit1, isFromStart, instanceRange, transforms) {
- var dateEnv = hit0.component.context.dateEnv;
- var date0 = hit0.dateSpan.range.start;
- var date1 = hit1.dateSpan.range.start;
- var delta = core.diffDates(date0, date1, dateEnv, hit0.component.largeUnit);
- var props = {};
- for (var _i = 0, transforms_1 = transforms; _i < transforms_1.length; _i++) {
- var transform = transforms_1[_i];
- var res = transform(hit0, hit1);
- if (res === false) {
- return null;
- }
- else if (res) {
- __assign(props, res);
- }
- }
- if (isFromStart) {
- if (dateEnv.add(instanceRange.start, delta) < instanceRange.end) {
- props.startDelta = delta;
- return props;
- }
- }
- else {
- if (dateEnv.add(instanceRange.end, delta) > instanceRange.start) {
- props.endDelta = delta;
- return props;
- }
- }
- return null;
- }
-
- var UnselectAuto = /** @class */ (function () {
- function UnselectAuto(calendar) {
- var _this = this;
- this.isRecentPointerDateSelect = false; // wish we could use a selector to detect date selection, but uses hit system
- this.onSelect = function (selectInfo) {
- if (selectInfo.jsEvent) {
- _this.isRecentPointerDateSelect = true;
- }
- };
- this.onDocumentPointerUp = function (pev) {
- var _a = _this, calendar = _a.calendar, documentPointer = _a.documentPointer;
- var state = calendar.state;
- // touch-scrolling should never unfocus any type of selection
- if (!documentPointer.wasTouchScroll) {
- if (state.dateSelection && // an existing date selection?
- !_this.isRecentPointerDateSelect // a new pointer-initiated date selection since last onDocumentPointerUp?
- ) {
- var unselectAuto = calendar.viewOpt('unselectAuto');
- var unselectCancel = calendar.viewOpt('unselectCancel');
- if (unselectAuto && (!unselectAuto || !core.elementClosest(documentPointer.downEl, unselectCancel))) {
- calendar.unselect(pev);
- }
- }
- if (state.eventSelection && // an existing event selected?
- !core.elementClosest(documentPointer.downEl, EventDragging.SELECTOR) // interaction DIDN'T start on an event
- ) {
- calendar.dispatch({ type: 'UNSELECT_EVENT' });
- }
- }
- _this.isRecentPointerDateSelect = false;
- };
- this.calendar = calendar;
- var documentPointer = this.documentPointer = new PointerDragging(document);
- documentPointer.shouldIgnoreMove = true;
- documentPointer.shouldWatchScroll = false;
- documentPointer.emitter.on('pointerup', this.onDocumentPointerUp);
- /*
- TODO: better way to know about whether there was a selection with the pointer
- */
- calendar.on('select', this.onSelect);
- }
- UnselectAuto.prototype.destroy = function () {
- this.calendar.off('select', this.onSelect);
- this.documentPointer.destroy();
- };
- return UnselectAuto;
- }());
-
- /*
- Given an already instantiated draggable object for one-or-more elements,
- Interprets any dragging as an attempt to drag an events that lives outside
- of a calendar onto a calendar.
- */
- var ExternalElementDragging = /** @class */ (function () {
- function ExternalElementDragging(dragging, suppliedDragMeta) {
- var _this = this;
- this.receivingCalendar = null;
- this.droppableEvent = null; // will exist for all drags, even if create:false
- this.suppliedDragMeta = null;
- this.dragMeta = null;
- this.handleDragStart = function (ev) {
- _this.dragMeta = _this.buildDragMeta(ev.subjectEl);
- };
- this.handleHitUpdate = function (hit, isFinal, ev) {
- var dragging = _this.hitDragging.dragging;
- var receivingCalendar = null;
- var droppableEvent = null;
- var isInvalid = false;
- var interaction = {
- affectedEvents: core.createEmptyEventStore(),
- mutatedEvents: core.createEmptyEventStore(),
- isEvent: _this.dragMeta.create,
- origSeg: null
- };
- if (hit) {
- receivingCalendar = hit.component.context.calendar;
- if (_this.canDropElOnCalendar(ev.subjectEl, receivingCalendar)) {
- droppableEvent = computeEventForDateSpan(hit.dateSpan, _this.dragMeta, receivingCalendar);
- interaction.mutatedEvents = core.eventTupleToStore(droppableEvent);
- isInvalid = !core.isInteractionValid(interaction, receivingCalendar);
- if (isInvalid) {
- interaction.mutatedEvents = core.createEmptyEventStore();
- droppableEvent = null;
- }
- }
- }
- _this.displayDrag(receivingCalendar, interaction);
- // show mirror if no already-rendered mirror element OR if we are shutting down the mirror (?)
- // TODO: wish we could somehow wait for dispatch to guarantee render
- dragging.setMirrorIsVisible(isFinal || !droppableEvent || !document.querySelector('.fc-mirror'));
- if (!isInvalid) {
- core.enableCursor();
- }
- else {
- core.disableCursor();
- }
- if (!isFinal) {
- dragging.setMirrorNeedsRevert(!droppableEvent);
- _this.receivingCalendar = receivingCalendar;
- _this.droppableEvent = droppableEvent;
- }
- };
- this.handleDragEnd = function (pev) {
- var _a = _this, receivingCalendar = _a.receivingCalendar, droppableEvent = _a.droppableEvent;
- _this.clearDrag();
- if (receivingCalendar && droppableEvent) {
- var finalHit = _this.hitDragging.finalHit;
- var finalView = finalHit.component.context.view;
- var dragMeta = _this.dragMeta;
- var arg = __assign({}, receivingCalendar.buildDatePointApi(finalHit.dateSpan), { draggedEl: pev.subjectEl, jsEvent: pev.origEvent, view: finalView });
- receivingCalendar.publiclyTrigger('drop', [arg]);
- if (dragMeta.create) {
- receivingCalendar.dispatch({
- type: 'MERGE_EVENTS',
- eventStore: core.eventTupleToStore(droppableEvent)
- });
- if (pev.isTouch) {
- receivingCalendar.dispatch({
- type: 'SELECT_EVENT',
- eventInstanceId: droppableEvent.instance.instanceId
- });
- }
- // signal that an external event landed
- receivingCalendar.publiclyTrigger('eventReceive', [
- {
- draggedEl: pev.subjectEl,
- event: new core.EventApi(receivingCalendar, droppableEvent.def, droppableEvent.instance),
- view: finalView
- }
- ]);
- }
- }
- _this.receivingCalendar = null;
- _this.droppableEvent = null;
- };
- var hitDragging = this.hitDragging = new HitDragging(dragging, core.interactionSettingsStore);
- hitDragging.requireInitial = false; // will start outside of a component
- hitDragging.emitter.on('dragstart', this.handleDragStart);
- hitDragging.emitter.on('hitupdate', this.handleHitUpdate);
- hitDragging.emitter.on('dragend', this.handleDragEnd);
- this.suppliedDragMeta = suppliedDragMeta;
- }
- ExternalElementDragging.prototype.buildDragMeta = function (subjectEl) {
- if (typeof this.suppliedDragMeta === 'object') {
- return core.parseDragMeta(this.suppliedDragMeta);
- }
- else if (typeof this.suppliedDragMeta === 'function') {
- return core.parseDragMeta(this.suppliedDragMeta(subjectEl));
- }
- else {
- return getDragMetaFromEl(subjectEl);
- }
- };
- ExternalElementDragging.prototype.displayDrag = function (nextCalendar, state) {
- var prevCalendar = this.receivingCalendar;
- if (prevCalendar && prevCalendar !== nextCalendar) {
- prevCalendar.dispatch({ type: 'UNSET_EVENT_DRAG' });
- }
- if (nextCalendar) {
- nextCalendar.dispatch({ type: 'SET_EVENT_DRAG', state: state });
- }
- };
- ExternalElementDragging.prototype.clearDrag = function () {
- if (this.receivingCalendar) {
- this.receivingCalendar.dispatch({ type: 'UNSET_EVENT_DRAG' });
- }
- };
- ExternalElementDragging.prototype.canDropElOnCalendar = function (el, receivingCalendar) {
- var dropAccept = receivingCalendar.opt('dropAccept');
- if (typeof dropAccept === 'function') {
- return dropAccept(el);
- }
- else if (typeof dropAccept === 'string' && dropAccept) {
- return Boolean(core.elementMatches(el, dropAccept));
- }
- return true;
- };
- return ExternalElementDragging;
- }());
- // Utils for computing event store from the DragMeta
- // ----------------------------------------------------------------------------------------------------
- function computeEventForDateSpan(dateSpan, dragMeta, calendar) {
- var defProps = __assign({}, dragMeta.leftoverProps);
- for (var _i = 0, _a = calendar.pluginSystem.hooks.externalDefTransforms; _i < _a.length; _i++) {
- var transform = _a[_i];
- __assign(defProps, transform(dateSpan, dragMeta));
- }
- var def = core.parseEventDef(defProps, dragMeta.sourceId, dateSpan.allDay, calendar.opt('forceEventDuration') || Boolean(dragMeta.duration), // hasEnd
- calendar);
- var start = dateSpan.range.start;
- // only rely on time info if drop zone is all-day,
- // otherwise, we already know the time
- if (dateSpan.allDay && dragMeta.startTime) {
- start = calendar.dateEnv.add(start, dragMeta.startTime);
- }
- var end = dragMeta.duration ?
- calendar.dateEnv.add(start, dragMeta.duration) :
- calendar.getDefaultEventEnd(dateSpan.allDay, start);
- var instance = core.createEventInstance(def.defId, { start: start, end: end });
- return { def: def, instance: instance };
- }
- // Utils for extracting data from element
- // ----------------------------------------------------------------------------------------------------
- function getDragMetaFromEl(el) {
- var str = getEmbeddedElData(el, 'event');
- var obj = str ?
- JSON.parse(str) :
- { create: false }; // if no embedded data, assume no event creation
- return core.parseDragMeta(obj);
- }
- core.config.dataAttrPrefix = '';
- function getEmbeddedElData(el, name) {
- var prefix = core.config.dataAttrPrefix;
- var prefixedName = (prefix ? prefix + '-' : '') + name;
- return el.getAttribute('data-' + prefixedName) || '';
- }
-
- /*
- Makes an element (that is *external* to any calendar) draggable.
- Can pass in data that determines how an event will be created when dropped onto a calendar.
- Leverages FullCalendar's internal drag-n-drop functionality WITHOUT a third-party drag system.
- */
- var ExternalDraggable = /** @class */ (function () {
- function ExternalDraggable(el, settings) {
- var _this = this;
- if (settings === void 0) { settings = {}; }
- this.handlePointerDown = function (ev) {
- var dragging = _this.dragging;
- var _a = _this.settings, minDistance = _a.minDistance, longPressDelay = _a.longPressDelay;
- dragging.minDistance =
- minDistance != null ?
- minDistance :
- (ev.isTouch ? 0 : core.globalDefaults.eventDragMinDistance);
- dragging.delay =
- ev.isTouch ? // TODO: eventually read eventLongPressDelay instead vvv
- (longPressDelay != null ? longPressDelay : core.globalDefaults.longPressDelay) :
- 0;
- };
- this.handleDragStart = function (ev) {
- if (ev.isTouch &&
- _this.dragging.delay &&
- ev.subjectEl.classList.contains('fc-event')) {
- _this.dragging.mirror.getMirrorEl().classList.add('fc-selected');
- }
- };
- this.settings = settings;
- var dragging = this.dragging = new FeaturefulElementDragging(el);
- dragging.touchScrollAllowed = false;
- if (settings.itemSelector != null) {
- dragging.pointer.selector = settings.itemSelector;
- }
- if (settings.appendTo != null) {
- dragging.mirror.parentNode = settings.appendTo; // TODO: write tests
- }
- dragging.emitter.on('pointerdown', this.handlePointerDown);
- dragging.emitter.on('dragstart', this.handleDragStart);
- new ExternalElementDragging(dragging, settings.eventData);
- }
- ExternalDraggable.prototype.destroy = function () {
- this.dragging.destroy();
- };
- return ExternalDraggable;
- }());
-
- /*
- Detects when a *THIRD-PARTY* drag-n-drop system interacts with elements.
- The third-party system is responsible for drawing the visuals effects of the drag.
- This class simply monitors for pointer movements and fires events.
- It also has the ability to hide the moving element (the "mirror") during the drag.
- */
- var InferredElementDragging = /** @class */ (function (_super) {
- __extends(InferredElementDragging, _super);
- function InferredElementDragging(containerEl) {
- var _this = _super.call(this, containerEl) || this;
- _this.shouldIgnoreMove = false;
- _this.mirrorSelector = '';
- _this.currentMirrorEl = null;
- _this.handlePointerDown = function (ev) {
- _this.emitter.trigger('pointerdown', ev);
- if (!_this.shouldIgnoreMove) {
- // fire dragstart right away. does not support delay or min-distance
- _this.emitter.trigger('dragstart', ev);
- }
- };
- _this.handlePointerMove = function (ev) {
- if (!_this.shouldIgnoreMove) {
- _this.emitter.trigger('dragmove', ev);
- }
- };
- _this.handlePointerUp = function (ev) {
- _this.emitter.trigger('pointerup', ev);
- if (!_this.shouldIgnoreMove) {
- // fire dragend right away. does not support a revert animation
- _this.emitter.trigger('dragend', ev);
- }
- };
- var pointer = _this.pointer = new PointerDragging(containerEl);
- pointer.emitter.on('pointerdown', _this.handlePointerDown);
- pointer.emitter.on('pointermove', _this.handlePointerMove);
- pointer.emitter.on('pointerup', _this.handlePointerUp);
- return _this;
- }
- InferredElementDragging.prototype.destroy = function () {
- this.pointer.destroy();
- };
- InferredElementDragging.prototype.setIgnoreMove = function (bool) {
- this.shouldIgnoreMove = bool;
- };
- InferredElementDragging.prototype.setMirrorIsVisible = function (bool) {
- if (bool) {
- // restore a previously hidden element.
- // use the reference in case the selector class has already been removed.
- if (this.currentMirrorEl) {
- this.currentMirrorEl.style.visibility = '';
- this.currentMirrorEl = null;
- }
- }
- else {
- var mirrorEl = this.mirrorSelector ?
- document.querySelector(this.mirrorSelector) :
- null;
- if (mirrorEl) {
- this.currentMirrorEl = mirrorEl;
- mirrorEl.style.visibility = 'hidden';
- }
- }
- };
- return InferredElementDragging;
- }(core.ElementDragging));
-
- /*
- Bridges third-party drag-n-drop systems with FullCalendar.
- Must be instantiated and destroyed by caller.
- */
- var ThirdPartyDraggable = /** @class */ (function () {
- function ThirdPartyDraggable(containerOrSettings, settings) {
- var containerEl = document;
- if (
- // wish we could just test instanceof EventTarget, but doesn't work in IE11
- containerOrSettings === document ||
- containerOrSettings instanceof Element) {
- containerEl = containerOrSettings;
- settings = settings || {};
- }
- else {
- settings = (containerOrSettings || {});
- }
- var dragging = this.dragging = new InferredElementDragging(containerEl);
- if (typeof settings.itemSelector === 'string') {
- dragging.pointer.selector = settings.itemSelector;
- }
- else if (containerEl === document) {
- dragging.pointer.selector = '[data-event]';
- }
- if (typeof settings.mirrorSelector === 'string') {
- dragging.mirrorSelector = settings.mirrorSelector;
- }
- new ExternalElementDragging(dragging, settings.eventData);
- }
- ThirdPartyDraggable.prototype.destroy = function () {
- this.dragging.destroy();
- };
- return ThirdPartyDraggable;
- }());
-
- var main = core.createPlugin({
- componentInteractions: [DateClicking, DateSelecting, EventDragging, EventDragging$1],
- calendarInteractions: [UnselectAuto],
- elementDraggingImpl: FeaturefulElementDragging
- });
-
- exports.Draggable = ExternalDraggable;
- exports.FeaturefulElementDragging = FeaturefulElementDragging;
- exports.PointerDragging = PointerDragging;
- exports.ThirdPartyDraggable = ThirdPartyDraggable;
- exports.default = main;
-
- Object.defineProperty(exports, '__esModule', { value: true });
-
-}));
diff --git a/library/fullcalendar/packages/interaction/main.min.js b/library/fullcalendar/packages/interaction/main.min.js
deleted file mode 100644
index 6f0cdcc63..000000000
--- a/library/fullcalendar/packages/interaction/main.min.js
+++ /dev/null
@@ -1,6 +0,0 @@
-/*!
-FullCalendar Interaction Plugin v4.4.2
-Docs & License: https://fullcalendar.io/
-(c) 2019 Adam Shaw
-*/
-!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports,require("@fullcalendar/core")):"function"==typeof define&&define.amd?define(["exports","@fullcalendar/core"],t):t((e=e||self).FullCalendarInteraction={},e.FullCalendar)}(this,(function(e,t){"use strict";var n=function(e,t){return(n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var n in t)t.hasOwnProperty(n)&&(e[n]=t[n])})(e,t)};function r(e,t){function r(){this.constructor=e}n(e,t),e.prototype=null===t?Object.create(t):(r.prototype=t.prototype,new r)}var i=function(){return(i=Object.assign||function(e){for(var t,n=1,r=arguments.length;n<r;n++)for(var i in t=arguments[n])Object.prototype.hasOwnProperty.call(t,i)&&(e[i]=t[i]);return e}).apply(this,arguments)};t.config.touchMouseIgnoreWait=500;var o=0,a=0,l=!1,s=function(){function e(e){var n=this;this.subjectEl=null,this.downEl=null,this.selector="",this.handleSelector="",this.shouldIgnoreMove=!1,this.shouldWatchScroll=!0,this.isDragging=!1,this.isTouchDragging=!1,this.wasTouchScroll=!1,this.handleMouseDown=function(e){if(!n.shouldIgnoreMouse()&&function(e){return 0===e.button&&!e.ctrlKey}(e)&&n.tryStart(e)){var t=n.createEventFromMouse(e,!0);n.emitter.trigger("pointerdown",t),n.initScrollWatch(t),n.shouldIgnoreMove||document.addEventListener("mousemove",n.handleMouseMove),document.addEventListener("mouseup",n.handleMouseUp)}},this.handleMouseMove=function(e){var t=n.createEventFromMouse(e);n.recordCoords(t),n.emitter.trigger("pointermove",t)},this.handleMouseUp=function(e){document.removeEventListener("mousemove",n.handleMouseMove),document.removeEventListener("mouseup",n.handleMouseUp),n.emitter.trigger("pointerup",n.createEventFromMouse(e)),n.cleanup()},this.handleTouchStart=function(e){if(n.tryStart(e)){n.isTouchDragging=!0;var t=n.createEventFromTouch(e,!0);n.emitter.trigger("pointerdown",t),n.initScrollWatch(t);var r=e.target;n.shouldIgnoreMove||r.addEventListener("touchmove",n.handleTouchMove),r.addEventListener("touchend",n.handleTouchEnd),r.addEventListener("touchcancel",n.handleTouchEnd),window.addEventListener("scroll",n.handleTouchScroll,!0)}},this.handleTouchMove=function(e){var t=n.createEventFromTouch(e);n.recordCoords(t),n.emitter.trigger("pointermove",t)},this.handleTouchEnd=function(e){if(n.isDragging){var r=e.target;r.removeEventListener("touchmove",n.handleTouchMove),r.removeEventListener("touchend",n.handleTouchEnd),r.removeEventListener("touchcancel",n.handleTouchEnd),window.removeEventListener("scroll",n.handleTouchScroll,!0),n.emitter.trigger("pointerup",n.createEventFromTouch(e)),n.cleanup(),n.isTouchDragging=!1,o++,setTimeout((function(){o--}),t.config.touchMouseIgnoreWait)}},this.handleTouchScroll=function(){n.wasTouchScroll=!0},this.handleScroll=function(e){if(!n.shouldIgnoreMove){var t=window.pageXOffset-n.prevScrollX+n.prevPageX,r=window.pageYOffset-n.prevScrollY+n.prevPageY;n.emitter.trigger("pointermove",{origEvent:e,isTouch:n.isTouchDragging,subjectEl:n.subjectEl,pageX:t,pageY:r,deltaX:t-n.origPageX,deltaY:r-n.origPageY})}},this.containerEl=e,this.emitter=new t.EmitterMixin,e.addEventListener("mousedown",this.handleMouseDown),e.addEventListener("touchstart",this.handleTouchStart,{passive:!0}),a++||window.addEventListener("touchmove",c,{passive:!1})}return e.prototype.destroy=function(){this.containerEl.removeEventListener("mousedown",this.handleMouseDown),this.containerEl.removeEventListener("touchstart",this.handleTouchStart,{passive:!0}),--a||window.removeEventListener("touchmove",c,{passive:!1})},e.prototype.tryStart=function(e){var n=this.querySubjectEl(e),r=e.target;return!(!n||this.handleSelector&&!t.elementClosest(r,this.handleSelector))&&(this.subjectEl=n,this.downEl=r,this.isDragging=!0,this.wasTouchScroll=!1,!0)},e.prototype.cleanup=function(){l=!1,this.isDragging=!1,this.subjectEl=null,this.downEl=null,this.destroyScrollWatch()},e.prototype.querySubjectEl=function(e){return this.selector?t.elementClosest(e.target,this.selector):this.containerEl},e.prototype.shouldIgnoreMouse=function(){return o||this.isTouchDragging},e.prototype.cancelTouchScroll=function(){this.isDragging&&(l=!0)},e.prototype.initScrollWatch=function(e){this.shouldWatchScroll&&(this.recordCoords(e),window.addEventListener("scroll",this.handleScroll,!0))},e.prototype.recordCoords=function(e){this.shouldWatchScroll&&(this.prevPageX=e.pageX,this.prevPageY=e.pageY,this.prevScrollX=window.pageXOffset,this.prevScrollY=window.pageYOffset)},e.prototype.destroyScrollWatch=function(){this.shouldWatchScroll&&window.removeEventListener("scroll",this.handleScroll,!0)},e.prototype.createEventFromMouse=function(e,t){var n=0,r=0;return t?(this.origPageX=e.pageX,this.origPageY=e.pageY):(n=e.pageX-this.origPageX,r=e.pageY-this.origPageY),{origEvent:e,isTouch:!1,subjectEl:this.subjectEl,pageX:e.pageX,pageY:e.pageY,deltaX:n,deltaY:r}},e.prototype.createEventFromTouch=function(e,t){var n,r,i=e.touches,o=0,a=0;return i&&i.length?(n=i[0].pageX,r=i[0].pageY):(n=e.pageX,r=e.pageY),t?(this.origPageX=n,this.origPageY=r):(o=n-this.origPageX,a=r-this.origPageY),{origEvent:e,isTouch:!0,subjectEl:this.subjectEl,pageX:n,pageY:r,deltaX:o,deltaY:a}},e}();function c(e){l&&e.preventDefault()}var d=function(){function e(){this.isVisible=!1,this.sourceEl=null,this.mirrorEl=null,this.sourceElRect=null,this.parentNode=document.body,this.zIndex=9999,this.revertDuration=0}return e.prototype.start=function(e,t,n){this.sourceEl=e,this.sourceElRect=this.sourceEl.getBoundingClientRect(),this.origScreenX=t-window.pageXOffset,this.origScreenY=n-window.pageYOffset,this.deltaX=0,this.deltaY=0,this.updateElPosition()},e.prototype.handleMove=function(e,t){this.deltaX=e-window.pageXOffset-this.origScreenX,this.deltaY=t-window.pageYOffset-this.origScreenY,this.updateElPosition()},e.prototype.setIsVisible=function(e){e?this.isVisible||(this.mirrorEl&&(this.mirrorEl.style.display=""),this.isVisible=e,this.updateElPosition()):this.isVisible&&(this.mirrorEl&&(this.mirrorEl.style.display="none"),this.isVisible=e)},e.prototype.stop=function(e,t){var n=this,r=function(){n.cleanup(),t()};e&&this.mirrorEl&&this.isVisible&&this.revertDuration&&(this.deltaX||this.deltaY)?this.doRevertAnimation(r,this.revertDuration):setTimeout(r,0)},e.prototype.doRevertAnimation=function(e,n){var r=this.mirrorEl,i=this.sourceEl.getBoundingClientRect();r.style.transition="top "+n+"ms,left "+n+"ms",t.applyStyle(r,{left:i.left,top:i.top}),t.whenTransitionDone(r,(function(){r.style.transition="",e()}))},e.prototype.cleanup=function(){this.mirrorEl&&(t.removeElement(this.mirrorEl),this.mirrorEl=null),this.sourceEl=null},e.prototype.updateElPosition=function(){this.sourceEl&&this.isVisible&&t.applyStyle(this.getMirrorEl(),{left:this.sourceElRect.left+this.deltaX,top:this.sourceElRect.top+this.deltaY})},e.prototype.getMirrorEl=function(){var e=this.sourceElRect,n=this.mirrorEl;return n||((n=this.mirrorEl=this.sourceEl.cloneNode(!0)).classList.add("fc-unselectable"),n.classList.add("fc-dragging"),t.applyStyle(n,{position:"fixed",zIndex:this.zIndex,visibility:"",boxSizing:"border-box",width:e.right-e.left,height:e.bottom-e.top,right:"auto",bottom:"auto",margin:0}),this.parentNode.appendChild(n)),n},e}(),g=function(e){function t(t,n){var r=e.call(this)||this;return r.handleScroll=function(){r.scrollTop=r.scrollController.getScrollTop(),r.scrollLeft=r.scrollController.getScrollLeft(),r.handleScrollChange()},r.scrollController=t,r.doesListening=n,r.scrollTop=r.origScrollTop=t.getScrollTop(),r.scrollLeft=r.origScrollLeft=t.getScrollLeft(),r.scrollWidth=t.getScrollWidth(),r.scrollHeight=t.getScrollHeight(),r.clientWidth=t.getClientWidth(),r.clientHeight=t.getClientHeight(),r.clientRect=r.computeClientRect(),r.doesListening&&r.getEventTarget().addEventListener("scroll",r.handleScroll),r}return r(t,e),t.prototype.destroy=function(){this.doesListening&&this.getEventTarget().removeEventListener("scroll",this.handleScroll)},t.prototype.getScrollTop=function(){return this.scrollTop},t.prototype.getScrollLeft=function(){return this.scrollLeft},t.prototype.setScrollTop=function(e){this.scrollController.setScrollTop(e),this.doesListening||(this.scrollTop=Math.max(Math.min(e,this.getMaxScrollTop()),0),this.handleScrollChange())},t.prototype.setScrollLeft=function(e){this.scrollController.setScrollLeft(e),this.doesListening||(this.scrollLeft=Math.max(Math.min(e,this.getMaxScrollLeft()),0),this.handleScrollChange())},t.prototype.getClientWidth=function(){return this.clientWidth},t.prototype.getClientHeight=function(){return this.clientHeight},t.prototype.getScrollWidth=function(){return this.scrollWidth},t.prototype.getScrollHeight=function(){return this.scrollHeight},t.prototype.handleScrollChange=function(){},t}(t.ScrollController),u=function(e){function n(n,r){return e.call(this,new t.ElementScrollController(n),r)||this}return r(n,e),n.prototype.getEventTarget=function(){return this.scrollController.el},n.prototype.computeClientRect=function(){return t.computeInnerRect(this.scrollController.el)},n}(g),h=function(e){function n(n){return e.call(this,new t.WindowScrollController,n)||this}return r(n,e),n.prototype.getEventTarget=function(){return window},n.prototype.computeClientRect=function(){return{left:this.scrollLeft,right:this.scrollLeft+this.clientWidth,top:this.scrollTop,bottom:this.scrollTop+this.clientHeight}},n.prototype.handleScrollChange=function(){this.clientRect=this.computeClientRect()},n}(g),p="function"==typeof performance?performance.now:Date.now,v=function(){function e(){var e=this;this.isEnabled=!0,this.scrollQuery=[window,".fc-scroller"],this.edgeThreshold=50,this.maxVelocity=300,this.pointerScreenX=null,this.pointerScreenY=null,this.isAnimating=!1,this.scrollCaches=null,this.everMovedUp=!1,this.everMovedDown=!1,this.everMovedLeft=!1,this.everMovedRight=!1,this.animate=function(){if(e.isAnimating){var t=e.computeBestEdge(e.pointerScreenX+window.pageXOffset,e.pointerScreenY+window.pageYOffset);if(t){var n=p();e.handleSide(t,(n-e.msSinceRequest)/1e3),e.requestAnimation(n)}else e.isAnimating=!1}}}return e.prototype.start=function(e,t){this.isEnabled&&(this.scrollCaches=this.buildCaches(),this.pointerScreenX=null,this.pointerScreenY=null,this.everMovedUp=!1,this.everMovedDown=!1,this.everMovedLeft=!1,this.everMovedRight=!1,this.handleMove(e,t))},e.prototype.handleMove=function(e,t){if(this.isEnabled){var n=e-window.pageXOffset,r=t-window.pageYOffset,i=null===this.pointerScreenY?0:r-this.pointerScreenY,o=null===this.pointerScreenX?0:n-this.pointerScreenX;i<0?this.everMovedUp=!0:i>0&&(this.everMovedDown=!0),o<0?this.everMovedLeft=!0:o>0&&(this.everMovedRight=!0),this.pointerScreenX=n,this.pointerScreenY=r,this.isAnimating||(this.isAnimating=!0,this.requestAnimation(p()))}},e.prototype.stop=function(){if(this.isEnabled){this.isAnimating=!1;for(var e=0,t=this.scrollCaches;e<t.length;e++){t[e].destroy()}this.scrollCaches=null}},e.prototype.requestAnimation=function(e){this.msSinceRequest=e,requestAnimationFrame(this.animate)},e.prototype.handleSide=function(e,t){var n=e.scrollCache,r=this.edgeThreshold,i=r-e.distance,o=i*i/(r*r)*this.maxVelocity*t,a=1;switch(e.name){case"left":a=-1;case"right":n.setScrollLeft(n.getScrollLeft()+o*a);break;case"top":a=-1;case"bottom":n.setScrollTop(n.getScrollTop()+o*a)}},e.prototype.computeBestEdge=function(e,t){for(var n=this.edgeThreshold,r=null,i=0,o=this.scrollCaches;i<o.length;i++){var a=o[i],l=a.clientRect,s=e-l.left,c=l.right-e,d=t-l.top,g=l.bottom-t;s>=0&&c>=0&&d>=0&&g>=0&&(d<=n&&this.everMovedUp&&a.canScrollUp()&&(!r||r.distance>d)&&(r={scrollCache:a,name:"top",distance:d}),g<=n&&this.everMovedDown&&a.canScrollDown()&&(!r||r.distance>g)&&(r={scrollCache:a,name:"bottom",distance:g}),s<=n&&this.everMovedLeft&&a.canScrollLeft()&&(!r||r.distance>s)&&(r={scrollCache:a,name:"left",distance:s}),c<=n&&this.everMovedRight&&a.canScrollRight()&&(!r||r.distance>c)&&(r={scrollCache:a,name:"right",distance:c}))}return r},e.prototype.buildCaches=function(){return this.queryScrollEls().map((function(e){return e===window?new h(!1):new u(e,!1)}))},e.prototype.queryScrollEls=function(){for(var e=[],t=0,n=this.scrollQuery;t<n.length;t++){var r=n[t];"object"==typeof r?e.push(r):e.push.apply(e,Array.prototype.slice.call(document.querySelectorAll(r)))}return e},e}(),f=function(e){function n(n){var r=e.call(this,n)||this;r.delay=null,r.minDistance=0,r.touchScrollAllowed=!0,r.mirrorNeedsRevert=!1,r.isInteracting=!1,r.isDragging=!1,r.isDelayEnded=!1,r.isDistanceSurpassed=!1,r.delayTimeoutId=null,r.onPointerDown=function(e){r.isDragging||(r.isInteracting=!0,r.isDelayEnded=!1,r.isDistanceSurpassed=!1,t.preventSelection(document.body),t.preventContextMenu(document.body),e.isTouch||e.origEvent.preventDefault(),r.emitter.trigger("pointerdown",e),r.pointer.shouldIgnoreMove||(r.mirror.setIsVisible(!1),r.mirror.start(e.subjectEl,e.pageX,e.pageY),r.startDelay(e),r.minDistance||r.handleDistanceSurpassed(e)))},r.onPointerMove=function(e){if(r.isInteracting){if(r.emitter.trigger("pointermove",e),!r.isDistanceSurpassed){var t=r.minDistance,n=e.deltaX,i=e.deltaY;n*n+i*i>=t*t&&r.handleDistanceSurpassed(e)}r.isDragging&&("scroll"!==e.origEvent.type&&(r.mirror.handleMove(e.pageX,e.pageY),r.autoScroller.handleMove(e.pageX,e.pageY)),r.emitter.trigger("dragmove",e))}},r.onPointerUp=function(e){r.isInteracting&&(r.isInteracting=!1,t.allowSelection(document.body),t.allowContextMenu(document.body),r.emitter.trigger("pointerup",e),r.isDragging&&(r.autoScroller.stop(),r.tryStopDrag(e)),r.delayTimeoutId&&(clearTimeout(r.delayTimeoutId),r.delayTimeoutId=null))};var i=r.pointer=new s(n);return i.emitter.on("pointerdown",r.onPointerDown),i.emitter.on("pointermove",r.onPointerMove),i.emitter.on("pointerup",r.onPointerUp),r.mirror=new d,r.autoScroller=new v,r}return r(n,e),n.prototype.destroy=function(){this.pointer.destroy()},n.prototype.startDelay=function(e){var t=this;"number"==typeof this.delay?this.delayTimeoutId=setTimeout((function(){t.delayTimeoutId=null,t.handleDelayEnd(e)}),this.delay):this.handleDelayEnd(e)},n.prototype.handleDelayEnd=function(e){this.isDelayEnded=!0,this.tryStartDrag(e)},n.prototype.handleDistanceSurpassed=function(e){this.isDistanceSurpassed=!0,this.tryStartDrag(e)},n.prototype.tryStartDrag=function(e){this.isDelayEnded&&this.isDistanceSurpassed&&(this.pointer.wasTouchScroll&&!this.touchScrollAllowed||(this.isDragging=!0,this.mirrorNeedsRevert=!1,this.autoScroller.start(e.pageX,e.pageY),this.emitter.trigger("dragstart",e),!1===this.touchScrollAllowed&&this.pointer.cancelTouchScroll()))},n.prototype.tryStopDrag=function(e){this.mirror.stop(this.mirrorNeedsRevert,this.stopDrag.bind(this,e))},n.prototype.stopDrag=function(e){this.isDragging=!1,this.emitter.trigger("dragend",e)},n.prototype.setIgnoreMove=function(e){this.pointer.shouldIgnoreMove=e},n.prototype.setMirrorIsVisible=function(e){this.mirror.setIsVisible(e)},n.prototype.setMirrorNeedsRevert=function(e){this.mirrorNeedsRevert=e},n.prototype.setAutoScrollEnabled=function(e){this.autoScroller.isEnabled=e},n}(t.ElementDragging),E=function(){function e(e){this.origRect=t.computeRect(e),this.scrollCaches=t.getClippingParents(e).map((function(e){return new u(e,!0)}))}return e.prototype.destroy=function(){for(var e=0,t=this.scrollCaches;e<t.length;e++){t[e].destroy()}},e.prototype.computeLeft=function(){for(var e=this.origRect.left,t=0,n=this.scrollCaches;t<n.length;t++){var r=n[t];e+=r.origScrollLeft-r.getScrollLeft()}return e},e.prototype.computeTop=function(){for(var e=this.origRect.top,t=0,n=this.scrollCaches;t<n.length;t++){var r=n[t];e+=r.origScrollTop-r.getScrollTop()}return e},e.prototype.isWithinClipping=function(e,n){for(var r,i,o={left:e,top:n},a=0,l=this.scrollCaches;a<l.length;a++){var s=l[a];if(r=s.getEventTarget(),i=void 0,"HTML"!==(i=r.tagName)&&"BODY"!==i&&!t.pointInsideRect(o,s.clientRect))return!1}return!0},e}();var m=function(){function e(e,n){var r=this;this.useSubjectCenter=!1,this.requireInitial=!0,this.initialHit=null,this.movingHit=null,this.finalHit=null,this.handlePointerDown=function(e){var t=r.dragging;r.initialHit=null,r.movingHit=null,r.finalHit=null,r.prepareHits(),r.processFirstCoord(e),r.initialHit||!r.requireInitial?(t.setIgnoreMove(!1),r.emitter.trigger("pointerdown",e)):t.setIgnoreMove(!0)},this.handleDragStart=function(e){r.emitter.trigger("dragstart",e),r.handleMove(e,!0)},this.handleDragMove=function(e){r.emitter.trigger("dragmove",e),r.handleMove(e)},this.handlePointerUp=function(e){r.releaseHits(),r.emitter.trigger("pointerup",e)},this.handleDragEnd=function(e){r.movingHit&&r.emitter.trigger("hitupdate",null,!0,e),r.finalHit=r.movingHit,r.movingHit=null,r.emitter.trigger("dragend",e)},this.droppableStore=n,e.emitter.on("pointerdown",this.handlePointerDown),e.emitter.on("dragstart",this.handleDragStart),e.emitter.on("dragmove",this.handleDragMove),e.emitter.on("pointerup",this.handlePointerUp),e.emitter.on("dragend",this.handleDragEnd),this.dragging=e,this.emitter=new t.EmitterMixin}return e.prototype.processFirstCoord=function(e){var n,r={left:e.pageX,top:e.pageY},i=r,o=e.subjectEl;o!==document&&(n=t.computeRect(o),i=t.constrainPoint(i,n));var a=this.initialHit=this.queryHitForOffset(i.left,i.top);if(a){if(this.useSubjectCenter&&n){var l=t.intersectRects(n,a.rect);l&&(i=t.getRectCenter(l))}this.coordAdjust=t.diffPoints(i,r)}else this.coordAdjust={left:0,top:0}},e.prototype.handleMove=function(e,t){var n=this.queryHitForOffset(e.pageX+this.coordAdjust.left,e.pageY+this.coordAdjust.top);!t&&S(this.movingHit,n)||(this.movingHit=n,this.emitter.trigger("hitupdate",n,!1,e))},e.prototype.prepareHits=function(){this.offsetTrackers=t.mapHash(this.droppableStore,(function(e){return e.component.buildPositionCaches(),new E(e.el)}))},e.prototype.releaseHits=function(){var e=this.offsetTrackers;for(var t in e)e[t].destroy();this.offsetTrackers={}},e.prototype.queryHitForOffset=function(e,n){var r=this.droppableStore,i=this.offsetTrackers,o=null;for(var a in r){var l=r[a].component,s=i[a];if(s.isWithinClipping(e,n)){var c=s.computeLeft(),d=s.computeTop(),g=e-c,u=n-d,h=s.origRect,p=h.right-h.left,v=h.bottom-h.top;if(g>=0&&g<p&&u>=0&&u<v){var f=l.queryHit(g,u,p,v);!f||l.props.dateProfile&&!t.rangeContainsRange(l.props.dateProfile.activeRange,f.dateSpan.range)||o&&!(f.layer>o.layer)||(f.rect.left+=c,f.rect.right+=c,f.rect.top+=d,f.rect.bottom+=d,o=f)}}}return o},e}();function S(e,n){return!e&&!n||Boolean(e)===Boolean(n)&&t.isDateSpansEqual(e.dateSpan,n.dateSpan)}var y=function(e){function n(n){var r=e.call(this,n)||this;r.handlePointerDown=function(e){var t=r.dragging;t.setIgnoreMove(!r.component.isValidDateDownEl(t.pointer.downEl))},r.handleDragEnd=function(e){var t=r.component.context,n=t.calendar,i=t.view;if(!r.dragging.pointer.wasTouchScroll){var o=r.hitDragging,a=o.initialHit,l=o.finalHit;a&&l&&S(a,l)&&n.triggerDateClick(a.dateSpan,a.dayEl,i,e.origEvent)}};var i=n.component;r.dragging=new f(i.el),r.dragging.autoScroller.isEnabled=!1;var o=r.hitDragging=new m(r.dragging,t.interactionSettingsToStore(n));return o.emitter.on("pointerdown",r.handlePointerDown),o.emitter.on("dragend",r.handleDragEnd),r}return r(n,e),n.prototype.destroy=function(){this.dragging.destroy()},n}(t.Interaction),D=function(e){function n(n){var r=e.call(this,n)||this;r.dragSelection=null,r.handlePointerDown=function(e){var t=r,n=t.component,i=t.dragging,o=n.context.options.selectable&&n.isValidDateDownEl(e.origEvent.target);i.setIgnoreMove(!o),i.delay=e.isTouch?function(e){var t=e.context.options,n=t.selectLongPressDelay;null==n&&(n=t.longPressDelay);return n}(n):null},r.handleDragStart=function(e){r.component.context.calendar.unselect(e)},r.handleHitUpdate=function(e,n){var o=r.component.context.calendar,a=null,l=!1;e&&((a=function(e,n,r){var o=e.dateSpan,a=n.dateSpan,l=[o.range.start,o.range.end,a.range.start,a.range.end];l.sort(t.compareNumbers);for(var s={},c=0,d=r;c<d.length;c++){var g=(0,d[c])(e,n);if(!1===g)return null;g&&i(s,g)}return s.range={start:l[0],end:l[3]},s.allDay=o.allDay,s}(r.hitDragging.initialHit,e,o.pluginSystem.hooks.dateSelectionTransformers))&&r.component.isDateSelectionValid(a)||(l=!0,a=null)),a?o.dispatch({type:"SELECT_DATES",selection:a}):n||o.dispatch({type:"UNSELECT_DATES"}),l?t.disableCursor():t.enableCursor(),n||(r.dragSelection=a)},r.handlePointerUp=function(e){r.dragSelection&&(r.component.context.calendar.triggerDateSelect(r.dragSelection,e),r.dragSelection=null)};var o=n.component,a=o.context.options,l=r.dragging=new f(o.el);l.touchScrollAllowed=!1,l.minDistance=a.selectMinDistance||0,l.autoScroller.isEnabled=a.dragScroll;var s=r.hitDragging=new m(r.dragging,t.interactionSettingsToStore(n));return s.emitter.on("pointerdown",r.handlePointerDown),s.emitter.on("dragstart",r.handleDragStart),s.emitter.on("hitupdate",r.handleHitUpdate),s.emitter.on("pointerup",r.handlePointerUp),r}return r(n,e),n.prototype.destroy=function(){this.dragging.destroy()},n}(t.Interaction);var w=function(e){function n(r){var o=e.call(this,r)||this;o.subjectSeg=null,o.isDragging=!1,o.eventRange=null,o.relevantEvents=null,o.receivingCalendar=null,o.validMutation=null,o.mutatedRelevantEvents=null,o.handlePointerDown=function(e){var n=e.origEvent.target,r=o,i=r.component,a=r.dragging,l=a.mirror,s=i.context.options,c=i.context.calendar,d=o.subjectSeg=t.getElSeg(e.subjectEl),g=(o.eventRange=d.eventRange).instance.instanceId;o.relevantEvents=t.getRelevantEvents(c.state.eventStore,g),a.minDistance=e.isTouch?0:s.eventDragMinDistance,a.delay=e.isTouch&&g!==i.props.eventSelection?function(e){var t=e.context.options,n=t.eventLongPressDelay;null==n&&(n=t.longPressDelay);return n}(i):null,l.parentNode=c.el,l.revertDuration=s.dragRevertDuration;var u=i.isValidSegDownEl(n)&&!t.elementClosest(n,".fc-resizer");a.setIgnoreMove(!u),o.isDragging=u&&e.subjectEl.classList.contains("fc-draggable")},o.handleDragStart=function(e){var n=o.component.context,r=n.calendar,i=o.eventRange,a=i.instance.instanceId;e.isTouch?a!==o.component.props.eventSelection&&r.dispatch({type:"SELECT_EVENT",eventInstanceId:a}):r.dispatch({type:"UNSELECT_EVENT"}),o.isDragging&&(r.unselect(e),r.publiclyTrigger("eventDragStart",[{el:o.subjectSeg.el,event:new t.EventApi(r,i.def,i.instance),jsEvent:e.origEvent,view:n.view}]))},o.handleHitUpdate=function(e,n){if(o.isDragging){var r=o.relevantEvents,i=o.hitDragging.initialHit,a=o.component.context.calendar,l=null,s=null,c=null,d=!1,g={affectedEvents:r,mutatedEvents:t.createEmptyEventStore(),isEvent:!0,origSeg:o.subjectSeg};if(e){var u=e.component;l=u.context.calendar;var h=u.context.options;a===l||h.editable&&h.droppable?(s=function(e,n,r){var i=e.dateSpan,o=n.dateSpan,a=i.range.start,l=o.range.start,s={};i.allDay!==o.allDay&&(s.allDay=o.allDay,s.hasEnd=n.component.context.options.allDayMaintainDuration,o.allDay&&(a=t.startOfDay(a)));var c=t.diffDates(a,l,e.component.context.dateEnv,e.component===n.component?e.component.largeUnit:null);c.milliseconds&&(s.allDay=!1);for(var d={datesDelta:c,standardProps:s},g=0,u=r;g<u.length;g++){(0,u[g])(d,e,n)}return d}(i,e,l.pluginSystem.hooks.eventDragMutationMassagers))&&(c=t.applyMutationToEventStore(r,l.eventUiBases,s,l),g.mutatedEvents=c,u.isInteractionValid(g)||(d=!0,s=null,c=null,g.mutatedEvents=t.createEmptyEventStore())):l=null}o.displayDrag(l,g),d?t.disableCursor():t.enableCursor(),n||(a===l&&S(i,e)&&(s=null),o.dragging.setMirrorNeedsRevert(!s),o.dragging.setMirrorIsVisible(!e||!document.querySelector(".fc-mirror")),o.receivingCalendar=l,o.validMutation=s,o.mutatedRelevantEvents=c)}},o.handlePointerUp=function(){o.isDragging||o.cleanup()},o.handleDragEnd=function(e){if(o.isDragging){var n=o.component.context,r=n.calendar,a=n.view,l=o,s=l.receivingCalendar,c=l.validMutation,d=o.eventRange.def,g=o.eventRange.instance,u=new t.EventApi(r,d,g),h=o.relevantEvents,p=o.mutatedRelevantEvents,v=o.hitDragging.finalHit;if(o.clearDrag(),r.publiclyTrigger("eventDragStop",[{el:o.subjectSeg.el,event:u,jsEvent:e.origEvent,view:a}]),c){if(s===r){r.dispatch({type:"MERGE_EVENTS",eventStore:p});for(var f={},E=0,m=r.pluginSystem.hooks.eventDropTransformers;E<m.length;E++){var S=m[E];i(f,S(c,r))}var y=i({},f,{el:e.subjectEl,delta:c.datesDelta,oldEvent:u,event:new t.EventApi(r,p.defs[d.defId],g?p.instances[g.instanceId]:null),revert:function(){r.dispatch({type:"MERGE_EVENTS",eventStore:h})},jsEvent:e.origEvent,view:a});r.publiclyTrigger("eventDrop",[y])}else if(s){r.publiclyTrigger("eventLeave",[{draggedEl:e.subjectEl,event:u,view:a}]),r.dispatch({type:"REMOVE_EVENT_INSTANCES",instances:o.mutatedRelevantEvents.instances}),s.dispatch({type:"MERGE_EVENTS",eventStore:o.mutatedRelevantEvents}),e.isTouch&&s.dispatch({type:"SELECT_EVENT",eventInstanceId:g.instanceId});var D=i({},s.buildDatePointApi(v.dateSpan),{draggedEl:e.subjectEl,jsEvent:e.origEvent,view:v.component});s.publiclyTrigger("drop",[D]),s.publiclyTrigger("eventReceive",[{draggedEl:e.subjectEl,event:new t.EventApi(s,p.defs[d.defId],p.instances[g.instanceId]),view:v.component}])}}else r.publiclyTrigger("_noEventDrop")}o.cleanup()};var a=o.component,l=a.context.options,s=o.dragging=new f(a.el);s.pointer.selector=n.SELECTOR,s.touchScrollAllowed=!1,s.autoScroller.isEnabled=l.dragScroll;var c=o.hitDragging=new m(o.dragging,t.interactionSettingsStore);return c.useSubjectCenter=r.useEventCenter,c.emitter.on("pointerdown",o.handlePointerDown),c.emitter.on("dragstart",o.handleDragStart),c.emitter.on("hitupdate",o.handleHitUpdate),c.emitter.on("pointerup",o.handlePointerUp),c.emitter.on("dragend",o.handleDragEnd),o}return r(n,e),n.prototype.destroy=function(){this.dragging.destroy()},n.prototype.displayDrag=function(e,n){var r=this.component.context.calendar,i=this.receivingCalendar;i&&i!==e&&(i===r?i.dispatch({type:"SET_EVENT_DRAG",state:{affectedEvents:n.affectedEvents,mutatedEvents:t.createEmptyEventStore(),isEvent:!0,origSeg:n.origSeg}}):i.dispatch({type:"UNSET_EVENT_DRAG"})),e&&e.dispatch({type:"SET_EVENT_DRAG",state:n})},n.prototype.clearDrag=function(){var e=this.component.context.calendar,t=this.receivingCalendar;t&&t.dispatch({type:"UNSET_EVENT_DRAG"}),e!==t&&e.dispatch({type:"UNSET_EVENT_DRAG"})},n.prototype.cleanup=function(){this.subjectSeg=null,this.isDragging=!1,this.eventRange=null,this.relevantEvents=null,this.receivingCalendar=null,this.validMutation=null,this.mutatedRelevantEvents=null},n.SELECTOR=".fc-draggable, .fc-resizable",n}(t.Interaction);var T=function(e){function n(n){var r=e.call(this,n)||this;r.draggingSeg=null,r.eventRange=null,r.relevantEvents=null,r.validMutation=null,r.mutatedRelevantEvents=null,r.handlePointerDown=function(e){var t=r.component,n=r.querySeg(e),i=r.eventRange=n.eventRange;r.dragging.minDistance=t.context.options.eventDragMinDistance,r.dragging.setIgnoreMove(!r.component.isValidSegDownEl(e.origEvent.target)||e.isTouch&&r.component.props.eventSelection!==i.instance.instanceId)},r.handleDragStart=function(e){var n=r.component.context,i=n.calendar,o=n.view,a=r.eventRange;r.relevantEvents=t.getRelevantEvents(i.state.eventStore,r.eventRange.instance.instanceId),r.draggingSeg=r.querySeg(e),i.unselect(),i.publiclyTrigger("eventResizeStart",[{el:r.draggingSeg.el,event:new t.EventApi(i,a.def,a.instance),jsEvent:e.origEvent,view:o}])},r.handleHitUpdate=function(e,n,o){var a=r.component.context.calendar,l=r.relevantEvents,s=r.hitDragging.initialHit,c=r.eventRange.instance,d=null,g=null,u=!1,h={affectedEvents:l,mutatedEvents:t.createEmptyEventStore(),isEvent:!0,origSeg:r.draggingSeg};e&&(d=function(e,n,r,o,a){for(var l=e.component.context.dateEnv,s=e.dateSpan.range.start,c=n.dateSpan.range.start,d=t.diffDates(s,c,l,e.component.largeUnit),g={},u=0,h=a;u<h.length;u++){var p=(0,h[u])(e,n);if(!1===p)return null;p&&i(g,p)}if(r){if(l.add(o.start,d)<o.end)return g.startDelta=d,g}else if(l.add(o.end,d)>o.start)return g.endDelta=d,g;return null}(s,e,o.subjectEl.classList.contains("fc-start-resizer"),c.range,a.pluginSystem.hooks.eventResizeJoinTransforms)),d&&(g=t.applyMutationToEventStore(l,a.eventUiBases,d,a),h.mutatedEvents=g,r.component.isInteractionValid(h)||(u=!0,d=null,g=null,h.mutatedEvents=null)),g?a.dispatch({type:"SET_EVENT_RESIZE",state:h}):a.dispatch({type:"UNSET_EVENT_RESIZE"}),u?t.disableCursor():t.enableCursor(),n||(d&&S(s,e)&&(d=null),r.validMutation=d,r.mutatedRelevantEvents=g)},r.handleDragEnd=function(e){var n=r.component.context,i=n.calendar,o=n.view,a=r.eventRange.def,l=r.eventRange.instance,s=new t.EventApi(i,a,l),c=r.relevantEvents,d=r.mutatedRelevantEvents;i.publiclyTrigger("eventResizeStop",[{el:r.draggingSeg.el,event:s,jsEvent:e.origEvent,view:o}]),r.validMutation?(i.dispatch({type:"MERGE_EVENTS",eventStore:d}),i.publiclyTrigger("eventResize",[{el:r.draggingSeg.el,startDelta:r.validMutation.startDelta||t.createDuration(0),endDelta:r.validMutation.endDelta||t.createDuration(0),prevEvent:s,event:new t.EventApi(i,d.defs[a.defId],l?d.instances[l.instanceId]:null),revert:function(){i.dispatch({type:"MERGE_EVENTS",eventStore:c})},jsEvent:e.origEvent,view:o}])):i.publiclyTrigger("_noEventResize"),r.draggingSeg=null,r.relevantEvents=null,r.validMutation=null};var o=n.component,a=r.dragging=new f(o.el);a.pointer.selector=".fc-resizer",a.touchScrollAllowed=!1,a.autoScroller.isEnabled=o.context.options.dragScroll;var l=r.hitDragging=new m(r.dragging,t.interactionSettingsToStore(n));return l.emitter.on("pointerdown",r.handlePointerDown),l.emitter.on("dragstart",r.handleDragStart),l.emitter.on("hitupdate",r.handleHitUpdate),l.emitter.on("dragend",r.handleDragEnd),r}return r(n,e),n.prototype.destroy=function(){this.dragging.destroy()},n.prototype.querySeg=function(e){return t.getElSeg(t.elementClosest(e.subjectEl,this.component.fgSegSelector))},n}(t.Interaction);var M=function(){function e(e){var n=this;this.isRecentPointerDateSelect=!1,this.onSelect=function(e){e.jsEvent&&(n.isRecentPointerDateSelect=!0)},this.onDocumentPointerUp=function(e){var r=n,i=r.calendar,o=r.documentPointer,a=i.state;if(!o.wasTouchScroll){if(a.dateSelection&&!n.isRecentPointerDateSelect){var l=i.viewOpt("unselectAuto"),s=i.viewOpt("unselectCancel");!l||l&&t.elementClosest(o.downEl,s)||i.unselect(e)}a.eventSelection&&!t.elementClosest(o.downEl,w.SELECTOR)&&i.dispatch({type:"UNSELECT_EVENT"})}n.isRecentPointerDateSelect=!1},this.calendar=e;var r=this.documentPointer=new s(document);r.shouldIgnoreMove=!0,r.shouldWatchScroll=!1,r.emitter.on("pointerup",this.onDocumentPointerUp),e.on("select",this.onSelect)}return e.prototype.destroy=function(){this.calendar.off("select",this.onSelect),this.documentPointer.destroy()},e}(),b=function(){function e(e,n){var r=this;this.receivingCalendar=null,this.droppableEvent=null,this.suppliedDragMeta=null,this.dragMeta=null,this.handleDragStart=function(e){r.dragMeta=r.buildDragMeta(e.subjectEl)},this.handleHitUpdate=function(e,n,o){var a=r.hitDragging.dragging,l=null,s=null,c=!1,d={affectedEvents:t.createEmptyEventStore(),mutatedEvents:t.createEmptyEventStore(),isEvent:r.dragMeta.create,origSeg:null};e&&(l=e.component.context.calendar,r.canDropElOnCalendar(o.subjectEl,l)&&(s=function(e,n,r){for(var o=i({},n.leftoverProps),a=0,l=r.pluginSystem.hooks.externalDefTransforms;a<l.length;a++){var s=l[a];i(o,s(e,n))}var c=t.parseEventDef(o,n.sourceId,e.allDay,r.opt("forceEventDuration")||Boolean(n.duration),r),d=e.range.start;e.allDay&&n.startTime&&(d=r.dateEnv.add(d,n.startTime));var g=n.duration?r.dateEnv.add(d,n.duration):r.getDefaultEventEnd(e.allDay,d),u=t.createEventInstance(c.defId,{start:d,end:g});return{def:c,instance:u}}(e.dateSpan,r.dragMeta,l),d.mutatedEvents=t.eventTupleToStore(s),(c=!t.isInteractionValid(d,l))&&(d.mutatedEvents=t.createEmptyEventStore(),s=null))),r.displayDrag(l,d),a.setMirrorIsVisible(n||!s||!document.querySelector(".fc-mirror")),c?t.disableCursor():t.enableCursor(),n||(a.setMirrorNeedsRevert(!s),r.receivingCalendar=l,r.droppableEvent=s)},this.handleDragEnd=function(e){var n=r,o=n.receivingCalendar,a=n.droppableEvent;if(r.clearDrag(),o&&a){var l=r.hitDragging.finalHit,s=l.component.context.view,c=r.dragMeta,d=i({},o.buildDatePointApi(l.dateSpan),{draggedEl:e.subjectEl,jsEvent:e.origEvent,view:s});o.publiclyTrigger("drop",[d]),c.create&&(o.dispatch({type:"MERGE_EVENTS",eventStore:t.eventTupleToStore(a)}),e.isTouch&&o.dispatch({type:"SELECT_EVENT",eventInstanceId:a.instance.instanceId}),o.publiclyTrigger("eventReceive",[{draggedEl:e.subjectEl,event:new t.EventApi(o,a.def,a.instance),view:s}]))}r.receivingCalendar=null,r.droppableEvent=null};var o=this.hitDragging=new m(e,t.interactionSettingsStore);o.requireInitial=!1,o.emitter.on("dragstart",this.handleDragStart),o.emitter.on("hitupdate",this.handleHitUpdate),o.emitter.on("dragend",this.handleDragEnd),this.suppliedDragMeta=n}return e.prototype.buildDragMeta=function(e){return"object"==typeof this.suppliedDragMeta?t.parseDragMeta(this.suppliedDragMeta):"function"==typeof this.suppliedDragMeta?t.parseDragMeta(this.suppliedDragMeta(e)):(n=function(e,n){var r=t.config.dataAttrPrefix,i=(r?r+"-":"")+n;return e.getAttribute("data-"+i)||""}(e,"event"),r=n?JSON.parse(n):{create:!1},t.parseDragMeta(r));var n,r},e.prototype.displayDrag=function(e,t){var n=this.receivingCalendar;n&&n!==e&&n.dispatch({type:"UNSET_EVENT_DRAG"}),e&&e.dispatch({type:"SET_EVENT_DRAG",state:t})},e.prototype.clearDrag=function(){this.receivingCalendar&&this.receivingCalendar.dispatch({type:"UNSET_EVENT_DRAG"})},e.prototype.canDropElOnCalendar=function(e,n){var r=n.opt("dropAccept");return"function"==typeof r?r(e):"string"!=typeof r||!r||Boolean(t.elementMatches(e,r))},e}();t.config.dataAttrPrefix="";var C=function(){function e(e,n){var r=this;void 0===n&&(n={}),this.handlePointerDown=function(e){var n=r.dragging,i=r.settings,o=i.minDistance,a=i.longPressDelay;n.minDistance=null!=o?o:e.isTouch?0:t.globalDefaults.eventDragMinDistance,n.delay=e.isTouch?null!=a?a:t.globalDefaults.longPressDelay:0},this.handleDragStart=function(e){e.isTouch&&r.dragging.delay&&e.subjectEl.classList.contains("fc-event")&&r.dragging.mirror.getMirrorEl().classList.add("fc-selected")},this.settings=n;var i=this.dragging=new f(e);i.touchScrollAllowed=!1,null!=n.itemSelector&&(i.pointer.selector=n.itemSelector),null!=n.appendTo&&(i.mirror.parentNode=n.appendTo),i.emitter.on("pointerdown",this.handlePointerDown),i.emitter.on("dragstart",this.handleDragStart),new b(i,n.eventData)}return e.prototype.destroy=function(){this.dragging.destroy()},e}(),R=function(e){function t(t){var n=e.call(this,t)||this;n.shouldIgnoreMove=!1,n.mirrorSelector="",n.currentMirrorEl=null,n.handlePointerDown=function(e){n.emitter.trigger("pointerdown",e),n.shouldIgnoreMove||n.emitter.trigger("dragstart",e)},n.handlePointerMove=function(e){n.shouldIgnoreMove||n.emitter.trigger("dragmove",e)},n.handlePointerUp=function(e){n.emitter.trigger("pointerup",e),n.shouldIgnoreMove||n.emitter.trigger("dragend",e)};var r=n.pointer=new s(t);return r.emitter.on("pointerdown",n.handlePointerDown),r.emitter.on("pointermove",n.handlePointerMove),r.emitter.on("pointerup",n.handlePointerUp),n}return r(t,e),t.prototype.destroy=function(){this.pointer.destroy()},t.prototype.setIgnoreMove=function(e){this.shouldIgnoreMove=e},t.prototype.setMirrorIsVisible=function(e){if(e)this.currentMirrorEl&&(this.currentMirrorEl.style.visibility="",this.currentMirrorEl=null);else{var t=this.mirrorSelector?document.querySelector(this.mirrorSelector):null;t&&(this.currentMirrorEl=t,t.style.visibility="hidden")}},t}(t.ElementDragging),I=function(){function e(e,t){var n=document;e===document||e instanceof Element?(n=e,t=t||{}):t=e||{};var r=this.dragging=new R(n);"string"==typeof t.itemSelector?r.pointer.selector=t.itemSelector:n===document&&(r.pointer.selector="[data-event]"),"string"==typeof t.mirrorSelector&&(r.mirrorSelector=t.mirrorSelector),new b(r,t.eventData)}return e.prototype.destroy=function(){this.dragging.destroy()},e}(),P=t.createPlugin({componentInteractions:[y,D,w,T],calendarInteractions:[M],elementDraggingImpl:f});e.Draggable=C,e.FeaturefulElementDragging=f,e.PointerDragging=s,e.ThirdPartyDraggable=I,e.default=P,Object.defineProperty(e,"__esModule",{value:!0})})); \ No newline at end of file
diff --git a/library/fullcalendar/packages/interaction/package.json b/library/fullcalendar/packages/interaction/package.json
deleted file mode 100644
index b3dc22110..000000000
--- a/library/fullcalendar/packages/interaction/package.json
+++ /dev/null
@@ -1,33 +0,0 @@
-{
- "name": "@fullcalendar/interaction",
- "version": "4.4.2",
- "title": "FullCalendar Interaction Plugin",
- "description": "Provides functionality for event drag-n-drop, resizing, dateClick, and selectable actions",
- "keywords": [
- "calendar",
- "event",
- "full-sized"
- ],
- "homepage": "https://fullcalendar.io/",
- "docs": "https://fullcalendar.io/docs/editable",
- "bugs": "https://fullcalendar.io/reporting-bugs",
- "repository": {
- "type": "git",
- "url": "https://github.com/fullcalendar/fullcalendar.git",
- "homepage": "https://github.com/fullcalendar/fullcalendar"
- },
- "license": "MIT",
- "author": {
- "name": "Adam Shaw",
- "email": "arshaw@arshaw.com",
- "url": "http://arshaw.com/"
- },
- "copyright": "2019 Adam Shaw",
- "peerDependencies": {
- "@fullcalendar/core": "~4.4.0"
- },
- "main": "main.js",
- "module": "main.esm.js",
- "unpkg": "main.min.js",
- "types": "main.d.ts"
-}