UNPKG

ngx-simple-modal

Version:

A simple unopinionated framework to implement simple modal based behaviour in angular (v2+) projects.

147 lines 17.9 kB
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'; let DraggableDirective = class DraggableDirective { constructor(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(); } set dialogDragOffset(offset) { this.reset(offset); } ngAfterViewInit() { if (!this.enabled) { return; } this.init(); } ngOnChanges() { 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', ''); } } } ngOnDestroy() { this.destroy$.next(); } reset(offset) { const defaultValues = { x: 0, y: 0 }; this.offset = Object.assign({}, defaultValues, offset); this.delta = Object.assign({}, defaultValues); this.translate(); } setupEvents() { this.zone.runOutsideAngular(() => { const mousedown$ = fromEvent(this.handle, 'mousedown'); const mousemove$ = fromEvent(document, 'mousemove'); const mouseup$ = fromEvent(document, 'mouseup'); const mousedrag$ = mousedown$.pipe(filter(() => this.enabled), map(event => ({ startX: event.clientX, startY: event.clientY })), switchMap(({ startX, startY }) => mousemove$.pipe(map(event => { event.preventDefault(); this.delta = { x: event.clientX - startX, y: event.clientY - startY }; }), takeUntil(mouseup$))), takeUntil(this.destroy$)); mousedrag$.subscribe(() => { if (this.delta.x === 0 && this.delta.y === 0) { return; } this.translate(); }); mouseup$ .pipe(filter(() => this.enabled), /** Only emit change if the element has moved */ filter(() => this.delta.x !== 0 || this.delta.y !== 0), takeUntil(this.destroy$)) .subscribe(() => { this.offset.x += this.delta.x; this.offset.y += this.delta.y; this.dragged.emit(this.offset); this.delta = { x: 0, y: 0 }; }); }); } translate() { if (this.target) { this.zone.runOutsideAngular(() => { requestAnimationFrame(() => { const 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 */ init() { 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 = () => [ { 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); export { DraggableDirective }; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2ltcGxlLW1vZGFsLWRyYWdnYWJsZS5kaXJlY3RpdmUuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9uZ3gtc2ltcGxlLW1vZGFsLyIsInNvdXJjZXMiOlsic2ltcGxlLW1vZGFsL3NpbXBsZS1tb2RhbC1kcmFnZ2FibGUuZGlyZWN0aXZlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLEVBQ0wsU0FBUyxFQUNULGFBQWEsRUFDYixTQUFTLEVBQ1QsS0FBSyxFQUNMLE1BQU0sRUFDTixVQUFVLEVBQ1YsTUFBTSxFQUNOLFlBQVksRUFDWixTQUFTLEVBQ1QsU0FBUyxFQUNWLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQzFDLE9BQU8sRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLEdBQUcsRUFBRSxTQUFTLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQWVuRSxJQUFhLGtCQUFrQixHQUEvQixNQUFhLGtCQUFrQjtJQXVCN0IsWUFBb0IsSUFBZ0IsRUFBVSxJQUFZLEVBQVUsUUFBbUI7UUFBbkUsU0FBSSxHQUFKLElBQUksQ0FBWTtRQUFVLFNBQUksR0FBSixJQUFJLENBQVE7UUFBVSxhQUFRLEdBQVIsUUFBUSxDQUFXO1FBakJ2RixnQkFBVyxHQUFHLEtBQUssQ0FBQztRQU1wQixZQUFPLEdBQUcsSUFBSSxZQUFZLEVBQWdCLENBQUM7UUFNbkMsVUFBSyxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7UUFDdkIsV0FBTSxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7UUFDeEIsWUFBTyxHQUFHLElBQUksQ0FBQztRQUNmLGFBQVEsR0FBRyxJQUFJLE9BQU8sRUFBUSxDQUFDO0lBRW1ELENBQUM7SUFmM0YsSUFBSSxnQkFBZ0IsQ0FBQyxNQUFrQjtRQUNyQyxJQUFJLENB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LElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUVuQixJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7SUFDbkIsQ0FBQztDQUNGLENBQUE7O1lBbkkyQixVQUFVO1lBQWdCLE1BQU07WUFBb0IsU0FBUzs7QUFyQnZGO0lBREMsS0FBSyxFQUFFO3NEQUNzQjtBQUU5QjtJQURDLEtBQUssRUFBRTtzREFDcUI7QUFFN0I7SUFEQyxLQUFLLEVBQUU7dURBQ1k7QUFFcEI7SUFEQyxLQUFLLEVBQUU7MERBR1A7QUFFRDtJQURDLE1BQU0sRUFBRTttREFDa0M7QUFaaEMsa0JBQWtCO0lBSDlCLFNBQVMsQ0FBQztRQUNULFFBQVEsRUFBRSxtQkFBbUI7S0FDOUIsQ0FBQztHQUNXLGtCQUFrQixDQTBKOUI7U0ExSlksa0JBQWtCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgRGlyZWN0aXZlLFxuICBBZnRlclZpZXdJbml0LFxuICBPbkRlc3Ryb3ksXG4gIElucHV0LFxuICBPdXRwdXQsXG4gIEVsZW1lbnRSZWYsXG4gIE5nWm9uZSxcbiAgRXZlbnRFbWl0dGVyLFxuICBSZW5kZXJlcjIsXG4gIE9uQ2hhbmdlc1xufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IFN1YmplY3QsIGZyb21FdmVudCB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgZmlsdGVyLCBzd2l0Y2hNYXAsIG1hcCwgdGFrZVVudGlsIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuXG5leHBvcnQgaW50ZXJmYWNlIERyYWdnZWRFdmVudCB7XG4gIHg6IG51bWJlcjtcbiAgeTogbnVtYmVyO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIERyYWdPZmZzZXQge1xuICB4PzogbnVtYmVyO1xuICB5PzogbnVtYmVyO1xufVxuXG5ARGlyZWN0aXZlKHtcbiAgc2VsZWN0b3I6ICdbZGlhbG9nRHJhZ2dhYmxlXSdcbn0pXG5leHBvcnQgY2xhc3MgRHJhZ2dhYmxlRGlyZWN0aXZlIGltcGxlbWVudHMgQWZ0ZXJWaWV3SW5pdCwgT25DaGFuZ2VzLCBPbkRlc3Ryb3kge1xuICBASW5wdXQoKVxuICBkcmFnSGFuZGxlPzogc3RyaW5nIHwgRWxlbWVudDtcbiAgQElucHV0KClcbiAgZHJhZ1RhcmdldDogc3RyaW5nIHwgRWxlbWVudDtcbiAgQElucHV0KClcbiAgZHJhZ0VuYWJsZWQgPSBmYWxzZTtcbiAgQElucHV0KClcbiAgc2V0IGRpYWxvZ0RyYWdPZmZzZXQob2Zmc2V0OiBEcmFnT2Zmc2V0KSB7XG4gICAgdGhpcy5yZXNldChvZmZzZXQpO1xuICB9XG4gIEBPdXRwdXQoKVxuICBkcmFnZ2VkID0gbmV3IEV2ZW50RW1pdHRlcjxEcmFnZ2VkRXZlbnQ+KCk7XG5cbiAgLyoqIEVsZW1lbnQgdG8gYmUgZHJhZ2dlZCAqL1xuICBwcml2YXRlIHRhcmdldDogSFRNTEVsZW1lbnQ7XG4gIC8qKiBEcmFnIGhhbmRsZSAqL1xuICBwcml2YXRlIGhhbmRsZTogRWxlbWVudDtcbiAgcHJpdmF0ZSBkZWx0YSA9IHsgeDogMCwgeTogMCB9O1xuICBwcml2YXRlIG9mZnNldCA9IHsgeDogMCwgeTogMCB9O1xuICBwcml2YXRlIGVuYWJsZWQgPSB0cnVlO1xuICBwcml2YXRlIGRlc3Ryb3kkID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIGhvc3Q6IEVsZW1lbnRSZWYsIHByaXZhdGUgem9uZTogTmdab25lLCBwcml2YXRlIHJlbmRlcmVyOiBSZW5kZXJlcjIpIHt9XG5cbiAgcHVibGljIG5nQWZ0ZXJWaWV3SW5pdCgpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuZW5hYmxlZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuaW5pdCgpO1xuICB9XG5cbiAgcHVibGljIG5nT25DaGFuZ2VzKCkge1xuICAgIGlmICghdGhpcy5lbmFibGVkICYmIHRoaXMuZHJhZ0VuYWJsZWQgJiYgdGhpcy5kcmFnVGFyZ2V0KSB7XG4gICAgICB0aGlzLmVuYWJsZWQgPSB0cnVlO1xuICAgICAgLyoqIGRldGVybWluZSBpZiB0aGUgY29tcG9uZW50IGhhcyBiZWVuIGluaXQgYnkgdGhlIGhhbmRsZSB2YXJpYWJsZSAqL1xuICAgICAgaWYgKHRoaXMuaGFuZGxlKSB7XG4gICAgICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUodGhpcy5oYW5kbGUsICdjdXJzb3InLCAnbW92ZScpO1xuICAgICAgfSBlbHNlIGlmICh0aGlzLmVuYWJsZWQpIHtcbiAgICAgICAgdGhpcy5pbml0KCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLmRyYWdFbmFibGVkKSB7XG4gICAgICB0aGlzLmVuYWJsZWQgPSBmYWxzZTtcbiAgICAgIGlmICh0aGlzLmhhbmRsZSkge1xuICAgICAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKHRoaXMuaGFuZGxlLCAnY3Vyc29yJywgJycpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICB0aGlzLmRlc3Ryb3kkLm5leHQoKTtcbiAgfVxuXG4gIHJlc2V0KG9mZnNldD86IERyYWdPZmZzZXQpIHtcbiAgICBjb25zdCBkZWZhdWx0VmFsdWVzID0geyB4OiAwLCB5OiAwIH07XG4gICAgdGhpcy5vZmZzZXQgPSB7IC4uLmRlZmF1bHRWYWx1ZXMsIC4uLm9mZnNldCB9O1xuICAgIHRoaXMuZGVsdGEgPSB7IC4uLmRlZmF1bHRWYWx1ZXMgfTtcbiAgICB0aGlzLnRyYW5zbGF0ZSgpO1xuICB9XG5cbiAgcHJpdmF0ZSBzZXR1cEV2ZW50cygpIHtcbiAgICB0aGlzLnpvbmUucnVuT3V0c2lkZUFuZ3VsYXIoKCkgPT4ge1xuICAgICAgY29uc3QgbW91c2Vkb3duJCA9IGZyb21FdmVudDxNb3VzZUV2ZW50Pih0aGlzLmhhbmRsZSwgJ21vdXNlZG93bicpO1xuICAgICAgY29uc3QgbW91c2Vtb3ZlJCA9IGZyb21FdmVudDxNb3VzZUV2ZW50Pihkb2N1bWVudCwgJ21vdXNlbW92ZScpO1xuICAgICAgY29uc3QgbW91c2V1cCQgPSBmcm9tRXZlbnQ8TW91c2VFdmVudD4oZG9jdW1lbnQsICdtb3VzZXVwJyk7XG5cbiAgICAgIGNvbnN0IG1vdXNlZHJhZyQgPSBtb3VzZWRvd24kLnBpcGUoXG4gICAgICAgIGZpbHRlcigoKSA9PiB0aGlzLmVuYWJsZWQpLFxuICAgICAgICBtYXAoZXZlbnQgPT4gKHtcbiAgICAgICAgICBzdGFydFg6IGV2ZW50LmNsaWVudFgsXG4gICAgICAgICAgc3RhcnRZOiBldmVudC5jbGllbnRZXG4gICAgICAgIH0pKSxcbiAgICAgICAgc3dpdGNoTWFwKCh7IHN0YXJ0WCwgc3RhcnRZIH0pID0+XG4gICAgICAgICAgbW91c2Vtb3ZlJC5waXBlKFxuICAgICAgICAgICAgbWFwKGV2ZW50ID0+IHtcbiAgICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgICAgdGhpcy5kZWx0YSA9IHtcbiAgICAgICAgICAgICAgICB4OiBldmVudC5jbGllbnRYIC0gc3RhcnRYLFxuICAgICAgICAgICAgICAgIHk6IGV2ZW50LmNsaWVudFkgLSBzdGFydFlcbiAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgdGFrZVVudGlsKG1vdXNldXAkKVxuICAgICAgICAgIClcbiAgICAgICAgKSxcbiAgICAgICAgdGFrZVVudGlsKHRoaXMuZGVzdHJveSQpXG4gICAgICApO1xuXG4gICAgICBtb3VzZWRyYWckLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgIGlmICh0aGlzLmRlbHRhLnggPT09IDAgJiYgdGhpcy5kZWx0YS55ID09PSAwKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy50cmFuc2xhdGUoKTtcbiAgICAgIH0pO1xuXG4gICAgICBtb3VzZXVwJFxuICAgICAgICAucGlwZShcbiAgICAgICAgICBmaWx0ZXIoKCkgPT4gdGhpcy5lbmFibGVkKSxcbiAgICAgICAgICAvKiogT25seSBlbWl0IGNoYW5nZSBpZiB0aGUgZWxlbWVudCBoYXMgbW92ZWQgKi9cbiAgICAgICAgICBmaWx0ZXIoKCkgPT4gdGhpcy5kZWx0YS54ICE9PSAwIHx8IHRoaXMuZGVsdGEueSAhPT0gMCksXG4gICAgICAgICAgdGFrZVVudGlsKHRoaXMuZGVzdHJveSQpXG4gICAgICAgIClcbiAgICAgICAgLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgdGhpcy5vZmZzZXQueCArPSB0aGlzLmRlbHRhLng7XG4gICAgICAgICAgdGhpcy5vZmZzZXQueSArPSB0aGlzLmRlbHRhLnk7XG4gICAgICAgICAgdGhpcy5kcmFnZ2VkLmVtaXQodGhpcy5vZmZzZXQpO1xuICAgICAgICAgIHRoaXMuZGVsdGEgPSB7IHg6IDAsIHk6IDAgfTtcbiAgICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIHRyYW5zbGF0ZSgpIHtcbiAgICBpZiAodGhpcy50YXJnZXQpIHtcbiAgICAgIHRoaXMuem9uZS5ydW5PdXRzaWRlQW5ndWxhcigoKSA9PiB7XG4gICAgICAgIHJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB7XG4gICAgICAgICAgY29uc3QgdHJhbnNmb3JtID0gYHRyYW5zbGF0ZSgke3RoaXMub2Zmc2V0LnggKyB0aGlzLmRlbHRhLnh9cHgsICR7dGhpcy5vZmZzZXQueSArIHRoaXMuZGVsdGEueX1weClgO1xuICAgICAgICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUodGhpcy50YXJnZXQsICd0cmFuc2Zvcm0nLCB0cmFuc2Zvcm0pO1xuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBJbml0IHRoZSBkaXJlY3RpdmVcbiAgICovXG4gIHByaXZhdGUgaW5pdCgpIHtcbiAgICBpZiAoIXRoaXMuZHJhZ1RhcmdldCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdZb3UgbmVlZCB0byBzcGVjaWZ5IHRoZSBkcmFnIHRhcmdldCcpO1xuICAgIH1cblxuICAgIHRoaXMuaGFuZGxlID1cbiAgICAgIHRoaXMuZHJhZ0hhbmRsZSBpbnN0YW5jZW9mIEVsZW1lbnRcbiAgICAgICAgPyB0aGlzLmRyYWdIYW5kbGVcbiAgICAgICAgOiB0eXBlb2YgdGhpcy5kcmFnSGFuZGxlID09PSAnc3RyaW5nJyAmJiB0aGlzLmRyYWdIYW5kbGVcbiAgICAgICAgPyBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKHRoaXMuZHJhZ0hhbmRsZSBhcyBzdHJpbmcpXG4gICAgICAgIDogdGhpcy5ob3N0Lm5hdGl2ZUVsZW1lbnQ7XG5cbiAgICAvKiogYWRkIHRoZSBtb3ZlIGN1cnNvciAqL1xuICAgIGlmICh0aGlzLmhhbmRsZSAmJiB0aGlzLmVuYWJsZWQpIHtcbiAgICAgIHRoaXMucmVuZGVyZXIuYWRkQ2xhc3ModGhpcy5oYW5kbGUsICdoYW5kbGUnKTtcbiAgICB9XG5cbiAgICB0aGlzLnRhcmdldCA9XG4gICAgICB0aGlzLmRyYWdUYXJnZXQgaW5zdGFuY2VvZiBIVE1MRWxlbWVudFxuICAgICAgICA/IHRoaXMuZHJhZ1RhcmdldFxuICAgICAgICA6IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IodGhpcy5kcmFnVGFyZ2V0IGFzIHN0cmluZyk7XG5cbiAgICB0aGlzLnNldHVwRXZlbnRzKCk7XG5cbiAgICB0aGlzLnRyYW5zbGF0ZSgpO1xuICB9XG59XG4iXX0=