blob: ac654d9601017cec795280cba5d04db84e884694 [file] [log] [blame]
/**
* @license
* Copyright Google LLC All Rights Reserved.
*
* Use of this source code is governed by an MIT-style license that can be
* found in the LICENSE file at https://angular.io/license
*/
import { ElementRef, NgZone } from '@angular/core';
import { Direction } from '@angular/cdk/bidi';
import { ViewportRuler } from '@angular/cdk/scrolling';
import { Subject } from 'rxjs';
import { DragDropRegistry } from './drag-drop-registry';
import { DragRefInternal as DragRef, Point } from './drag-ref';
/**
* Internal compile-time-only representation of a `DropListRef`.
* Used to avoid circular import issues between the `DropListRef` and the `DragRef`.
* @docs-private
*/
export interface DropListRefInternal extends DropListRef {
}
/**
* Reference to a drop list. Used to manipulate or dispose of the container.
* @docs-private
*/
export declare class DropListRef<T = any> {
private _dragDropRegistry;
/**
* @deprecated _ngZone and _viewportRuler parameters to be made required.
* @breaking-change 9.0.0
*/
private _ngZone?;
private _viewportRuler?;
private _document;
/** Element that the drop list is attached to. */
element: HTMLElement | ElementRef<HTMLElement>;
/**
* Unique ID for the drop list.
* @deprecated No longer being used. To be removed.
* @breaking-change 8.0.0
*/
id: string;
/** Whether starting a dragging sequence from this container is disabled. */
disabled: boolean;
/** Whether sorting items within the list is disabled. */
sortingDisabled: boolean;
/** Locks the position of the draggable elements inside the container along the specified axis. */
lockAxis: 'x' | 'y';
/**
* Whether auto-scrolling the view when the user
* moves their pointer close to the edges is disabled.
*/
autoScrollDisabled: boolean;
/**
* Function that is used to determine whether an item
* is allowed to be moved into a drop container.
*/
enterPredicate: (drag: DragRef, drop: DropListRef) => boolean;
/** Emits right before dragging has started. */
beforeStarted: Subject<void>;
/**
* Emits when the user has moved a new drag item into this container.
*/
entered: Subject<{
item: DragRef;
container: DropListRef<any>;
currentIndex: number;
}>;
/**
* Emits when the user removes an item from the container
* by dragging it into another container.
*/
exited: Subject<{
item: DragRef;
container: DropListRef<any>;
}>;
/** Emits when the user drops an item inside the container. */
dropped: Subject<{
item: DragRef;
currentIndex: number;
previousIndex: number;
container: DropListRef<any>;
previousContainer: DropListRef<any>;
isPointerOverContainer: boolean;
distance: Point;
}>;
/** Emits as the user is swapping items while actively dragging. */
sorted: Subject<{
previousIndex: number;
currentIndex: number;
container: DropListRef<any>;
item: DragRef;
}>;
/** Arbitrary data that can be attached to the drop list. */
data: T;
/** Whether an item in the list is being dragged. */
private _isDragging;
/** Cache of the dimensions of all the items inside the container. */
private _itemPositions;
/** Keeps track of the container's scroll position. */
private _scrollPosition;
/** Keeps track of the scroll position of the viewport. */
private _viewportScrollPosition;
/** Cached `ClientRect` of the drop list. */
private _clientRect;
/**
* Draggable items that are currently active inside the container. Includes the items
* from `_draggables`, as well as any items that have been dragged in, but haven't
* been dropped yet.
*/
private _activeDraggables;
/**
* Keeps track of the item that was last swapped with the dragged item, as
* well as what direction the pointer was moving in when the swap occured.
*/
private _previousSwap;
/** Draggable items in the container. */
private _draggables;
/** Drop lists that are connected to the current one. */
private _siblings;
/** Direction in which the list is oriented. */
private _orientation;
/** Connected siblings that currently have a dragged item. */
private _activeSiblings;
/** Layout direction of the drop list. */
private _direction;
/** Subscription to the window being scrolled. */
private _viewportScrollSubscription;
/** Vertical direction in which the list is currently scrolling. */
private _verticalScrollDirection;
/** Horizontal direction in which the list is currently scrolling. */
private _horizontalScrollDirection;
/** Node that is being auto-scrolled. */
private _scrollNode;
/** Used to signal to the current auto-scroll sequence when to stop. */
private _stopScrollTimers;
constructor(element: ElementRef<HTMLElement> | HTMLElement, _dragDropRegistry: DragDropRegistry<DragRef, DropListRef>, _document: any,
/**
* @deprecated _ngZone and _viewportRuler parameters to be made required.
* @breaking-change 9.0.0
*/
_ngZone?: NgZone | undefined, _viewportRuler?: ViewportRuler | undefined);
/** Removes the drop list functionality from the DOM element. */
dispose(): void;
/** Whether an item from this list is currently being dragged. */
isDragging(): boolean;
/** Starts dragging an item. */
start(): void;
/**
* Emits an event to indicate that the user moved an item into the container.
* @param item Item that was moved into the container.
* @param pointerX Position of the item along the X axis.
* @param pointerY Position of the item along the Y axis.
*/
enter(item: DragRef, pointerX: number, pointerY: number): void;
/**
* Removes an item from the container after it was dragged into another container by the user.
* @param item Item that was dragged out.
*/
exit(item: DragRef): void;
/**
* Drops an item into this container.
* @param item Item being dropped into the container.
* @param currentIndex Index at which the item should be inserted.
* @param previousContainer Container from which the item got dragged in.
* @param isPointerOverContainer Whether the user's pointer was over the
* container when the item was dropped.
* @param distance Distance the user has dragged since the start of the dragging sequence.
* @breaking-change 9.0.0 `distance` parameter to become required.
*/
drop(item: DragRef, currentIndex: number, previousContainer: DropListRef, isPointerOverContainer: boolean, distance?: Point): void;
/**
* Sets the draggable items that are a part of this list.
* @param items Items that are a part of this list.
*/
withItems(items: DragRef[]): this;
/** Sets the layout direction of the drop list. */
withDirection(direction: Direction): this;
/**
* Sets the containers that are connected to this one. When two or more containers are
* connected, the user will be allowed to transfer items between them.
* @param connectedTo Other containers that the current containers should be connected to.
*/
connectedTo(connectedTo: DropListRef[]): this;
/**
* Sets the orientation of the container.
* @param orientation New orientation for the container.
*/
withOrientation(orientation: 'vertical' | 'horizontal'): this;
/**
* Figures out the index of an item in the container.
* @param item Item whose index should be determined.
*/
getItemIndex(item: DragRef): number;
/**
* Whether the list is able to receive the item that
* is currently being dragged inside a connected drop list.
*/
isReceiving(): boolean;
/**
* Sorts an item inside the container based on its position.
* @param item Item to be sorted.
* @param pointerX Position of the item along the X axis.
* @param pointerY Position of the item along the Y axis.
* @param pointerDelta Direction in which the pointer is moving along each axis.
*/
_sortItem(item: DragRef, pointerX: number, pointerY: number, pointerDelta: {
x: number;
y: number;
}): void;
/**
* Checks whether the user's pointer is close to the edges of either the
* viewport or the drop list and starts the auto-scroll sequence.
* @param pointerX User's pointer position along the x axis.
* @param pointerY User's pointer position along the y axis.
*/
_startScrollingIfNecessary(pointerX: number, pointerY: number): void;
/** Stops any currently-running auto-scroll sequences. */
_stopScrolling(): void;
/** Caches the position of the drop list. */
private _cacheOwnPosition;
/** Refreshes the position cache of the items and sibling containers. */
private _cacheItemPositions;
/** Resets the container to its initial state. */
private _reset;
/**
* Gets the offset in pixels by which the items that aren't being dragged should be moved.
* @param currentIndex Index of the item currently being dragged.
* @param siblings All of the items in the list.
* @param delta Direction in which the user is moving.
*/
private _getSiblingOffsetPx;
/**
* Checks whether the pointer coordinates are close to the drop container.
* @param pointerX Coordinates along the X axis.
* @param pointerY Coordinates along the Y axis.
*/
private _isPointerNearDropContainer;
/**
* Gets the offset in pixels by which the item that is being dragged should be moved.
* @param currentPosition Current position of the item.
* @param newPosition Position of the item where the current item should be moved.
* @param delta Direction in which the user is moving.
*/
private _getItemOffsetPx;
/**
* Gets the index of an item in the drop container, based on the position of the user's pointer.
* @param item Item that is being sorted.
* @param pointerX Position of the user's pointer along the X axis.
* @param pointerY Position of the user's pointer along the Y axis.
* @param delta Direction in which the user is moving their pointer.
*/
private _getItemIndexFromPointerPosition;
/** Caches the current items in the list and their positions. */
private _cacheItems;
/**
* Updates the internal state of the container after a scroll event has happened.
* @param scrollPosition Object that is keeping track of the scroll position.
* @param newTop New top scroll position.
* @param newLeft New left scroll position.
* @param extraClientRect Extra `ClientRect` object that should be updated, in addition to the
* ones of the drag items. Useful when the viewport has been scrolled and we also need to update
* the `ClientRect` of the list.
*/
private _updateAfterScroll;
/** Handles the container being scrolled. Has to be an arrow function to preserve the context. */
private _handleScroll;
/** Removes the event listeners associated with this drop list. */
private _removeListeners;
/** Starts the interval that'll auto-scroll the element. */
private _startScrollInterval;
/**
* Checks whether the user's pointer is positioned over the container.
* @param x Pointer position along the X axis.
* @param y Pointer position along the Y axis.
*/
_isOverContainer(x: number, y: number): boolean;
/**
* Figures out whether an item should be moved into a sibling
* drop container, based on its current position.
* @param item Drag item that is being moved.
* @param x Position of the item along the X axis.
* @param y Position of the item along the Y axis.
*/
_getSiblingContainerFromPosition(item: DragRef, x: number, y: number): DropListRef | undefined;
/**
* Checks whether the drop list can receive the passed-in item.
* @param item Item that is being dragged into the list.
* @param x Position of the item along the X axis.
* @param y Position of the item along the Y axis.
*/
_canReceive(item: DragRef, x: number, y: number): boolean;
/**
* Called by one of the connected drop lists when a dragging sequence has started.
* @param sibling Sibling in which dragging has started.
*/
_startReceiving(sibling: DropListRef): void;
/**
* Called by a connected drop list when dragging has stopped.
* @param sibling Sibling whose dragging has stopped.
*/
_stopReceiving(sibling: DropListRef): void;
}