ng-devui
Version:
DevUI components based on Angular
139 lines • 19.2 kB
JavaScript
import { fromEvent, of, Subscription } from 'rxjs';
import { delay, tap, throttleTime } from 'rxjs/operators';
export class TransformableElement {
get element() {
return this._element;
}
set element(ele) {
this._element = ele;
this.setElementListener();
}
constructor(element, { zoom = 1, turn = 0, translateX = 0, translateY = 0 }) {
this._mouseDown = false;
this._originTranslateX = 0;
this._originTranslateY = 0;
this.MIN_SCALE = 0.2;
this.MAX_SCALE = 2.5;
this.element = element;
this.zoom = zoom;
this.turn = turn;
this.translateX = translateX;
this.translateY = translateY;
this.setElementTransform();
}
setElementListener() {
if (typeof window === 'undefined') {
return;
}
if (this.eventSub) {
this.eventSub.unsubscribe();
}
this.eventSub = new Subscription();
this.eventSub.add(fromEvent(this._element, 'mousewheel').subscribe(($event) => this.mouseZoom($event)));
this.eventSub.add(fromEvent(window, 'mousedown').subscribe(($event) => this.mouseDown($event)));
this.eventSub.add(fromEvent(window, 'mousemove').subscribe(($event) => this.mouseMove($event)));
this.eventSub.add(fromEvent(window, 'mouseup').subscribe(($event) => this.mouseUp($event)));
}
removeElementListener() {
if (this.eventSub) {
this.eventSub.unsubscribe();
}
if (this.zoomSub) {
this.zoomSub.unsubscribe();
}
}
mouseZoom($event) {
if (typeof document === 'undefined') {
return;
}
this.zoomSub = of($event)
.pipe(throttleTime(300), tap((event) => {
const value = -event.wheelDelta || event.deltaY || event.detail;
if (value < 0) {
if (this.zoom === this.MAX_SCALE) {
this.element.style.cursor = 'not-allowed';
return;
}
this.element.style.cursor = 'zoom-in';
document.body.style.cursor = 'zoom-in';
this.zoomIn(0.2);
}
else {
if (this.zoom === this.MIN_SCALE) {
this.element.style.cursor = 'not-allowed';
return;
}
this.element.style.cursor = 'zoom-out';
document.body.style.cursor = 'zoom-out';
this.zoomOut(0.2);
}
}), delay(400))
.subscribe(() => {
this.element.style.cursor = 'grab';
document.body.style.cursor = 'default';
});
}
mouseDown($event) {
if ($event.target !== this.element) {
return;
}
this._mouseDown = true;
this._originMouseX = $event.clientX;
this._originMouseY = $event.clientY;
this._originTranslateX = this.translateX;
this._originTranslateY = this.translateY;
}
mouseMove($event) {
if (this._mouseDown && typeof document !== 'undefined') {
$event.stopPropagation();
$event.preventDefault();
this.translateX = this._originTranslateX + ($event.clientX - this._originMouseX);
this.translateY = this._originTranslateY + ($event.clientY - this._originMouseY);
this.setElementTransform();
document.body.style.cursor = 'grabbing';
this.element.style.cursor = 'grabbing';
}
}
mouseUp($event) {
if (typeof document !== 'undefined') {
this._mouseDown = false;
document.body.style.cursor = 'default';
this.element.style.cursor = 'grab';
}
}
zoomOut(step = 0.25) {
this.zoom = Math.max(this.MIN_SCALE, this.zoom - step);
this.setElementTransform();
return this.zoom === this.MIN_SCALE;
}
zoomIn(step = 0.25) {
this.zoom = Math.min(this.MAX_SCALE, this.zoom + step);
this.setElementTransform();
return this.zoom === this.MAX_SCALE;
}
rotate() {
this.turn -= 0.25;
this.setElementTransform();
}
setOriginalScale() {
this.resetTransformProperties();
this.setElementTransform();
}
setBestScale() {
this.resetTransformProperties();
this.setElementTransform();
}
resetTransformProperties() {
this.zoom = 1;
this.translateX = 0;
this.translateY = 1;
}
setElementTransform(targetParam, zoom = this.zoom, translateX = this.translateX, translateY = this.translateY, turn = this.turn) {
let target = targetParam;
if (!target) {
target = this.element;
}
target.style.transform = `translate(${translateX}px, ${translateY}px) scale(${zoom}) rotate(${turn}turn)`;
}
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhbnNmb3JtYWJsZS1lbGVtZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vZGV2dWkvaW1hZ2UtcHJldmlldy90cmFuc2Zvcm1hYmxlLWVsZW1lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxFQUFFLEVBQUUsWUFBWSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ25ELE9BQU8sRUFBRSxLQUFLLEVBQUUsR0FBRyxFQUFFLFlBQVksRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRTFELE1BQU0sT0FBTyxvQkFBb0I7SUFRL0IsSUFBSSxPQUFPO1FBQ1QsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDO0lBQ3ZCLENBQUM7SUFFRCxJQUFJLE9BQU8sQ0FBQyxHQUFnQjtRQUMxQixJQUFJLENBQUMsUUFBUSxHQUFHLEdBQUcsQ0FBQztRQUNwQixJQUFJLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztJQUM1QixDQUFDO0lBYUQsWUFBWSxPQUFvQixFQUFFLEVBQUUsSUFBSSxHQUFHLENBQUMsRUFBRSxJQUFJLEdBQUcsQ0FBQyxFQUFFLFVBQVUsR0FBRyxDQUFDLEVBQUUsVUFBVSxHQUFHLENBQUMsRUFBRTtRQTFCaEYsZUFBVSxHQUFHLEtBQUssQ0FBQztRQUduQixzQkFBaUIsR0FBRyxDQUFDLENBQUM7UUFDdEIsc0JBQWlCLEdBQUcsQ0FBQyxDQUFDO1FBbUI5QixjQUFTLEdBQUcsR0FBRyxDQUFDO1FBQ2hCLGNBQVMsR0FBRyxHQUFHLENBQUM7UUFHZCxJQUFJLENBQUMsT0FBTyxHQUFHLE9BQU8sQ0FBQztRQUN2QixJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQztRQUNqQixJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQztRQUNqQixJQUFJLENBQUMsVUFBVSxHQUFHLFVBQVUsQ0FBQztRQUM3QixJQUFJLENBQUMsVUFBVSxHQUFHLFVBQVUsQ0FBQztRQUU3QixJQUFJLENBQUMs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IG9mLCBTdWJzY3JpcHRpb24gfSBmcm9tICdyeGpzJztcclxuaW1wb3J0IHsgZGVsYXksIHRhcCwgdGhyb3R0bGVUaW1lIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xyXG5cclxuZXhwb3J0IGNsYXNzIFRyYW5zZm9ybWFibGVFbGVtZW50IHtcclxuICBwcml2YXRlIF9lbGVtZW50OiBIVE1MRWxlbWVudDtcclxuICBwcml2YXRlIF9tb3VzZURvd24gPSBmYWxzZTtcclxuICBwcml2YXRlIF9vcmlnaW5Nb3VzZVg6IG51bWJlcjtcclxuICBwcml2YXRlIF9vcmlnaW5Nb3VzZVk6IG51bWJlcjtcclxuICBwcml2YXRlIF9vcmlnaW5UcmFuc2xhdGVYID0gMDtcclxuICBwcml2YXRlIF9vcmlnaW5UcmFuc2xhdGVZID0gMDtcclxuXHJcbiAgZ2V0IGVsZW1lbnQoKTogSFRNTEVsZW1lbnQge1xyXG4gICAgcmV0dXJuIHRoaXMuX2VsZW1lbnQ7XHJcbiAgfVxyXG5cclxuICBzZXQgZWxlbWVudChlbGU6IEhUTUxFbGVtZW50KSB7XHJcbiAgICB0aGlzLl9lbGVtZW50ID0gZWxlO1xyXG4gICAgdGhpcy5zZXRFbGVtZW50TGlzdGVuZXIoKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgem9vbTogbnVtYmVyO1xyXG4gIHByaXZhdGUgdHVybjogbnVtYmVyOyAvLyB0dXJuXHJcbiAgcHJpdmF0ZSB0cmFuc2xhdGVYOiBudW1iZXI7IC8vIHB4XHJcbiAgcHJpdmF0ZSB0cmFuc2xhdGVZOiBudW1iZXI7IC8vIHB4XHJcblxyXG4gIHByaXZhdGUgZXZlbnRTdWI6IFN1YnNjcmlwdGlvbjtcclxuICBwcml2YXRlIHpvb21TdWI6IFN1YnNjcmlwdGlvbjtcclxuXHJcbiAgTUlOX1NDQUxFID0gMC4yO1xyXG4gIE1BWF9TQ0FMRSA9IDIuNTtcclxuXHJcbiAgY29uc3RydWN0b3IoZWxlbWVudDogSFRNTEVsZW1lbnQsIHsgem9vbSA9IDEsIHR1cm4gPSAwLCB0cmFuc2xhdGVYID0gMCwgdHJhbnNsYXRlWSA9IDAgfSkge1xyXG4gICAgdGhpcy5lbGVtZW50ID0gZWxlbWVudDtcclxuICAgIHRoaXMuem9vbSA9IHpvb207XHJcbiAgICB0aGlzLnR1cm4gPSB0dXJuO1xyXG4gICAgdGhpcy50cmFuc2xhdGVYID0gdHJhbnNsYXRlWDtcclxuICAgIHRoaXMudHJhbnNsYXRlWSA9IHRyYW5zbGF0ZVk7XHJcblxyXG4gICAgdGhpcy5zZXRFbGVtZW50VHJhbnNmb3JtKCk7XHJcbiAgfVxyXG5cclxuICBzZXRFbGVtZW50TGlzdGVuZXIoKSB7XHJcbiAgICBpZiAodHlwZW9mIHdpbmRvdyA9PT0gJ3VuZGVmaW5lZCcpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgaWYgKHRoaXMuZXZlbnRTdWIpIHtcclxuICAgICAgdGhpcy5ldmVudFN1Yi51bnN1YnNjcmliZSgpO1xyXG4gICAgfVxyXG4gICAgdGhpcy5ldmVudFN1YiA9IG5ldyBTdWJzY3JpcHRpb24oKTtcclxuICAgIHRoaXMuZXZlbnRTdWIuYWRkKGZyb21FdmVudCh0aGlzLl9lbGVtZW50LCAnbW91c2V3aGVlbCcpLnN1YnNjcmliZSgoJGV2ZW50KSA9PiB0aGlzLm1vdXNlWm9vbSgkZXZlbnQpKSk7XHJcbiAgICB0aGlzLmV2ZW50U3ViLmFkZChmcm9tRXZlbnQod2luZG93LCAnbW91c2Vkb3duJykuc3Vic2NyaWJlKCgkZXZlbnQpID0+IHRoaXMubW91c2VEb3duKCRldmVudCkpKTtcclxuICAgIHRoaXMuZXZlbnRTdWIuYWRkKGZyb21FdmVudCh3aW5kb3csICdtb3VzZW1vdmUnKS5zdWJzY3JpYmUoKCRldmVudCkgPT4gdGhpcy5tb3VzZU1vdmUoJGV2ZW50KSkpO1xyXG4gICAgdGhpcy5ldmVudFN1Yi5hZGQoZnJvbUV2ZW50KHdpbmRvdywgJ21vdXNldXAnKS5zdWJzY3JpYmUoKCRldmVudCkgPT4gdGhpcy5tb3VzZVVwKCRldmVudCkpKTtcclxuICB9XHJcblxyXG4gIHJlbW92ZUVsZW1lbnRMaXN0ZW5lcigpIHtcclxuICAgIGlmICh0aGlzLmV2ZW50U3ViKSB7XHJcbiAgICAgIHRoaXMuZXZlbnRTdWIudW5zdWJzY3JpYmUoKTtcclxuICAgIH1cclxuICAgIGlmICh0aGlzLnpvb21TdWIpIHtcclxuICAgICAgdGhpcy56b29tU3ViLnVuc3Vic2NyaWJlKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBtb3VzZVpvb20oJGV2ZW50KSB7XHJcbiAgICBpZiAodHlwZW9mIGRvY3VtZW50ID09PSAndW5kZWZpbmVkJykge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICB0aGlzLnpvb21TdWIgPSBvZigkZXZlbnQpXHJcbiAgICAgIC5waXBlKFxyXG4gICAgICAgIHRocm90dGxlVGltZSgzMDApLFxyXG4gICAgICAgIHRhcCgoZXZlbnQpID0+IHtcclxuICAgICAgICAgIGNvbnN0IHZhbHVlID0gLWV2ZW50LndoZWVsRGVsdGEgfHwgZXZlbnQuZGVsdGFZIHx8IGV2ZW50LmRldGFpbDtcclxuICAgICAgICAgIGlmICh2YWx1ZSA8IDApIHtcclxuICAgICAgICAgICAgaWYgKHRoaXMuem9vbSA9PT0gdGhpcy5NQVhfU0NBTEUpIHtcclxuICAgICAgICAgICAgICB0aGlzLmVsZW1lbnQuc3R5bGUuY3Vyc29yID0gJ25vdC1hbGxvd2VkJztcclxuICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdGhpcy5lbGVtZW50LnN0eWxlLmN1cnNvciA9ICd6b29tLWluJztcclxuICAgICAgICAgICAgZG9jdW1lbnQuYm9keS5zdHlsZS5jdXJzb3IgPSAnem9vbS1pbic7XHJcbiAgICAgICAgICAgIHRoaXMuem9vbUluKDAuMik7XHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBpZiAodGhpcy56b29tID09PSB0aGlzLk1JTl9TQ0FMRSkge1xyXG4gICAgICAgICAgICAgIHRoaXMuZWxlbWVudC5zdHlsZS5jdXJzb3IgPSAnbm90LWFsbG93ZWQnO1xyXG4gICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB0aGlzLmVsZW1lbnQuc3R5bGUuY3Vyc29yID0gJ3pvb20tb3V0JztcclxuICAgICAgICAgICAgZG9jdW1lbnQuYm9keS5zdHlsZS5jdXJzb3IgPSAnem9vbS1vdXQnO1xyXG4gICAgICAgICAgICB0aGlzLnpvb21PdXQoMC4yKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9KSxcclxuICAgICAgICBkZWxheSg0MDApXHJcbiAgICAgIClcclxuICAgICAgLnN1YnNjcmliZSgoKSA9PiB7XHJcbiAgICAgICAgdGhpcy5lbGVtZW50LnN0eWxlLmN1cnNvciA9ICdncmFiJztcclxuICAgICAgICBkb2N1bWVudC5ib2R5LnN0eWxlLmN1cnNvciA9ICdkZWZhdWx0JztcclxuICAgICAgfSk7XHJcbiAgfVxyXG5cclxuICBtb3VzZURvd24oJGV2ZW50KSB7XHJcbiAgICBpZiAoJGV2ZW50LnRhcmdldCAhPT0gdGhpcy5lbGVtZW50KSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLl9tb3VzZURvd24gPSB0cnVlO1xyXG4gICAgdGhpcy5fb3JpZ2luTW91c2VYID0gJGV2ZW50LmNsaWVudFg7XHJcbiAgICB0aGlzLl9vcmlnaW5Nb3VzZVkgPSAkZXZlbnQuY2xpZW50WTtcclxuICAgIHRoaXMuX29yaWdpblRyYW5zbGF0ZVggPSB0aGlzLnRyYW5zbGF0ZVg7XHJcbiAgICB0aGlzLl9vcmlnaW5UcmFuc2xhdGVZID0gdGhpcy50cmFuc2xhdGVZO1xyXG4gIH1cclxuXHJcbiAgbW91c2VNb3ZlKCRldmVudCkge1xyXG4gICAgaWYgKHRoaXMuX21vdXNlRG93biAmJiB0eXBlb2YgZG9jdW1lbnQgIT09ICd1bmRlZmluZWQnKSB7XHJcbiAgICAgICRldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcclxuICAgICAgJGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgIHRoaXMudHJhbnNsYXRlWCA9IHRoaXMuX29yaWdpblRyYW5zbGF0ZVggKyAoJGV2ZW50LmNsaWVudFggLSB0aGlzLl9vcmlnaW5Nb3VzZVgpO1xyXG4gICAgICB0aGlzLnRyYW5zbGF0ZVkgPSB0aGlzLl9vcmlnaW5UcmFuc2xhdGVZICsgKCRldmVudC5jbGllbnRZIC0gdGhpcy5fb3JpZ2luTW91c2VZKTtcclxuICAgICAgdGhpcy5zZXRFbGVtZW50VHJhbnNmb3JtKCk7XHJcbiAgICAgIGRvY3VtZW50LmJvZHkuc3R5bGUuY3Vyc29yID0gJ2dyYWJiaW5nJztcclxuICAgICAgdGhpcy5lbGVtZW50LnN0eWxlLmN1cnNvciA9ICdncmFiYmluZyc7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBtb3VzZVVwKCRldmVudCkge1xyXG4gICAgaWYgKHR5cGVvZiBkb2N1bWVudCAhPT0gJ3VuZGVmaW5lZCcpIHtcclxuICAgICAgdGhpcy5fbW91c2VEb3duID0gZmFsc2U7XHJcbiAgICAgIGRvY3VtZW50LmJvZHkuc3R5bGUuY3Vyc29yID0gJ2RlZmF1bHQnO1xyXG4gICAgICB0aGlzLmVsZW1lbnQuc3R5bGUuY3Vyc29yID0gJ2dyYWInO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgem9vbU91dChzdGVwID0gMC4yNSkge1xyXG4gICAgdGhpcy56b29tID0gTWF0aC5tYXgodGhpcy5NSU5fU0NBTEUsIHRoaXMuem9vbSAtIHN0ZXApO1xyXG4gICAgdGhpcy5zZXRFbGVtZW50VHJhbnNmb3JtKCk7XHJcbiAgICByZXR1cm4gdGhpcy56b29tID09PSB0aGlzLk1JTl9TQ0FMRTtcclxuICB9XHJcblxyXG4gIHpvb21JbihzdGVwID0gMC4yNSkge1xyXG4gICAgdGhpcy56b29tID0gTWF0aC5taW4odGhpcy5NQVhfU0NBTEUsIHRoaXMuem9vbSArIHN0ZXApO1xyXG4gICAgdGhpcy5zZXRFbGVtZW50VHJhbnNmb3JtKCk7XHJcbiAgICByZXR1cm4gdGhpcy56b29tID09PSB0aGlzLk1BWF9TQ0FMRTtcclxuICB9XHJcblxyXG4gIHJvdGF0ZSgpIHtcclxuICAgIHRoaXMudHVybiAtPSAwLjI1O1xyXG4gICAgdGhpcy5zZXRFbGVtZW50VHJhbnNmb3JtKCk7XHJcbiAgfVxyXG5cclxuICBzZXRPcmlnaW5hbFNjYWxlKCkge1xyXG4gICAgdGhpcy5yZXNldFRyYW5zZm9ybVByb3BlcnRpZXMoKTtcclxuICAgIHRoaXMuc2V0RWxlbWVudFRyYW5zZm9ybSgpO1xyXG4gIH1cclxuXHJcbiAgc2V0QmVzdFNjYWxlKCkge1xyXG4gICAgdGhpcy5yZXNldFRyYW5zZm9ybVByb3BlcnRpZXMoKTtcclxuICAgIHRoaXMuc2V0RWxlbWVudFRyYW5zZm9ybSgpO1xyXG4gIH1cclxuXHJcbiAgcmVzZXRUcmFuc2Zvcm1Qcm9wZXJ0aWVzKCkge1xyXG4gICAgdGhpcy56b29tID0gMTtcclxuICAgIHRoaXMudHJhbnNsYXRlWCA9IDA7XHJcbiAgICB0aGlzLnRyYW5zbGF0ZVkgPSAxO1xyXG4gIH1cclxuXHJcbiAgc2V0RWxlbWVudFRyYW5zZm9ybSh0YXJnZXRQYXJhbT8sIHpvb20gPSB0aGlzLnpvb20sIHRyYW5zbGF0ZVggPSB0aGlzLnRyYW5zbGF0ZVgsIHRyYW5zbGF0ZVkgPSB0aGlzLnRyYW5zbGF0ZVksIHR1cm4gPSB0aGlzLnR1cm4pIHtcclxuICAgIGxldCB0YXJnZXQgPSB0YXJnZXRQYXJhbTtcclxuICAgIGlmICghdGFyZ2V0KSB7XHJcbiAgICAgIHRhcmdldCA9IHRoaXMuZWxlbWVudDtcclxuICAgIH1cclxuICAgIHRhcmdldC5zdHlsZS50cmFuc2Zvcm0gPSBgdHJhbnNsYXRlKCR7dHJhbnNsYXRlWH1weCwgJHt0cmFuc2xhdGVZfXB4KSBzY2FsZSgke3pvb219KSByb3RhdGUoJHt0dXJufXR1cm4pYDtcclxuICB9XHJcbn1cclxuIl19