mutable-div
Version:
Directives to enable moving or resizing a div element.
143 lines • 15.3 kB
JavaScript
import { Directive, EventEmitter, HostListener, Input, Output } from '@angular/core';
import * as i0 from "@angular/core";
export class DraggableElementDirective {
constructor(el) {
this.el = el;
this.pointerDown = false;
this.rotate = 0;
this.coordinates = new EventEmitter();
this.stopped = new EventEmitter();
el.nativeElement.style.position = 'absolute';
}
onPointerDown(event) {
event.preventDefault();
this.pointerDown = true;
this.setOriginalPosition(event);
}
onPointerUp() {
this.stopped.emit();
}
onPointerMove(event) {
if (this.pointerDown) {
const element = this.el.nativeElement;
const newPosition = this.setNewPosition(event);
this.setOriginalPosition(event);
element.style.left = (element.offsetLeft + newPosition.x) + 'px';
element.style.top = (element.offsetTop + newPosition.y) + 'px';
this.coordinates.emit({ x: newPosition.x, y: newPosition.y });
}
}
onWindowPointerUp() {
this.pointerDown = false;
}
onPanStart(event) {
this.onPointerDown(event.srcEvent);
}
onPanEnd() {
this.onPointerUp();
}
onPanMove(event) {
this.onPointerMove(event.srcEvent);
}
onWindowPanEnd() {
this.onWindowPointerUp();
}
setOriginalPosition(event) {
switch (this.rotate) {
case 90:
this.originalPosition = {
x: event.clientY,
y: screen.width - event.clientX
};
break;
case 180:
this.originalPosition = {
x: screen.width - event.clientX,
y: screen.height - event.clientY
};
break;
case 270:
this.originalPosition = {
x: screen.height - event.clientY,
y: event.clientX
};
break;
default:
this.originalPosition = {
x: event.clientX,
y: event.clientY
};
}
}
setNewPosition(event) {
let newPosition = {
x: 0,
y: 0
};
switch (this.rotate) {
case 90:
newPosition = {
x: event.clientY - this.originalPosition.x,
y: (screen.width - event.clientX) - this.originalPosition.y
};
break;
case 180:
newPosition = {
x: (screen.width - event.clientX) - this.originalPosition.x,
y: (screen.height - event.clientY) - this.originalPosition.y
};
break;
case 270:
newPosition = {
x: (screen.height - event.clientY) - this.originalPosition.x,
y: event.clientX - this.originalPosition.y
};
break;
default:
newPosition = {
x: event.clientX - this.originalPosition.x,
y: event.clientY - this.originalPosition.y
};
}
return newPosition;
}
/** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: DraggableElementDirective, deps: [{ token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Directive }); }
/** @nocollapse */ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "16.2.12", type: DraggableElementDirective, selector: "[draggable]", inputs: { rotate: "rotate" }, outputs: { coordinates: "coordinates", stopped: "stopped" }, host: { listeners: { "pointerdown": "onPointerDown($event)", "pointerup": "onPointerUp()", "window:pointermove": "onPointerMove($event)", "window:pointerup": "onWindowPointerUp()", "panstart": "onPanStart($event)", "panend": "onPanEnd()", "window:panmove": "onPanMove($event)", "window:panend": "onWindowPanEnd()" } }, ngImport: i0 }); }
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: DraggableElementDirective, decorators: [{
type: Directive,
args: [{
selector: '[draggable]'
}]
}], ctorParameters: function () { return [{ type: i0.ElementRef }]; }, propDecorators: { rotate: [{
type: Input
}], coordinates: [{
type: Output
}], stopped: [{
type: Output
}], onPointerDown: [{
type: HostListener,
args: ['pointerdown', ['$event']]
}], onPointerUp: [{
type: HostListener,
args: ['pointerup']
}], onPointerMove: [{
type: HostListener,
args: ['window:pointermove', ['$event']]
}], onWindowPointerUp: [{
type: HostListener,
args: ['window:pointerup']
}], onPanStart: [{
type: HostListener,
args: ['panstart', ['$event']]
}], onPanEnd: [{
type: HostListener,
args: ['panend']
}], onPanMove: [{
type: HostListener,
args: ['window:panmove', ['$event']]
}], onWindowPanEnd: [{
type: HostListener,
args: ['window:panend']
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHJhZ2dhYmxlLWVsZW1lbnQuZGlyZWN0aXZlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvbXV0YWJsZS1kaXYvc3JjL2xpYi9kcmFnZ2FibGUtZWxlbWVudC5kaXJlY3RpdmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBYyxZQUFZLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7O0FBTWpHLE1BQU0sT0FBTyx5QkFBeUI7SUFTcEMsWUFBb0IsRUFBYztRQUFkLE9BQUUsR0FBRixFQUFFLENBQVk7UUFOMUIsZ0JBQVcsR0FBWSxLQUFLLENBQUM7UUFFNUIsV0FBTSxHQUFHLENBQUMsQ0FBQztRQUNWLGdCQUFXLEdBQUcsSUFBSSxZQUFZLEVBQVksQ0FBQztRQUMzQyxZQUFPLEdBQUcsSUFBSSxZQUFZLEVBQUUsQ0FBQztRQUdyQyxFQUFFLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxRQUFRLEdBQUcsVUFBVSxDQUFDO0lBQy9DLENBQUM7SUFFd0MsYUFBYSxDQUFDLEtBQW1CO1FBQ3hFLEtBQUssQ0FBQyxjQUFjLEVBQUUsQ0FBQztRQUN2QixJQUFJLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQztRQUN4QixJQUFJLENBQUMsbUJBQW1CLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDbEMsQ0FBQztJQUUwQixXQUFXO1FBQ3BDLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFLENBQUM7SUFDdEIsQ0FBQztJQUUrQyxhQUFhLENBQUMsS0FBbUI7UUFDL0UsSUFBSSxJQUFJLENBQUMsV0FBVyxFQUFFO1lBQ3BCLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUMsYUFBYSxDQUFDO1lBQ3RDLE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDL0MsSUFBSSxDQUFDLG1C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Q0FBQztnQkFJWixRQUFRO3NCQUEvQixZQUFZO3VCQUFDLFFBQVE7Z0JBSXNCLFNBQVM7c0JBQXBELFlBQVk7dUJBQUMsZ0JBQWdCLEVBQUUsQ0FBQyxRQUFRLENBQUM7Z0JBSVgsY0FBYztzQkFBNUMsWUFBWTt1QkFBQyxlQUFlIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRGlyZWN0aXZlLCBFbGVtZW50UmVmLCBFdmVudEVtaXR0ZXIsIEhvc3RMaXN0ZW5lciwgSW5wdXQsIE91dHB1dCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgUG9zaXRpb24gfSBmcm9tICcuL21vZGVsL3Bvc2l0aW9uLm1vZGVsJztcblxuQERpcmVjdGl2ZSh7XG4gIHNlbGVjdG9yOiAnW2RyYWdnYWJsZV0nXG59KVxuZXhwb3J0IGNsYXNzIERyYWdnYWJsZUVsZW1lbnREaXJlY3RpdmUge1xuXG4gIG9yaWdpbmFsUG9zaXRpb246IFBvc2l0aW9uO1xuICBwcml2YXRlIHBvaW50ZXJEb3duOiBib29sZWFuID0gZmFsc2U7XG5cbiAgQElucHV0KCkgcm90YXRlID0gMDtcbiAgQE91dHB1dCgpIGNvb3JkaW5hdGVzID0gbmV3IEV2ZW50RW1pdHRlcjxQb3NpdGlvbj4oKTtcbiAgQE91dHB1dCgpIHN0b3BwZWQgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSBlbDogRWxlbWVudFJlZikge1xuICAgIGVsLm5hdGl2ZUVsZW1lbnQuc3R5bGUucG9zaXRpb24gPSAnYWJzb2x1dGUnO1xuICB9XG5cbiAgQEhvc3RMaXN0ZW5lcigncG9pbnRlcmRvd24nLCBbJyRldmVudCddKSBvblBvaW50ZXJEb3duKGV2ZW50OiBQb2ludGVyRXZlbnQpIHtcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIHRoaXMucG9pbnRlckRvd24gPSB0cnVlO1xuICAgIHRoaXMuc2V0T3JpZ2luYWxQb3NpdGlvbihldmVudCk7XG4gIH1cblxuICBASG9zdExpc3RlbmVyKCdwb2ludGVydXAnKSBvblBvaW50ZXJVcCgpIHtcbiAgICB0aGlzLnN0b3BwZWQuZW1pdCgpO1xuICB9XG5cbiAgQEhvc3RMaXN0ZW5lcignd2luZG93OnBvaW50ZXJtb3ZlJywgWyckZXZlbnQnXSkgb25Qb2ludGVyTW92ZShldmVudDogUG9pbnRlckV2ZW50KSB7XG4gICAgaWYgKHRoaXMucG9pbnRlckRvd24pIHtcbiAgICAgIGNvbnN0IGVsZW1lbnQgPSB0aGlzLmVsLm5hdGl2ZUVsZW1lbnQ7XG4gICAgICBjb25zdCBuZXdQb3NpdGlvbiA9IHRoaXMuc2V0TmV3UG9zaXRpb24oZXZlbnQpO1xuICAgICAgdGhpcy5zZXRPcmlnaW5hbFBvc2l0aW9uKGV2ZW50KTtcbiAgICAgIGVsZW1lbnQuc3R5bGUubGVmdCA9IChlbGVtZW50Lm9mZnNldExlZnQgKyBuZXdQb3NpdGlvbi54KSArICdweCc7XG4gICAgICBlbGVtZW50LnN0eWxlLnRvcCA9IChlbGVtZW50Lm9mZnNldFRvcCArIG5ld1Bvc2l0aW9uLnkpICsgJ3B4JztcbiAgICAgIHRoaXMuY29vcmRpbmF0ZXMuZW1pdCh7IHg6IG5ld1Bvc2l0aW9uLngsIHk6IG5ld1Bvc2l0aW9uLnkgfSk7XG4gICAgfVxuICB9XG5cbiAgQEhvc3RMaXN0ZW5lcignd2luZG93OnBvaW50ZXJ1cCcpIG9uV2luZG93UG9pbnRlclVwKCkge1xuICAgIHRoaXMucG9pbnRlckRvd24gPSBmYWxzZTtcbiAgfVxuXG4gIEBIb3N0TGlzdGVuZXIoJ3BhbnN0YXJ0JywgWyckZXZlbnQnXSkgb25QYW5TdGFydChldmVudDogYW55KSB7XG4gICAgdGhpcy5vblBvaW50ZXJEb3duKGV2ZW50LnNyY0V2ZW50KTtcbiAgfVxuXG4gIEBIb3N0TGlzdGVuZXIoJ3BhbmVuZCcpIG9uUGFuRW5kKCkge1xuICAgICAgdGhpcy5vblBvaW50ZXJVcCgpO1xuICB9XG5cbiAgQEhvc3RMaXN0ZW5lcignd2luZG93OnBhbm1vdmUnLCBbJyRldmVudCddKSBvblBhbk1vdmUoZXZlbnQ6IGFueSkge1xuICAgIHRoaXMub25Qb2ludGVyTW92ZShldmVudC5zcmNFdmVudCk7XG4gIH1cblxuICBASG9zdExpc3RlbmVyKCd3aW5kb3c6cGFuZW5kJykgb25XaW5kb3dQYW5FbmQoKSB7XG4gICAgdGhpcy5vbldpbmRvd1BvaW50ZXJVcCgpO1xuICB9XG5cbiAgcHJpdmF0ZSBzZXRPcmlnaW5hbFBvc2l0aW9uKGV2ZW50OiBQb2ludGVyRXZlbnQpOiB2b2lkIHtcbiAgICBzd2l0Y2ggKHRoaXMucm90YXRlKSB7XG4gICAgICBjYXNlIDkwOlxuICAgICAgICB0aGlzLm9yaWdpbmFsUG9zaXRpb24gPSB7XG4gICAgICAgICAgeDogZXZlbnQuY2xpZW50WSxcbiAgICAgICAgICB5OiBzY3JlZW4ud2lkdGggLSBldmVudC5jbGllbnRYXG4gICAgICAgIH07XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAxODA6XG4gICAgICAgIHRoaXMub3JpZ2luYWxQb3NpdGlvbiA9IHtcbiAgICAgICAgICB4OiBzY3JlZW4ud2lkdGggLSBldmVudC5jbGllbnRYLFxuICAgICAgICAgIHk6IHNjcmVlbi5oZWlnaHQgLSBldmVudC5jbGllbnRZXG4gICAgICAgIH07XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAyNzA6XG4gICAgICAgIHRoaXMub3JpZ2luYWxQb3NpdGlvbiA9IHtcbiAgICAgICAgICB4OiBzY3JlZW4uaGVpZ2h0IC0gZXZlbnQuY2xpZW50WSxcbiAgICAgICAgICB5OiBldmVudC5jbGllbnRYXG4gICAgICAgIH07XG4gICAgICAgIGJyZWFrO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgdGhpcy5vcmlnaW5hbFBvc2l0aW9uID0ge1xuICAgICAgICAgIHg6IGV2ZW50LmNsaWVudFgsXG4gICAgICAgICAgeTogZXZlbnQuY2xpZW50WVxuICAgICAgICB9O1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgc2V0TmV3UG9zaXRpb24oZXZlbnQ6IFBvaW50ZXJFdmVudCk6IFBvc2l0aW9uIHtcbiAgICBsZXQgbmV3UG9zaXRpb246IFBvc2l0aW9uID0ge1xuICAgICAgeDogMCxcbiAgICAgIHk6IDBcbiAgICB9O1xuICAgIHN3aXRjaCAodGhpcy5yb3RhdGUpIHtcbiAgICAgIGNhc2UgOTA6XG4gICAgICAgIG5ld1Bvc2l0aW9uID0ge1xuICAgICAgICAgIHg6IGV2ZW50LmNsaWVudFkgLSB0aGlzLm9yaWdpbmFsUG9zaXRpb24ueCxcbiAgICAgICAgICB5OiAoc2NyZWVuLndpZHRoIC0gZXZlbnQuY2xpZW50WCkgLSB0aGlzLm9yaWdpbmFsUG9zaXRpb24ueVxuICAgICAgICB9O1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgMTgwOlxuICAgICAgICBuZXdQb3NpdGlvbiA9IHtcbiAgICAgICAgICB4OiAoc2NyZWVuLndpZHRoIC0gZXZlbnQuY2xpZW50WCkgLSB0aGlzLm9yaWdpbmFsUG9zaXRpb24ueCxcbiAgICAgICAgICB5OiAoc2NyZWVuLmhlaWdodCAtIGV2ZW50LmNsaWVudFkpIC0gdGhpcy5vcmlnaW5hbFBvc2l0aW9uLnlcbiAgICAgICAgfTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIDI3MDpcbiAgICAgICAgbmV3UG9zaXRpb24gPSB7XG4gICAgICAgICAgeDogKHNjcmVlbi5oZWlnaHQgLSBldmVudC5jbGllbnRZKSAtIHRoaXMub3JpZ2luYWxQb3NpdGlvbi54LFxuICAgICAgICAgIHk6IGV2ZW50LmNsaWVudFggLSB0aGlzLm9yaWdpbmFsUG9zaXRpb24ueVxuICAgICAgICB9O1xuICAgICAgICBicmVhaztcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIG5ld1Bvc2l0aW9uID0ge1xuICAgICAgICAgIHg6IGV2ZW50LmNsaWVudFggLSB0aGlzLm9yaWdpbmFsUG9zaXRpb24ueCxcbiAgICAgICAgICB5OiBldmVudC5jbGllbnRZIC0gdGhpcy5vcmlnaW5hbFBvc2l0aW9uLnlcbiAgICAgICAgfTtcbiAgICB9XG4gICAgcmV0dXJuIG5ld1Bvc2l0aW9uO1xuICB9XG59XG4iXX0=