UNPKG

@looorent/ngx-simple-modal

Version:

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

149 lines 18.5 kB
import { Directive, Input, Output, EventEmitter } from '@angular/core'; import { Subject, fromEvent } from 'rxjs'; import { filter, switchMap, map, takeUntil } from 'rxjs/operators'; import * as i0 from "@angular/core"; class DraggableDirective { host; zone; renderer; dragHandle; dragTarget; dragEnabled = false; set dialogDragOffset(offset) { this.reset(offset); } dragged = new EventEmitter(); /** Element to be dragged */ target; /** Drag handle */ handle; delta = { x: 0, y: 0 }; offset = { x: 0, y: 0 }; enabled = true; destroy$ = new Subject(); constructor(host, zone, renderer) { this.host = host; this.zone = zone; this.renderer = renderer; } 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 = { ...defaultValues, ...offset }; this.delta = { ...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(); } static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.0.3", ngImport: i0, type: DraggableDirective, deps: [{ token: i0.ElementRef }, { token: i0.NgZone }, { token: i0.Renderer2 }], target: i0.ɵɵFactoryTarget.Directive }); static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "16.0.3", type: DraggableDirective, selector: "[dialogDraggable]", inputs: { dragHandle: "dragHandle", dragTarget: "dragTarget", dragEnabled: "dragEnabled", dialogDragOffset: "dialogDragOffset" }, outputs: { dragged: "dragged" }, usesOnChanges: true, ngImport: i0 }); } export { DraggableDirective }; i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.0.3", ngImport: i0, type: DraggableDirective, decorators: [{ type: Directive, args: [{ selector: '[dialogDraggable]' }] }], ctorParameters: function () { return [{ type: i0.ElementRef }, { type: i0.NgZone }, { type: i0.Renderer2 }]; }, propDecorators: { dragHandle: [{ type: Input }], dragTarget: [{ type: Input }], dragEnabled: [{ type: Input }], dialogDragOffset: [{ type: Input }], dragged: [{ type: Output }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2ltcGxlLW1vZGFsLWRyYWdnYWJsZS5kaXJlY3RpdmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvc2ltcGxlLW1vZGFsL3NpbXBsZS1tb2RhbC1kcmFnZ2FibGUuZGlyZWN0aXZlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCxTQUFTLEVBR1QsS0FBSyxFQUNMLE1BQU0sRUFHTixZQUFZLEVBR2IsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDMUMsT0FBTyxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUUsR0FBRyxFQUFFLFNBQVMsRUFBRSxNQUFNLGdCQUFnQixDQUFDOztBQVluRSxNQUdhLGtCQUFrQjtJQXVCVDtJQUEwQjtJQUFzQjtJQXJCcEUsVUFBVSxDQUFvQjtJQUU5QixVQUFVLENBQW1CO0lBRTdCLFdBQVcsR0FBRyxLQUFLLENBQUM7SUFDcEIsSUFDSSxnQkFBZ0IsQ0FBQyxNQUFrQjtRQUNyQyxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQ3JCLENBQUM7SUFFRCxPQUFPLEdBQUcsSUFBSSxZQUFZLEVBQWdCLENBQUM7SUFFM0MsNEJBQTRCO0lBQ3BCLE1BQU0sQ0FBYztJQUM1QixrQkFBa0I7SUFDVixNQUFNLENBQVU7SUFDaEIsS0FBSyxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7SUFDdkIsTUFBTSxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7SUFDeEIsT0FBTyxHQUFHLElBQUksQ0FBQztJQUNmLFFBQVEsR0FBRyxJQUFJLE9BQU8sRUFBUSxDQUFDO0lBRXZDLFlBQW9CLElBQWdCLEVBQVUsSUFBWSxFQUFVLFFBQW1CO1FBQW5FLFNBQUksR0FBSixJQUFJLENBQVk7UUFB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LGFBQWEsQ0FBQyxJQUFJLENBQUMsVUFBb0IsQ0FBQyxDQUFDO1FBRXhELElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUVuQixJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7SUFDbkIsQ0FBQzt1R0F6SlUsa0JBQWtCOzJGQUFsQixrQkFBa0I7O1NBQWxCLGtCQUFrQjsyRkFBbEIsa0JBQWtCO2tCQUg5QixTQUFTO21CQUFDO29CQUNULFFBQVEsRUFBRSxtQkFBbUI7aUJBQzlCOzhJQUdDLFVBQVU7c0JBRFQsS0FBSztnQkFHTixVQUFVO3NCQURULEtBQUs7Z0JBR04sV0FBVztzQkFEVixLQUFLO2dCQUdGLGdCQUFnQjtzQkFEbkIsS0FBSztnQkFLTixPQUFPO3NCQUROLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBEaXJlY3RpdmUsXG4gIEFmdGVyVmlld0luaXQsXG4gIE9uRGVzdHJveSxcbiAgSW5wdXQsXG4gIE91dHB1dCxcbiAgRWxlbWVudFJlZixcbiAgTmdab25lLFxuICBFdmVudEVtaXR0ZXIsXG4gIFJlbmRlcmVyMixcbiAgT25DaGFuZ2VzXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgU3ViamVjdCwgZnJvbUV2ZW50IH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBmaWx0ZXIsIHN3aXRjaE1hcCwgbWFwLCB0YWtlVW50aWwgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgRHJhZ2dlZEV2ZW50IHtcbiAgeDogbnVtYmVyO1xuICB5OiBudW1iZXI7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRHJhZ09mZnNldCB7XG4gIHg/OiBudW1iZXI7XG4gIHk/OiBudW1iZXI7XG59XG5cbkBEaXJlY3RpdmUoe1xuICBzZWxlY3RvcjogJ1tkaWFsb2dEcmFnZ2FibGVdJ1xufSlcbmV4cG9ydCBjbGFzcyBEcmFnZ2FibGVEaXJlY3RpdmUgaW1wbGVtZW50cyBBZnRlclZpZXdJbml0LCBPbkNoYW5nZXMsIE9uRGVzdHJveSB7XG4gIEBJbnB1dCgpXG4gIGRyYWdIYW5kbGU/OiBzdHJpbmcgfCBFbGVtZW50O1xuICBASW5wdXQoKVxuICBkcmFnVGFyZ2V0OiBzdHJpbmcgfCBFbGVtZW50O1xuICBASW5wdXQoKVxuICBkcmFnRW5hYmxlZCA9IGZhbHNlO1xuICBASW5wdXQoKVxuICBzZXQgZGlhbG9nRHJhZ09mZnNldChvZmZzZXQ6IERyYWdPZmZzZXQpIHtcbiAgICB0aGlzLnJlc2V0KG9mZnNldCk7XG4gIH1cbiAgQE91dHB1dCgpXG4gIGRyYWdnZWQgPSBuZXcgRXZlbnRFbWl0dGVyPERyYWdnZWRFdmVudD4oKTtcblxuICAvKiogRWxlbWVudCB0byBiZSBkcmFnZ2VkICovXG4gIHByaXZhdGUgdGFyZ2V0OiBIVE1MRWxlbWVudDtcbiAgLyoqIERyYWcgaGFuZGxlICovXG4gIHByaXZhdGUgaGFuZGxlOiBFbGVtZW50O1xuICBwcml2YXRlIGRlbHRhID0geyB4OiAwLCB5OiAwIH07XG4gIHByaXZhdGUgb2Zmc2V0ID0geyB4OiAwLCB5OiAwIH07XG4gIHByaXZhdGUgZW5hYmxlZCA9IHRydWU7XG4gIHByaXZhdGUgZGVzdHJveSQgPSBuZXcgU3ViamVjdDx2b2lkPigpO1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgaG9zdDogRWxlbWVudFJlZiwgcHJpdmF0ZSB6b25lOiBOZ1pvbmUsIHByaXZhdGUgcmVuZGVyZXI6IFJlbmRlcmVyMikge31cblxuICBwdWJsaWMgbmdBZnRlclZpZXdJbml0KCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5lbmFibGVkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5pbml0KCk7XG4gIH1cblxuICBwdWJsaWMgbmdPbkNoYW5nZXMoKSB7XG4gICAgaWYgKCF0aGlzLmVuYWJsZWQgJiYgdGhpcy5kcmFnRW5hYmxlZCAmJiB0aGlzLmRyYWdUYXJnZXQpIHtcbiAgICAgIHRoaXMuZW5hYmxlZCA9IHRydWU7XG4gICAgICAvKiogZGV0ZXJtaW5lIGlmIHRoZSBjb21wb25lbnQgaGFzIGJlZW4gaW5pdCBieSB0aGUgaGFuZGxlIHZhcmlhYmxlICovXG4gICAgICBpZiAodGhpcy5oYW5kbGUpIHtcbiAgICAgICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZSh0aGlzLmhhbmRsZSwgJ2N1cnNvcicsICdtb3ZlJyk7XG4gICAgICB9IGVsc2UgaWYgKHRoaXMuZW5hYmxlZCkge1xuICAgICAgICB0aGlzLmluaXQoKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoIXRoaXMuZHJhZ0VuYWJsZWQpIHtcbiAgICAgIHRoaXMuZW5hYmxlZCA9IGZhbHNlO1xuICAgICAgaWYgKHRoaXMuaGFuZGxlKSB7XG4gICAgICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUodGhpcy5oYW5kbGUsICdjdXJzb3InLCAnJyk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHVibGljIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIHRoaXMuZGVzdHJveSQubmV4dCgpO1xuICB9XG5cbiAgcmVzZXQob2Zmc2V0PzogRHJhZ09mZnNldCkge1xuICAgIGNvbnN0IGRlZmF1bHRWYWx1ZXMgPSB7IHg6IDAsIHk6IDAgfTtcbiAgICB0aGlzLm9mZnNldCA9IHsgLi4uZGVmYXVsdFZhbHVlcywgLi4ub2Zmc2V0IH07XG4gICAgdGhpcy5kZWx0YSA9IHsgLi4uZGVmYXVsdFZhbHVlcyB9O1xuICAgIHRoaXMudHJhbnNsYXRlKCk7XG4gIH1cblxuICBwcml2YXRlIHNldHVwRXZlbnRzKCkge1xuICAgIHRoaXMuem9uZS5ydW5PdXRzaWRlQW5ndWxhcigoKSA9PiB7XG4gICAgICBjb25zdCBtb3VzZWRvd24kID0gZnJvbUV2ZW50PE1vdXNlRXZlbnQ+KHRoaXMuaGFuZGxlLCAnbW91c2Vkb3duJyk7XG4gICAgICBjb25zdCBtb3VzZW1vdmUkID0gZnJvbUV2ZW50PE1vdXNlRXZlbnQ+KGRvY3VtZW50LCAnbW91c2Vtb3ZlJyk7XG4gICAgICBjb25zdCBtb3VzZXVwJCA9IGZyb21FdmVudDxNb3VzZUV2ZW50Pihkb2N1bWVudCwgJ21vdXNldXAnKTtcblxuICAgICAgY29uc3QgbW91c2VkcmFnJCA9IG1vdXNlZG93biQucGlwZShcbiAgICAgICAgZmlsdGVyKCgpID0+IHRoaXMuZW5hYmxlZCksXG4gICAgICAgIG1hcChldmVudCA9PiAoe1xuICAgICAgICAgIHN0YXJ0WDogZXZlbnQuY2xpZW50WCxcbiAgICAgICAgICBzdGFydFk6IGV2ZW50LmNsaWVudFlcbiAgICAgICAgfSkpLFxuICAgICAgICBzd2l0Y2hNYXAoKHsgc3RhcnRYLCBzdGFydFkgfSkgPT5cbiAgICAgICAgICBtb3VzZW1vdmUkLnBpcGUoXG4gICAgICAgICAgICBtYXAoZXZlbnQgPT4ge1xuICAgICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgICB0aGlzLmRlbHRhID0ge1xuICAgICAgICAgICAgICAgIHg6IGV2ZW50LmNsaWVudFggLSBzdGFydFgsXG4gICAgICAgICAgICAgICAgeTogZXZlbnQuY2xpZW50WSAtIHN0YXJ0WVxuICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfSksXG4gICAgICAgICAgICB0YWtlVW50aWwobW91c2V1cCQpXG4gICAgICAgICAgKVxuICAgICAgICApLFxuICAgICAgICB0YWtlVW50aWwodGhpcy5kZXN0cm95JClcbiAgICAgICk7XG5cbiAgICAgIG1vdXNlZHJhZyQuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgaWYgKHRoaXMuZGVsdGEueCA9PT0gMCAmJiB0aGlzLmRlbHRhLnkgPT09IDApIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnRyYW5zbGF0ZSgpO1xuICAgICAgfSk7XG5cbiAgICAgIG1vdXNldXAkXG4gICAgICAgIC5waXBlKFxuICAgICAgICAgIGZpbHRlcigoKSA9PiB0aGlzLmVuYWJsZWQpLFxuICAgICAgICAgIC8qKiBPbmx5IGVtaXQgY2hhbmdlIGlmIHRoZSBlbGVtZW50IGhhcyBtb3ZlZCAqL1xuICAgICAgICAgIGZpbHRlcigoKSA9PiB0aGlzLmRlbHRhLnggIT09IDAgfHwgdGhpcy5kZWx0YS55ICE9PSAwKSxcbiAgICAgICAgICB0YWtlVW50aWwodGhpcy5kZXN0cm95JClcbiAgICAgICAgKVxuICAgICAgICAuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgICB0aGlzLm9mZnNldC54ICs9IHRoaXMuZGVsdGEueDtcbiAgICAgICAgICB0aGlzLm9mZnNldC55ICs9IHRoaXMuZGVsdGEueTtcbiAgICAgICAgICB0aGlzLmRyYWdnZWQuZW1pdCh0aGlzLm9mZnNldCk7XG4gICAgICAgICAgdGhpcy5kZWx0YSA9IHsgeDogMCwgeTogMCB9O1xuICAgICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgdHJhbnNsYXRlKCkge1xuICAgIGlmICh0aGlzLnRhcmdldCkge1xuICAgICAgdGhpcy56b25lLnJ1bk91dHNpZGVBbmd1bGFyKCgpID0+IHtcbiAgICAgICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHtcbiAgICAgICAgICBjb25zdCB0cmFuc2Zvcm0gPSBgdHJhbnNsYXRlKCR7dGhpcy5vZmZzZXQueCArIHRoaXMuZGVsdGEueH1weCwgJHt0aGlzLm9mZnNldC55ICsgdGhpcy5kZWx0YS55fXB4KWA7XG4gICAgICAgICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZSh0aGlzLnRhcmdldCwgJ3RyYW5zZm9ybScsIHRyYW5zZm9ybSk7XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEluaXQgdGhlIGRpcmVjdGl2ZVxuICAgKi9cbiAgcHJpdmF0ZSBpbml0KCkge1xuICAgIGlmICghdGhpcy5kcmFnVGFyZ2V0KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1lvdSBuZWVkIHRvIHNwZWNpZnkgdGhlIGRyYWcgdGFyZ2V0Jyk7XG4gICAgfVxuXG4gICAgdGhpcy5oYW5kbGUgPVxuICAgICAgdGhpcy5kcmFnSGFuZGxlIGluc3RhbmNlb2YgRWxlbWVudFxuICAgICAgICA/IHRoaXMuZHJhZ0hhbmRsZVxuICAgICAgICA6IHR5cGVvZiB0aGlzLmRyYWdIYW5kbGUgPT09ICdzdHJpbmcnICYmIHRoaXMuZHJhZ0hhbmRsZVxuICAgICAgICA/IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IodGhpcy5kcmFnSGFuZGxlIGFzIHN0cmluZylcbiAgICAgICAgOiB0aGlzLmhvc3QubmF0aXZlRWxlbWVudDtcblxuICAgIC8qKiBhZGQgdGhlIG1vdmUgY3Vyc29yICovXG4gICAgaWYgKHRoaXMuaGFuZGxlICYmIHRoaXMuZW5hYmxlZCkge1xuICAgICAgdGhpcy5yZW5kZXJlci5hZGRDbGFzcyh0aGlzLmhhbmRsZSwgJ2hhbmRsZScpO1xuICAgIH1cblxuICAgIHRoaXMudGFyZ2V0ID1cbiAgICAgIHRoaXMuZHJhZ1RhcmdldCBpbnN0YW5jZW9mIEhUTUxFbGVtZW50XG4gICAgICAgID8gdGhpcy5kcmFnVGFyZ2V0XG4gICAgICAgIDogZG9jdW1lbnQucXVlcnlTZWxlY3Rvcih0aGlzLmRyYWdUYXJnZXQgYXMgc3RyaW5nKTtcblxuICAgIHRoaXMuc2V0dXBFdmVudHMoKTtcblxuICAgIHRoaXMudHJhbnNsYXRlKCk7XG4gIH1cbn1cbiJdfQ==