@looorent/ngx-simple-modal
Version:
A simple unopinionated framework to implement simple modal based behaviour in angular (v2+) projects.
149 lines • 18.5 kB
JavaScript
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==