@storipress/vue-slicksort
Version:
Set of mixins to turn any list into a sortable, touch-friendly, animated list
846 lines (845 loc) • 25.2 kB
TypeScript
/* eslint-disable @typescript-eslint/ban-ts-comment */
/* eslint-disable @typescript-eslint/no-non-null-assertion */
import { PropType, Directive, Plugin } from "vue";
type XY = {
x: number;
y: number;
};
type TopLeft = {
top: number;
left: number;
};
type BottomRight = {
bottom: number;
right: number;
};
type WidthHeight = {
width: number;
height: number;
};
type PointEvent = MouseEvent | TouchEvent;
declare function arrayMove<T>(arr: T[], previousIndex: number, newIndex: number): (T | undefined)[];
interface SortableNode extends HTMLElement {
sortableInfo: {
index: number;
manager: Manager;
};
sortableHandle?: boolean;
}
interface ItemRef {
node: SortableNode;
index?: number;
edgeOffset?: TopLeft | null;
}
declare class Manager {
private refs;
active: {
index: number;
} | null;
add(ref: ItemRef): void;
remove(ref: ItemRef): void;
isActive(): boolean;
getActive(): ItemRef | null;
getIndex(ref: ItemRef): number;
getRefs(): ItemRef[];
getOrderedRefs(): ItemRef[];
}
interface ComponentData {
manager: Manager;
ref: ItemRef;
}
// Export Sortable Element Component Mixin
declare const ElementMixin: import("vue").DefineComponent<{
index: {
type: NumberConstructor;
required: true;
};
disabled: {
type: BooleanConstructor;
default: boolean;
};
}, unknown, ComponentData, {}, {
setDraggable(index: number): void;
removeDraggable(): void;
}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, Record<string, any>, string, import("vue").VNodeProps & import("vue").AllowedComponentProps & import("vue").ComponentCustomProps, Readonly<import("vue").ExtractPropTypes<{
index: {
type: NumberConstructor;
required: true;
};
disabled: {
type: BooleanConstructor;
default: boolean;
};
}>>, {
disabled: boolean;
}>;
interface ContainerRef {
id: string;
group: string;
accept: AcceptProp | null;
block: string[];
container: HTMLElement;
newIndex: number;
manager: Manager;
sortableGhost: HTMLElement | null;
handleDragIn(e: PointEvent, ghost: HTMLElement | null, helper: HTMLElement | null): void;
handleDragOut(): void;
handleDragEnd(): void;
handleSortEnd(e: PointEvent): void;
handleDropIn(payload: unknown): void;
handleDropOut(): unknown;
updatePosition(e: PointEvent): void;
animateNodes(): void;
autoscroll(): void;
}
type AcceptPropArgs = {
source: ContainerRef;
dest: ContainerRef;
payload: unknown;
};
type AcceptProp = boolean | string[] | ((args: AcceptPropArgs) => boolean);
declare class SlicksortHub {
helper: HTMLElement | null;
ghost: HTMLElement | null;
private refs;
private source;
private dest;
getId(): string;
isSource({ id }: ContainerRef): boolean;
getSource(): ContainerRef | null;
isDest({ id }: ContainerRef): boolean;
getDest(): ContainerRef | null;
addContainer(ref: ContainerRef): void;
removeContainer(ref: ContainerRef): void;
sortStart(ref: ContainerRef): void;
handleSortMove(e: PointEvent, payload: unknown): void;
handleSortEnd(): void;
reset(): void;
cancel(): void;
}
type PointEventListener = (e: PointEvent) => unknown;
type Timer$0 = number | null;
interface ComponentProps {
list: unknown[];
axis: "x" | "y" | "xy" | "yx"; // 'x', 'y', 'xy'
distance: number;
pressDelay: number;
pressThreshold: number;
useDragHandle: boolean;
useWindowAsScrollContainer: boolean;
hideSortableGhost: boolean;
lockToContainerEdges: boolean;
lockOffset: string | number | string[];
transitionDuration: number;
appendTo: string;
draggedSettlingDuration: number;
group: string;
accept: boolean | string[] | ((ctx: {
source: ContainerRef;
dest: ContainerRef;
payload: unknown;
}) => boolean);
cancelKey: string;
block: string[];
lockAxis: string;
helperClass: string;
contentWindow: Window;
shouldCancelStart: (e: PointEvent) => boolean;
getHelperDimensions: (ref: ItemRef) => {
width: number;
height: number;
};
setHelperStyle: (el: HTMLElement | null, data?: {
targetX: number;
targetY: number;
duration: number;
}) => void;
}
interface ComponentData$0 extends ComponentProps {
id: string;
// usually thi.$el
container: HTMLElement;
// ref to document
document: Document;
// Provided for sortable elements to register
manager: Manager;
// ref to window
_window: Window;
// window or container
// TODO make this a prop
scrollContainer: {
scrollTop: number;
scrollLeft: number;
};
// Injected and used for drag and drop between lists
hub?: SlicksortHub;
// Normalized events for mouse and touch devices
events: Record<string, PointEventListener>;
// MOusedown or touchstart occurred
_touched: boolean;
// initial point of contact
_pos: XY;
// distance from _pos to current pointer position
// Used for drag threshold, aka `distance`
_delta: XY;
// Data structure for `axis` prop
_axis: {
x: boolean;
y: boolean;
};
// timer for press threshold
pressTimer: Timer$0;
// used to wait until next tick to cancel
cancelTimer: Timer$0;
// dragout transition timer
dragendTimer: Timer$0;
// Used for repeating autoscroll
autoscrollInterval: Timer$0;
// The translation applied to the helper
translate: XY;
// The minmax values of translate before starting autoscroll
minTranslate: Partial<XY>;
maxTranslate: Partial<XY>;
// Is the user currently sorting
sorting: boolean;
// The user has initiated a cancel action
canceling: boolean;
// The active node that was originally clicked
node: SortableNode;
// The measurements of the node that have to be calculated separately
margin: TopLeft & BottomRight;
width: number;
height: number;
// space added around the active node
marginOffset: XY;
// Initial offset of the cursor
initialOffset: XY;
// Initial scroll position of the container and window
initialScroll: TopLeft;
initialWindowScroll: TopLeft;
// The top-left offset of the node from the offsetParent of the *container*
// Its important to use the container as a source for the offsetParent so all nodes have the same reference point
offsetEdge: TopLeft;
// client rect for the node and container
boundingClientRect: ClientRect;
containerBoundingRect: ClientRect;
// Starting index (use last index for drag in operations)
index: number | null;
// Target index for dropping
newIndex: number | null;
// The node that follows the mouse
helper: HTMLElement | null;
// The node that stays in the list and is hidden
sortableGhost: HTMLElement | null;
// The element that we listen to for events
listenerNode: GlobalEventHandlers;
}
// Export Sortable Container Component Mixin
declare const ContainerMixin: import("vue").DefineComponent<{
list: {
type: PropType<unknown[]>;
required: true;
};
axis: {
type: StringConstructor;
default: string;
};
distance: {
type: NumberConstructor;
default: number;
};
pressDelay: {
type: NumberConstructor;
default: number;
};
pressThreshold: {
type: NumberConstructor;
default: number;
};
useDragHandle: {
type: BooleanConstructor;
default: boolean;
};
useWindowAsScrollContainer: {
type: BooleanConstructor;
default: boolean;
};
hideSortableGhost: {
type: BooleanConstructor;
default: boolean;
};
lockToContainerEdges: {
type: BooleanConstructor;
default: boolean;
};
lockOffset: {
type: PropType<string | number | number[]>;
default: string;
};
transitionDuration: {
type: NumberConstructor;
default: number;
};
appendTo: {
type: StringConstructor;
default: string;
};
draggedSettlingDuration: {
type: NumberConstructor;
default: null;
};
group: {
type: StringConstructor;
default: string;
};
accept: {
type: PropType<AcceptProp>;
default: null;
};
cancelKey: {
type: StringConstructor;
default: string;
};
block: {
type: PropType<string[]>;
default: () => never[];
};
lockAxis: {
type: StringConstructor;
default: string;
};
helperClass: {
type: StringConstructor;
default: string;
};
contentWindow: {
type: PropType<Window>;
default: null;
};
shouldCancelStart: {
type: PropType<PointEventListener>;
default: (e: PointEvent) => boolean;
};
getHelperDimensions: {
type: PropType<(arg: ItemRef) => WidthHeight>;
default: ({ node }: ItemRef) => {
width: number;
height: number;
};
};
setHelperStyle: {
type: PropType<(el: HTMLElement | null, data?: {
targetX: number;
targetY: number;
duration: number;
} | undefined) => void>;
default: (el: HTMLElement | null, data?: {
targetX: number;
targetY: number;
duration: number;
} | undefined) => void;
};
}, unknown, ComponentData$0, {}, {
handleStart(e: PointEvent): false | undefined;
nodeIsChild(node: SortableNode): boolean;
handleMove(e: PointEvent): void;
handleEnd(): void;
cancel(): void;
handleSortCancel(e: KeyboardEvent | TouchEvent): void;
handlePress(e: PointEvent): void;
handleSortMove(e: PointEvent): void;
handleDropOut(): unknown;
handleDropIn(payload: unknown): void;
handleDragOut(): void;
handleDragEnd(): void;
intializeOffsets(e: PointEvent, clientRect: ClientRect): void;
handleDragIn(e: PointEvent, sortableGhost: SortableNode, helper: SortableNode): void;
handleSortEnd(e: PointEvent | KeyboardEvent): void;
transitionHelperIntoPlace(nodes: ItemRef[], cb: () => void): Promise<void> | undefined;
updatePosition(e: PointEvent): void;
animateNodes(): void;
autoscroll(): void;
}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, ("sort-start" | "sort-move" | "sort-end" | "sort-cancel" | "sort-insert" | "sort-remove" | "drag-in" | "drag-out" | "drag-end" | "update:list")[], "sort-start" | "sort-move" | "sort-end" | "sort-cancel" | "sort-insert" | "sort-remove" | "drag-in" | "drag-out" | "drag-end" | "update:list", import("vue").VNodeProps & import("vue").AllowedComponentProps & import("vue").ComponentCustomProps, Readonly<import("vue").ExtractPropTypes<{
list: {
type: PropType<unknown[]>;
required: true;
};
axis: {
type: StringConstructor;
default: string;
};
distance: {
type: NumberConstructor;
default: number;
};
pressDelay: {
type: NumberConstructor;
default: number;
};
pressThreshold: {
type: NumberConstructor;
default: number;
};
useDragHandle: {
type: BooleanConstructor;
default: boolean;
};
useWindowAsScrollContainer: {
type: BooleanConstructor;
default: boolean;
};
hideSortableGhost: {
type: BooleanConstructor;
default: boolean;
};
lockToContainerEdges: {
type: BooleanConstructor;
default: boolean;
};
lockOffset: {
type: PropType<string | number | number[]>;
default: string;
};
transitionDuration: {
type: NumberConstructor;
default: number;
};
appendTo: {
type: StringConstructor;
default: string;
};
draggedSettlingDuration: {
type: NumberConstructor;
default: null;
};
group: {
type: StringConstructor;
default: string;
};
accept: {
type: PropType<AcceptProp>;
default: null;
};
cancelKey: {
type: StringConstructor;
default: string;
};
block: {
type: PropType<string[]>;
default: () => never[];
};
lockAxis: {
type: StringConstructor;
default: string;
};
helperClass: {
type: StringConstructor;
default: string;
};
contentWindow: {
type: PropType<Window>;
default: null;
};
shouldCancelStart: {
type: PropType<PointEventListener>;
default: (e: PointEvent) => boolean;
};
getHelperDimensions: {
type: PropType<(arg: ItemRef) => WidthHeight>;
default: ({ node }: ItemRef) => {
width: number;
height: number;
};
};
setHelperStyle: {
type: PropType<(el: HTMLElement | null, data?: {
targetX: number;
targetY: number;
duration: number;
} | undefined) => void>;
default: (el: HTMLElement | null, data?: {
targetX: number;
targetY: number;
duration: number;
} | undefined) => void;
};
}>> & {
"onSort-start"?: ((...args: any[]) => any) | undefined;
"onSort-move"?: ((...args: any[]) => any) | undefined;
"onSort-end"?: ((...args: any[]) => any) | undefined;
"onSort-cancel"?: ((...args: any[]) => any) | undefined;
"onSort-insert"?: ((...args: any[]) => any) | undefined;
"onSort-remove"?: ((...args: any[]) => any) | undefined;
"onDrag-in"?: ((...args: any[]) => any) | undefined;
"onDrag-out"?: ((...args: any[]) => any) | undefined;
"onDrag-end"?: ((...args: any[]) => any) | undefined;
"onUpdate:list"?: ((...args: any[]) => any) | undefined;
}, {
accept: AcceptProp;
transitionDuration: number;
setHelperStyle: (el: HTMLElement | null, data?: {
targetX: number;
targetY: number;
duration: number;
} | undefined) => void;
axis: string;
distance: number;
pressDelay: number;
pressThreshold: number;
useDragHandle: boolean;
useWindowAsScrollContainer: boolean;
hideSortableGhost: boolean;
lockToContainerEdges: boolean;
lockOffset: string | number | number[];
appendTo: string;
draggedSettlingDuration: number;
group: string;
cancelKey: string;
block: string[];
lockAxis: string;
helperClass: string;
contentWindow: Window;
shouldCancelStart: PointEventListener;
getHelperDimensions: (arg: ItemRef) => WidthHeight;
}>;
// Export Sortable Element Handle Directive
declare const HandleDirective: Directive;
declare const SlickList: import("vue").DefineComponent<{
tag: {
type: StringConstructor;
default: string;
};
itemKey: {
type: PropType<string | ((item: unknown) => string)>;
default: string;
};
}, unknown, unknown, {}, {}, import("vue").DefineComponent<{
list: {
type: PropType<unknown[]>;
required: true;
};
axis: {
type: StringConstructor;
default: string;
};
distance: {
type: NumberConstructor;
default: number;
};
pressDelay: {
type: NumberConstructor;
default: number;
};
pressThreshold: {
type: NumberConstructor;
default: number;
};
useDragHandle: {
type: BooleanConstructor;
default: boolean;
};
useWindowAsScrollContainer: {
type: BooleanConstructor;
default: boolean;
};
hideSortableGhost: {
type: BooleanConstructor;
default: boolean;
};
lockToContainerEdges: {
type: BooleanConstructor;
default: boolean;
};
lockOffset: {
type: PropType<string | number | number[]>;
default: string;
};
transitionDuration: {
type: NumberConstructor;
default: number;
};
appendTo: {
type: StringConstructor;
default: string;
};
draggedSettlingDuration: {
type: NumberConstructor;
default: null;
};
group: {
type: StringConstructor;
default: string;
};
accept: {
type: PropType<AcceptProp>;
default: null;
};
cancelKey: {
type: StringConstructor;
default: string;
};
block: {
type: PropType<string[]>;
default: () => never[];
};
lockAxis: {
type: StringConstructor;
default: string;
};
helperClass: {
type: StringConstructor;
default: string;
};
contentWindow: {
type: PropType<Window>;
default: null;
};
shouldCancelStart: {
type: PropType<(e: PointEvent) => unknown>;
default: (e: PointEvent) => boolean;
};
getHelperDimensions: {
type: PropType<(arg: ItemRef) => WidthHeight>;
default: ({ node }: ItemRef) => {
width: number;
height: number;
};
};
setHelperStyle: {
type: PropType<(el: HTMLElement | null, data?: {
targetX: number;
targetY: number;
duration: number;
} | undefined) => void>;
default: (el: HTMLElement | null, data?: {
targetX: number;
targetY: number;
duration: number;
} | undefined) => void;
};
}, unknown, ComponentData$0, {}, {
handleStart(e: PointEvent): false | undefined;
nodeIsChild(node: SortableNode): boolean;
handleMove(e: PointEvent): void;
handleEnd(): void;
cancel(): void;
handleSortCancel(e: TouchEvent | KeyboardEvent): void;
handlePress(e: PointEvent): void;
handleSortMove(e: PointEvent): void;
handleDropOut(): unknown;
handleDropIn(payload: unknown): void;
handleDragOut(): void;
handleDragEnd(): void;
intializeOffsets(e: PointEvent, clientRect: ClientRect): void;
handleDragIn(e: PointEvent, sortableGhost: SortableNode, helper: SortableNode): void;
handleSortEnd(e: PointEvent | KeyboardEvent): void;
transitionHelperIntoPlace(nodes: ItemRef[], cb: () => void): Promise<void> | undefined;
updatePosition(e: PointEvent): void;
animateNodes(): void;
autoscroll(): void;
}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, ("sort-start" | "sort-move" | "sort-end" | "sort-cancel" | "sort-insert" | "sort-remove" | "drag-in" | "drag-out" | "drag-end" | "update:list")[], "sort-start" | "sort-move" | "sort-end" | "sort-cancel" | "sort-insert" | "sort-remove" | "drag-in" | "drag-out" | "drag-end" | "update:list", import("vue").VNodeProps & import("vue").AllowedComponentProps & import("vue").ComponentCustomProps, Readonly<import("vue").ExtractPropTypes<{
list: {
type: PropType<unknown[]>;
required: true;
};
axis: {
type: StringConstructor;
default: string;
};
distance: {
type: NumberConstructor;
default: number;
};
pressDelay: {
type: NumberConstructor;
default: number;
};
pressThreshold: {
type: NumberConstructor;
default: number;
};
useDragHandle: {
type: BooleanConstructor;
default: boolean;
};
useWindowAsScrollContainer: {
type: BooleanConstructor;
default: boolean;
};
hideSortableGhost: {
type: BooleanConstructor;
default: boolean;
};
lockToContainerEdges: {
type: BooleanConstructor;
default: boolean;
};
lockOffset: {
type: PropType<string | number | number[]>;
default: string;
};
transitionDuration: {
type: NumberConstructor;
default: number;
};
appendTo: {
type: StringConstructor;
default: string;
};
draggedSettlingDuration: {
type: NumberConstructor;
default: null;
};
group: {
type: StringConstructor;
default: string;
};
accept: {
type: PropType<AcceptProp>;
default: null;
};
cancelKey: {
type: StringConstructor;
default: string;
};
block: {
type: PropType<string[]>;
default: () => never[];
};
lockAxis: {
type: StringConstructor;
default: string;
};
helperClass: {
type: StringConstructor;
default: string;
};
contentWindow: {
type: PropType<Window>;
default: null;
};
shouldCancelStart: {
type: PropType<(e: PointEvent) => unknown>;
default: (e: PointEvent) => boolean;
};
getHelperDimensions: {
type: PropType<(arg: ItemRef) => WidthHeight>;
default: ({ node }: ItemRef) => {
width: number;
height: number;
};
};
setHelperStyle: {
type: PropType<(el: HTMLElement | null, data?: {
targetX: number;
targetY: number;
duration: number;
} | undefined) => void>;
default: (el: HTMLElement | null, data?: {
targetX: number;
targetY: number;
duration: number;
} | undefined) => void;
};
}>> & {
"onSort-start"?: ((...args: any[]) => any) | undefined;
"onSort-move"?: ((...args: any[]) => any) | undefined;
"onSort-end"?: ((...args: any[]) => any) | undefined;
"onSort-cancel"?: ((...args: any[]) => any) | undefined;
"onSort-insert"?: ((...args: any[]) => any) | undefined;
"onSort-remove"?: ((...args: any[]) => any) | undefined;
"onDrag-in"?: ((...args: any[]) => any) | undefined;
"onDrag-out"?: ((...args: any[]) => any) | undefined;
"onDrag-end"?: ((...args: any[]) => any) | undefined;
"onUpdate:list"?: ((...args: any[]) => any) | undefined;
}, {
accept: AcceptProp;
transitionDuration: number;
setHelperStyle: (el: HTMLElement | null, data?: {
targetX: number;
targetY: number;
duration: number;
} | undefined) => void;
axis: string;
distance: number;
pressDelay: number;
pressThreshold: number;
useDragHandle: boolean;
useWindowAsScrollContainer: boolean;
hideSortableGhost: boolean;
lockToContainerEdges: boolean;
lockOffset: string | number | number[];
appendTo: string;
draggedSettlingDuration: number;
group: string;
cancelKey: string;
block: string[];
lockAxis: string;
helperClass: string;
contentWindow: Window;
shouldCancelStart: (e: PointEvent) => unknown;
getHelperDimensions: (arg: ItemRef) => WidthHeight;
}>, import("vue").ComponentOptionsMixin, Record<string, any>, string, import("vue").VNodeProps & import("vue").AllowedComponentProps & import("vue").ComponentCustomProps, Readonly<import("vue").ExtractPropTypes<{
tag: {
type: StringConstructor;
default: string;
};
itemKey: {
type: PropType<string | ((item: unknown) => string)>;
default: string;
};
}>>, {
tag: string;
itemKey: string | ((item: unknown) => string);
}>;
declare const SlickItem: import("vue").DefineComponent<{
tag: {
type: StringConstructor;
default: string;
};
}, unknown, unknown, {}, {}, import("vue").DefineComponent<{
index: {
type: NumberConstructor;
required: true;
};
disabled: {
type: BooleanConstructor;
default: boolean;
};
}, unknown, ComponentData, {}, {
setDraggable(index: number): void;
removeDraggable(): void;
}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, Record<string, any>, string, import("vue").VNodeProps & import("vue").AllowedComponentProps & import("vue").ComponentCustomProps, Readonly<import("vue").ExtractPropTypes<{
index: {
type: NumberConstructor;
required: true;
};
disabled: {
type: BooleanConstructor;
default: boolean;
};
}>>, {
disabled: boolean;
}>, import("vue").ComponentOptionsMixin, Record<string, any>, string, import("vue").VNodeProps & import("vue").AllowedComponentProps & import("vue").ComponentCustomProps, Readonly<import("vue").ExtractPropTypes<{
tag: {
type: StringConstructor;
default: string;
};
}>>, {
tag: string;
}>;
declare const DragHandle: import("vue").DefineComponent<{
tag: {
type: StringConstructor;
default: string;
};
}, unknown, unknown, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, Record<string, any>, string, import("vue").VNodeProps & import("vue").AllowedComponentProps & import("vue").ComponentCustomProps, Readonly<import("vue").ExtractPropTypes<{
tag: {
type: StringConstructor;
default: string;
};
}>>, {
tag: string;
}>;
declare const plugin: Plugin;
export { ElementMixin, ContainerMixin, HandleDirective, SlickList, SlickItem, DragHandle, arrayMove, plugin };