@progress/kendo-angular-utils
Version:
Kendo UI Angular utils component
140 lines (139 loc) • 5.23 kB
JavaScript
/**-----------------------------------------------------------------------------------------
* Copyright © 2025 Progress Software Corporation. All rights reserved.
* Licensed under commercial license. See LICENSE.md in the project root for more information
*-------------------------------------------------------------------------------------------*/
import { Injectable } from '@angular/core';
import { dispatchDragAndDrop, getScrollableParent, autoScroll } from '@progress/kendo-draggable-common';
import { isPresent } from './util';
import * as i0 from "@angular/core";
/**
* @hidden
*/
export class DragStateService {
constructor() {
this.setCallbacks();
}
dragTarget = null;
dropTarget = null;
dragTargets = [];
dropTargets = [];
pressed = false;
ignoreMouse = false;
autoScroll = true;
isScrolling = false;
scrollableParent = null;
autoScrollDirection = { horizontal: true, vertical: true };
initialClientOffset = { x: 0, y: 0 };
clientOffset = { x: 0, y: 0 };
initialScrollOffset = { x: 0, y: 0 };
scrollOffset = { x: 0, y: 0 };
offset = { x: 0, y: 0 };
pageOffset = { x: 0, y: 0 };
velocity = { x: 0, y: 0 };
dragTargetDirective;
state;
dragIndex = null;
dropIndex = null;
dragData;
dragTargetId;
callbacks = {};
scrollInterval = null;
handleDragAndDrop(action) {
this.updateState();
dispatchDragAndDrop(this.state, action, this.callbacks);
}
setPressed(pressed) {
this.pressed = pressed;
}
setScrolling(isScrolling) {
this.isScrolling = isScrolling;
if (isScrolling) {
const scrollableParent = getScrollableParent(document.elementFromPoint(this.clientOffset.x, this.clientOffset.y));
window.clearInterval(this.scrollInterval);
this.scrollInterval = window.setInterval(() => {
autoScroll(scrollableParent, { x: this.velocity.x, y: this.velocity.y });
}, 50);
}
else {
if (this.scrollInterval) {
window.clearInterval(this.scrollInterval);
this.scrollInterval = null;
}
}
}
setVelocity(velocity) {
this.velocity = velocity;
}
setOffset(offset) {
this.offset = offset;
}
setClientOffset(clientOffset) {
this.clientOffset = clientOffset;
}
setPageOffset(pageOffset) {
this.pageOffset = pageOffset;
}
setInitialClientOffset(initialClientOffset) {
this.initialClientOffset = initialClientOffset;
}
setScrollOffset(scrollOffset) {
this.scrollOffset = scrollOffset;
}
setInitialScrollOffset(initialScrollOffset) {
this.initialScrollOffset = initialScrollOffset;
}
get dragTargetPresent() {
return isPresent(this.dragTarget?.element);
}
get dropTargetPresent() {
return isPresent(this.dropTarget?.element);
}
updateState() {
this.state = {
drag: this.dragTarget,
drop: this.dropTarget,
drags: this.dragTargets,
drops: this.dropTargets,
pressed: this.pressed,
ignoreMouse: this.ignoreMouse,
autoScroll: this.autoScroll,
isScrolling: this.isScrolling,
scrollableParent: this.scrollableParent,
autoScrollDirection: this.autoScrollDirection,
initialClientOffset: this.initialClientOffset,
clientOffset: this.clientOffset,
initialScrollOffset: this.initialScrollOffset,
scrollOffset: this.scrollOffset,
offset: this.offset,
pageOffset: this.pageOffset,
velocity: this.velocity
};
}
setCallbacks() {
this.callbacks = {
onVelocityChange: this.setVelocity.bind(this),
onOffsetChange: this.setOffset.bind(this),
onClientOffsetChange: this.setClientOffset.bind(this),
onPageOffsetChange: this.setPageOffset.bind(this),
onInitialClientOffsetChange: this.setInitialClientOffset.bind(this),
onScrollOffsetChange: this.setScrollOffset.bind(this),
onInitialScrollOffsetChange: this.setInitialScrollOffset.bind(this),
onIsPressedChange: this.setPressed.bind(this),
onIsScrollingChange: this.setScrolling.bind(this)
};
}
ngOnDestroy() {
if (this.scrollInterval) {
window.clearInterval(this.scrollInterval);
this.scrollInterval = null;
}
}
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: DragStateService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: DragStateService, providedIn: 'root' });
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: DragStateService, decorators: [{
type: Injectable,
args: [{
providedIn: 'root'
}]
}], ctorParameters: function () { return []; } });