ngx-simple-modal
Version:
A simple unopinionated framework to implement simple modal based behaviour in angular (v2+) projects.
157 lines • 18.9 kB
JavaScript
import * as tslib_1 from "tslib";
import { Directive, AfterViewInit, OnDestroy, Input, Output, ElementRef, NgZone, EventEmitter, Renderer2, OnChanges } from '@angular/core';
import { Subject, fromEvent } from 'rxjs';
import { filter, switchMap, map, takeUntil } from 'rxjs/operators';
var DraggableDirective = /** @class */ (function () {
function DraggableDirective(host, zone, renderer) {
this.host = host;
this.zone = zone;
this.renderer = renderer;
this.dragEnabled = false;
this.dragged = new EventEmitter();
this.delta = { x: 0, y: 0 };
this.offset = { x: 0, y: 0 };
this.enabled = true;
this.destroy$ = new Subject();
}
Object.defineProperty(DraggableDirective.prototype, "dialogDragOffset", {
set: function (offset) {
this.reset(offset);
},
enumerable: true,
configurable: true
});
DraggableDirective.prototype.ngAfterViewInit = function () {
if (!this.enabled) {
return;
}
this.init();
};
DraggableDirective.prototype.ngOnChanges = function () {
if (!this.enabled && this.dragEnabled && this.dragTarget) {
this.enabled = true;
/** determine if the component has been init by the handle variable */
if (this.handle) {
this.renderer.setStyle(this.handle, 'cursor', 'move');
}
else if (this.enabled) {
this.init();
}
}
if (!this.dragEnabled) {
this.enabled = false;
if (this.handle) {
this.renderer.setStyle(this.handle, 'cursor', '');
}
}
};
DraggableDirective.prototype.ngOnDestroy = function () {
this.destroy$.next();
};
DraggableDirective.prototype.reset = function (offset) {
var defaultValues = { x: 0, y: 0 };
this.offset = tslib_1.__assign({}, defaultValues, offset);
this.delta = tslib_1.__assign({}, defaultValues);
this.translate();
};
DraggableDirective.prototype.setupEvents = function () {
var _this = this;
this.zone.runOutsideAngular(function () {
var mousedown$ = fromEvent(_this.handle, 'mousedown');
var mousemove$ = fromEvent(document, 'mousemove');
var mouseup$ = fromEvent(document, 'mouseup');
var mousedrag$ = mousedown$.pipe(filter(function () { return _this.enabled; }), map(function (event) { return ({
startX: event.clientX,
startY: event.clientY
}); }), switchMap(function (_a) {
var startX = _a.startX, startY = _a.startY;
return mousemove$.pipe(map(function (event) {
event.preventDefault();
_this.delta = {
x: event.clientX - startX,
y: event.clientY - startY
};
}), takeUntil(mouseup$));
}), takeUntil(_this.destroy$));
mousedrag$.subscribe(function () {
if (_this.delta.x === 0 && _this.delta.y === 0) {
return;
}
_this.translate();
});
mouseup$
.pipe(filter(function () { return _this.enabled; }),
/** Only emit change if the element has moved */
filter(function () { return _this.delta.x !== 0 || _this.delta.y !== 0; }), takeUntil(_this.destroy$))
.subscribe(function () {
_this.offset.x += _this.delta.x;
_this.offset.y += _this.delta.y;
_this.dragged.emit(_this.offset);
_this.delta = { x: 0, y: 0 };
});
});
};
DraggableDirective.prototype.translate = function () {
var _this = this;
if (this.target) {
this.zone.runOutsideAngular(function () {
requestAnimationFrame(function () {
var transform = "translate(" + (_this.offset.x + _this.delta.x) + "px, " + (_this.offset.y + _this.delta.y) + "px)";
_this.renderer.setStyle(_this.target, 'transform', transform);
});
});
}
};
/**
* Init the directive
*/
DraggableDirective.prototype.init = function () {
if (!this.dragTarget) {
throw new Error('You need to specify the drag target');
}
this.handle =
this.dragHandle instanceof Element
? this.dragHandle
: typeof this.dragHandle === 'string' && this.dragHandle
? document.querySelector(this.dragHandle)
: this.host.nativeElement;
/** add the move cursor */
if (this.handle && this.enabled) {
this.renderer.addClass(this.handle, 'handle');
}
this.target =
this.dragTarget instanceof HTMLElement
? this.dragTarget
: document.querySelector(this.dragTarget);
this.setupEvents();
this.translate();
};
DraggableDirective.ctorParameters = function () { return [
{ type: ElementRef },
{ type: NgZone },
{ type: Renderer2 }
]; };
tslib_1.__decorate([
Input()
], DraggableDirective.prototype, "dragHandle", void 0);
tslib_1.__decorate([
Input()
], DraggableDirective.prototype, "dragTarget", void 0);
tslib_1.__decorate([
Input()
], DraggableDirective.prototype, "dragEnabled", void 0);
tslib_1.__decorate([
Input()
], DraggableDirective.prototype, "dialogDragOffset", null);
tslib_1.__decorate([
Output()
], DraggableDirective.prototype, "dragged", void 0);
DraggableDirective = tslib_1.__decorate([
Directive({
selector: '[dialogDraggable]'
})
], DraggableDirective);
return DraggableDirective;
}());
export { DraggableDirective };
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2ltcGxlLW1vZGFsLWRyYWdnYWJsZS5kaXJlY3RpdmUuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9uZ3gtc2ltcGxlLW1vZGFsLyIsInNvdXJjZXMiOlsic2ltcGxlLW1vZGFsL3NpbXBsZS1tb2RhbC1kcmFnZ2FibGUuZGlyZWN0aXZlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLEVBQ0wsU0FBUyxFQUNULGFBQWEsRUFDYixTQUFTLEVBQ1QsS0FBSyxFQUNMLE1BQU0sRUFDTixVQUFVLEVBQ1YsTUFBTSxFQUNOLFlBQVksRUFDWixTQUFTLEVBQ1QsU0FBUyxFQUNWLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQzFDLE9BQU8sRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLEdBQUcsRUFBRSxTQUFTLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQWVuRTtJQXVCRSw0QkFBb0IsSUFBZ0IsRUFBVSxJQUFZLEVBQVUsUUFBbUI7UUFBbkUsU0FBSSxHQUFKLElBQUksQ0FBWTtRQUFVLFNBQUksR0FBSixJQUFJLENBQVE7UUFBVSxhQUFRLEdBQVIsUUFBUSxDQUFXO1FBakJ2RixnQkFBVyxHQUFHLEtBQUssQ0FBQztRQU1wQixZQUFPLEdBQUcsSUFBSSxZQUFZLEVBQWdCLENBQUM7UUFNbkMsVUFBSyxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7UUFDdkIsV0FBTSxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7UUFDeEIsWUFBTyxHQUFHLElBQUksQ0FBQztRQUNmLGFBQVEsR0FBRyxJQUFJLE9BQU8sRUFBUSxDQUFDO0lBRW1ELENBQUM7SUFmM0Ysc0JBQUksZ0RBQWdCO2FBQXBCLFVBQXFCLE1BQWtCO1lBQ3JDLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFD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LENBQUMsSUFBSSxDQUFDLFVBQW9CLENBQUMsQ0FBQztRQUV4RCxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7UUFFbkIsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO0lBQ25CLENBQUM7O2dCQWxJeUIsVUFBVTtnQkFBZ0IsTUFBTTtnQkFBb0IsU0FBUzs7SUFyQnZGO1FBREMsS0FBSyxFQUFFOzBEQUNzQjtJQUU5QjtRQURDLEtBQUssRUFBRTswREFDcUI7SUFFN0I7UUFEQyxLQUFLLEVBQUU7MkRBQ1k7SUFFcEI7UUFEQyxLQUFLLEVBQUU7OERBR1A7SUFFRDtRQURDLE1BQU0sRUFBRTt1REFDa0M7SUFaaEMsa0JBQWtCO1FBSDlCLFNBQVMsQ0FBQztZQUNULFFBQVEsRUFBRSxtQkFBbUI7U0FDOUIsQ0FBQztPQUNXLGtCQUFrQixDQTBKOUI7SUFBRCx5QkFBQztDQUFBLEFBMUpELElBMEpDO1NBMUpZLGtCQUFrQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIERpcmVjdGl2ZSxcbiAgQWZ0ZXJWaWV3SW5pdCxcbiAgT25EZXN0cm95LFxuICBJbnB1dCxcbiAgT3V0cHV0LFxuICBFbGVtZW50UmVmLFxuICBOZ1pvbmUsXG4gIEV2ZW50RW1pdHRlcixcbiAgUmVuZGVyZXIyLFxuICBPbkNoYW5nZXNcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBTdWJqZWN0LCBmcm9tRXZlbnQgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IGZpbHRlciwgc3dpdGNoTWFwLCBtYXAsIHRha2VVbnRpbCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcblxuZXhwb3J0IGludGVyZmFjZSBEcmFnZ2VkRXZlbnQge1xuICB4OiBudW1iZXI7XG4gIHk6IG51bWJlcjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBEcmFnT2Zmc2V0IHtcbiAgeD86IG51bWJlcjtcbiAgeT86IG51bWJlcjtcbn1cblxuQERpcmVjdGl2ZSh7XG4gIHNlbGVjdG9yOiAnW2RpYWxvZ0RyYWdnYWJsZV0nXG59KVxuZXhwb3J0IGNsYXNzIERyYWdnYWJsZURpcmVjdGl2ZSBpbXBsZW1lbnRzIEFmdGVyVmlld0luaXQsIE9uQ2hhbmdlcywgT25EZXN0cm95IHtcbiAgQElucHV0KClcbiAgZHJhZ0hhbmRsZT86IHN0cmluZyB8IEVsZW1lbnQ7XG4gIEBJbnB1dCgpXG4gIGRyYWdUYXJnZXQ6IHN0cmluZyB8IEVsZW1lbnQ7XG4gIEBJbnB1dCgpXG4gIGRyYWdFbmFibGVkID0gZmFsc2U7XG4gIEBJbnB1dCgpXG4gIHNldCBkaWFsb2dEcmFnT2Zmc2V0KG9mZnNldDogRHJhZ09mZnNldCkge1xuICAgIHRoaXMucmVzZXQob2Zmc2V0KTtcbiAgfVxuICBAT3V0cHV0KClcbiAgZHJhZ2dlZCA9IG5ldyBFdmVudEVtaXR0ZXI8RHJhZ2dlZEV2ZW50PigpO1xuXG4gIC8qKiBFbGVtZW50IHRvIGJlIGRyYWdnZWQgKi9cbiAgcHJpdmF0ZSB0YXJnZXQ6IEhUTUxFbGVtZW50O1xuICAvKiogRHJhZyBoYW5kbGUgKi9cbiAgcHJpdmF0ZSBoYW5kbGU6IEVsZW1lbnQ7XG4gIHByaXZhdGUgZGVsdGEgPSB7IHg6IDAsIHk6IDAgfTtcbiAgcHJpdmF0ZSBvZmZzZXQgPSB7IHg6IDAsIHk6IDAgfTtcbiAgcHJpdmF0ZSBlbmFibGVkID0gdHJ1ZTtcbiAgcHJpdmF0ZSBkZXN0cm95JCA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSBob3N0OiBFbGVtZW50UmVmLCBwcml2YXRlIHpvbmU6IE5nWm9uZSwgcHJpdmF0ZSByZW5kZXJlcjogUmVuZGVyZXIyKSB7fVxuXG4gIHB1YmxpYyBuZ0FmdGVyVmlld0luaXQoKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmVuYWJsZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLmluaXQoKTtcbiAgfVxuXG4gIHB1YmxpYyBuZ09uQ2hhbmdlcygpIHtcbiAgICBpZiAoIXRoaXMuZW5hYmxlZCAmJiB0aGlzLmRyYWdFbmFibGVkICYmIHRoaXMuZHJhZ1RhcmdldCkge1xuICAgICAgdGhpcy5lbmFibGVkID0gdHJ1ZTtcbiAgICAgIC8qKiBkZXRlcm1pbmUgaWYgdGhlIGNvbXBvbmVudCBoYXMgYmVlbiBpbml0IGJ5IHRoZSBoYW5kbGUgdmFyaWFibGUgKi9cbiAgICAgIGlmICh0aGlzLmhhbmRsZSkge1xuICAgICAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKHRoaXMuaGFuZGxlLCAnY3Vyc29yJywgJ21vdmUnKTtcbiAgICAgIH0gZWxzZSBpZiAodGhpcy5lbmFibGVkKSB7XG4gICAgICAgIHRoaXMuaW5pdCgpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICghdGhpcy5kcmFnRW5hYmxlZCkge1xuICAgICAgdGhpcy5lbmFibGVkID0gZmFsc2U7XG4gICAgICBpZiAodGhpcy5oYW5kbGUpIHtcbiAgICAgICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZSh0aGlzLmhhbmRsZSwgJ2N1cnNvcicsICcnKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwdWJsaWMgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgdGhpcy5kZXN0cm95JC5uZXh0KCk7XG4gIH1cblxuICByZXNldChvZmZzZXQ/OiBEcmFnT2Zmc2V0KSB7XG4gICAgY29uc3QgZGVmYXVsdFZhbHVlcyA9IHsgeDogMCwgeTogMCB9O1xuICAgIHRoaXMub2Zmc2V0ID0geyAuLi5kZWZhdWx0VmFsdWVzLCAuLi5vZmZzZXQgfTtcbiAgICB0aGlzLmRlbHRhID0geyAuLi5kZWZhdWx0VmFsdWVzIH07XG4gICAgdGhpcy50cmFuc2xhdGUoKTtcbiAgfVxuXG4gIHByaXZhdGUgc2V0dXBFdmVudHMoKSB7XG4gICAgdGhpcy56b25lLnJ1bk91dHNpZGVBbmd1bGFyKCgpID0+IHtcbiAgICAgIGNvbnN0IG1vdXNlZG93biQgPSBmcm9tRXZlbnQ8TW91c2VFdmVudD4odGhpcy5oYW5kbGUsICdtb3VzZWRvd24nKTtcbiAgICAgIGNvbnN0IG1vdXNlbW92ZSQgPSBmcm9tRXZlbnQ8TW91c2VFdmVudD4oZG9jdW1lbnQsICdtb3VzZW1vdmUnKTtcbiAgICAgIGNvbnN0IG1vdXNldXAkID0gZnJvbUV2ZW50PE1vdXNlRXZlbnQ+KGRvY3VtZW50LCAnbW91c2V1cCcpO1xuXG4gICAgICBjb25zdCBtb3VzZWRyYWckID0gbW91c2Vkb3duJC5waXBlKFxuICAgICAgICBmaWx0ZXIoKCkgPT4gdGhpcy5lbmFibGVkKSxcbiAgICAgICAgbWFwKGV2ZW50ID0+ICh7XG4gICAgICAgICAgc3RhcnRYOiBldmVudC5jbGllbnRYLFxuICAgICAgICAgIHN0YXJ0WTogZXZlbnQuY2xpZW50WVxuICAgICAgICB9KSksXG4gICAgICAgIHN3aXRjaE1hcCgoeyBzdGFydFgsIHN0YXJ0WSB9KSA9PlxuICAgICAgICAgIG1vdXNlbW92ZSQucGlwZShcbiAgICAgICAgICAgIG1hcChldmVudCA9PiB7XG4gICAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICAgIHRoaXMuZGVsdGEgPSB7XG4gICAgICAgICAgICAgICAgeDogZXZlbnQuY2xpZW50WCAtIHN0YXJ0WCxcbiAgICAgICAgICAgICAgICB5OiBldmVudC5jbGllbnRZIC0gc3RhcnRZXG4gICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIHRha2VVbnRpbChtb3VzZXVwJClcbiAgICAgICAgICApXG4gICAgICAgICksXG4gICAgICAgIHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKVxuICAgICAgKTtcblxuICAgICAgbW91c2VkcmFnJC5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICBpZiAodGhpcy5kZWx0YS54ID09PSAwICYmIHRoaXMuZGVsdGEueSA9PT0gMCkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMudHJhbnNsYXRlKCk7XG4gICAgICB9KTtcblxuICAgICAgbW91c2V1cCRcbiAgICAgICAgLnBpcGUoXG4gICAgICAgICAgZmlsdGVyKCgpID0+IHRoaXMuZW5hYmxlZCksXG4gICAgICAgICAgLyoqIE9ubHkgZW1pdCBjaGFuZ2UgaWYgdGhlIGVsZW1lbnQgaGFzIG1vdmVkICovXG4gICAgICAgICAgZmlsdGVyKCgpID0+IHRoaXMuZGVsdGEueCAhPT0gMCB8fCB0aGlzLmRlbHRhLnkgIT09IDApLFxuICAgICAgICAgIHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKVxuICAgICAgICApXG4gICAgICAgIC5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgIHRoaXMub2Zmc2V0LnggKz0gdGhpcy5kZWx0YS54O1xuICAgICAgICAgIHRoaXMub2Zmc2V0LnkgKz0gdGhpcy5kZWx0YS55O1xuICAgICAgICAgIHRoaXMuZHJhZ2dlZC5lbWl0KHRoaXMub2Zmc2V0KTtcbiAgICAgICAgICB0aGlzLmRlbHRhID0geyB4OiAwLCB5OiAwIH07XG4gICAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSB0cmFuc2xhdGUoKSB7XG4gICAgaWYgKHRoaXMudGFyZ2V0KSB7XG4gICAgICB0aGlzLnpvbmUucnVuT3V0c2lkZUFuZ3VsYXIoKCkgPT4ge1xuICAgICAgICByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT4ge1xuICAgICAgICAgIGNvbnN0IHRyYW5zZm9ybSA9IGB0cmFuc2xhdGUoJHt0aGlzLm9mZnNldC54ICsgdGhpcy5kZWx0YS54fXB4LCAke3RoaXMub2Zmc2V0LnkgKyB0aGlzLmRlbHRhLnl9cHgpYDtcbiAgICAgICAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKHRoaXMudGFyZ2V0LCAndHJhbnNmb3JtJywgdHJhbnNmb3JtKTtcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogSW5pdCB0aGUgZGlyZWN0aXZlXG4gICAqL1xuICBwcml2YXRlIGluaXQoKSB7XG4gICAgaWYgKCF0aGlzLmRyYWdUYXJnZXQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignWW91IG5lZWQgdG8gc3BlY2lmeSB0aGUgZHJhZyB0YXJnZXQnKTtcbiAgICB9XG5cbiAgICB0aGlzLmhhbmRsZSA9XG4gICAgICB0aGlzLmRyYWdIYW5kbGUgaW5zdGFuY2VvZiBFbGVtZW50XG4gICAgICAgID8gdGhpcy5kcmFnSGFuZGxlXG4gICAgICAgIDogdHlwZW9mIHRoaXMuZHJhZ0hhbmRsZSA9PT0gJ3N0cmluZycgJiYgdGhpcy5kcmFnSGFuZGxlXG4gICAgICAgID8gZG9jdW1lbnQucXVlcnlTZWxlY3Rvcih0aGlzLmRyYWdIYW5kbGUgYXMgc3RyaW5nKVxuICAgICAgICA6IHRoaXMuaG9zdC5uYXRpdmVFbGVtZW50O1xuXG4gICAgLyoqIGFkZCB0aGUgbW92ZSBjdXJzb3IgKi9cbiAgICBpZiAodGhpcy5oYW5kbGUgJiYgdGhpcy5lbmFibGVkKSB7XG4gICAgICB0aGlzLnJlbmRlcmVyLmFkZENsYXNzKHRoaXMuaGFuZGxlLCAnaGFuZGxlJyk7XG4gICAgfVxuXG4gICAgdGhpcy50YXJnZXQgPVxuICAgICAgdGhpcy5kcmFnVGFyZ2V0IGluc3RhbmNlb2YgSFRNTEVsZW1lbnRcbiAgICAgICAgPyB0aGlzLmRyYWdUYXJnZXRcbiAgICAgICAgOiBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKHRoaXMuZHJhZ1RhcmdldCBhcyBzdHJpbmcpO1xuXG4gICAgdGhpcy5zZXR1cEV2ZW50cygpO1xuXG4gICAgdGhpcy50cmFuc2xhdGUoKTtcbiAgfVxufVxuIl19