UNPKG

ng-zorro-antd

Version:

An enterprise-class UI components based on Ant Design and Angular

96 lines 15.9 kB
/** * Use of this source code is governed by an MIT-style license that can be * found in the LICENSE file at https://github.com/NG-ZORRO/ng-zorro-antd/blob/master/LICENSE */ import { normalizePassiveListenerOptions } from '@angular/cdk/platform'; import { ChangeDetectionStrategy, Component, EventEmitter, HostListener, Input, Output } from '@angular/core'; import { fromEvent, merge } from 'rxjs'; import { takeUntil } from 'rxjs/operators'; import { NzDestroyService } from 'ng-zorro-antd/core/services'; import * as i0 from "@angular/core"; import * as i1 from "./resizable.service"; import * as i2 from "ng-zorro-antd/core/services"; export class NzResizeHandleMouseDownEvent { constructor(direction, mouseEvent) { this.direction = direction; this.mouseEvent = mouseEvent; } } const passiveEventListenerOptions = normalizePassiveListenerOptions({ passive: true }); export class NzResizeHandleComponent { constructor(ngZone, nzResizableService, renderer, host, destroy$) { this.ngZone = ngZone; this.nzResizableService = nzResizableService; this.renderer = renderer; this.host = host; this.destroy$ = destroy$; this.nzDirection = 'bottomRight'; this.nzCursorType = 'window'; this.nzMouseDown = new EventEmitter(); } ngOnInit() { this.nzResizableService.mouseEnteredOutsideAngular$.pipe(takeUntil(this.destroy$)).subscribe(entered => { if (entered) { this.renderer.addClass(this.host.nativeElement, 'nz-resizable-handle-box-hover'); } else { this.renderer.removeClass(this.host.nativeElement, 'nz-resizable-handle-box-hover'); } }); this.ngZone.runOutsideAngular(() => { // Note: since Chrome 56 defaults document level `touchstart` listener to passive. // The element `touchstart` listener is not passive by default // We never call `preventDefault()` on it, so we're safe making it passive too. merge(fromEvent(this.host.nativeElement, 'mousedown', passiveEventListenerOptions), fromEvent(this.host.nativeElement, 'touchstart', passiveEventListenerOptions)) .pipe(takeUntil(this.destroy$)) .subscribe((event) => { this.nzResizableService.handleMouseDownOutsideAngular$.next(new NzResizeHandleMouseDownEvent(this.nzDirection, event)); }); }); } onPointerDown(event) { event.target.setPointerCapture(event.pointerId); } onPointerUp(event) { event.target.releasePointerCapture(event.pointerId); } static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.1.2", ngImport: i0, type: NzResizeHandleComponent, deps: [{ token: i0.NgZone }, { token: i1.NzResizableService }, { token: i0.Renderer2 }, { token: i0.ElementRef }, { token: i2.NzDestroyService }], target: i0.ɵɵFactoryTarget.Component }); } static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.1.2", type: NzResizeHandleComponent, isStandalone: true, selector: "nz-resize-handle, [nz-resize-handle]", inputs: { nzDirection: "nzDirection", nzCursorType: "nzCursorType" }, outputs: { nzMouseDown: "nzMouseDown" }, host: { listeners: { "pointerdown": "onPointerDown($event)", "pointerup": "onPointerUp($event)" }, properties: { "class.nz-resizable-handle-top": "nzDirection === 'top'", "class.nz-resizable-handle-right": "nzDirection === 'right'", "class.nz-resizable-handle-bottom": "nzDirection === 'bottom'", "class.nz-resizable-handle-left": "nzDirection === 'left'", "class.nz-resizable-handle-topRight": "nzDirection === 'topRight'", "class.nz-resizable-handle-bottomRight": "nzDirection === 'bottomRight'", "class.nz-resizable-handle-bottomLeft": "nzDirection === 'bottomLeft'", "class.nz-resizable-handle-topLeft": "nzDirection === 'topLeft'", "class.nz-resizable-handle-cursor-type-grid": "nzCursorType === 'grid'", "class.nz-resizable-handle-cursor-type-window": "nzCursorType === 'window'" }, classAttribute: "nz-resizable-handle" }, providers: [NzDestroyService], exportAs: ["nzResizeHandle"], ngImport: i0, template: ` <ng-content></ng-content> `, isInline: true, changeDetection: i0.ChangeDetectionStrategy.OnPush }); } } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.1.2", ngImport: i0, type: NzResizeHandleComponent, decorators: [{ type: Component, args: [{ selector: 'nz-resize-handle, [nz-resize-handle]', exportAs: 'nzResizeHandle', template: ` <ng-content></ng-content> `, changeDetection: ChangeDetectionStrategy.OnPush, host: { class: 'nz-resizable-handle', '[class.nz-resizable-handle-top]': `nzDirection === 'top'`, '[class.nz-resizable-handle-right]': `nzDirection === 'right'`, '[class.nz-resizable-handle-bottom]': `nzDirection === 'bottom'`, '[class.nz-resizable-handle-left]': `nzDirection === 'left'`, '[class.nz-resizable-handle-topRight]': `nzDirection === 'topRight'`, '[class.nz-resizable-handle-bottomRight]': `nzDirection === 'bottomRight'`, '[class.nz-resizable-handle-bottomLeft]': `nzDirection === 'bottomLeft'`, '[class.nz-resizable-handle-topLeft]': `nzDirection === 'topLeft'`, '[class.nz-resizable-handle-cursor-type-grid]': `nzCursorType === 'grid'`, '[class.nz-resizable-handle-cursor-type-window]': `nzCursorType === 'window'` }, providers: [NzDestroyService], standalone: true }] }], ctorParameters: () => [{ type: i0.NgZone }, { type: i1.NzResizableService }, { type: i0.Renderer2 }, { type: i0.ElementRef }, { type: i2.NzDestroyService }], propDecorators: { nzDirection: [{ type: Input }], nzCursorType: [{ type: Input }], nzMouseDown: [{ type: Output }], onPointerDown: [{ type: HostListener, args: ['pointerdown', ['$event']] }], onPointerUp: [{ type: HostListener, args: ['pointerup', ['$event']] }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVzaXplLWhhbmRsZS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9jb21wb25lbnRzL3Jlc2l6YWJsZS9yZXNpemUtaGFuZGxlLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7O0dBR0c7QUFFSCxPQUFPLEVBQUUsK0JBQStCLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUN4RSxPQUFPLEVBQ0wsdUJBQXVCLEVBQ3ZCLFNBQVMsRUFFVCxZQUFZLEVBQ1osWUFBWSxFQUNaLEtBQUssRUFHTCxNQUFNLEVBRVAsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDeEMsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRTNDLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLDZCQUE2QixDQUFDOzs7O0FBZ0IvRCxNQUFNLE9BQU8sNEJBQTRCO0lBQ3ZDLFlBQ1MsU0FBNEIsRUFDNUIsVUFBbUM7UUFEbkMsY0FBUyxHQUFULFNBQVMsQ0FBbUI7UUFDNUIsZUFBVSxHQUFWLFVBQVUsQ0FBeUI7SUFDekMsQ0FBQztDQUNMO0FBRUQsTUFBTSwyQkFBMkIsR0FBNEIsK0JBQStCLENBQUMsRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztBQXVCaEgsTUFBTSxPQUFPLHVCQUF1QjtJQUtsQyxZQUNVLE1BQWMsRUFDZCxrQkFBc0MsRUFDdEMsUUFBbUIsRUFDbkIsSUFBNkIsRUFDN0IsUUFBMEI7UUFKMUIsV0FBTSxHQUFOLE1BQU0sQ0FBUTtRQUNkLHVCQUFrQixHQUFsQixrQkFBa0IsQ0FBb0I7UUFDdEMsYUFBUSxHQUFSLFFBQVEsQ0FBVztRQUNuQixTQUFJLEdBQUosSUFBSSxDQUF5QjtRQUM3QixhQUFRLEdBQVIsUUFBUSxDQUFrQjtRQVQzQixnQkFBVyxHQUFzQixhQUFhLENBQUM7UUFD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LEVBQUUsQ0FBQyxRQUFRLENBQUM7Z0JBTXZDLFdBQVc7c0JBRFYsWUFBWTt1QkFBQyxXQUFXLEVBQUUsQ0FBQyxRQUFRLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlXG4gKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vZ2l0aHViLmNvbS9ORy1aT1JSTy9uZy16b3Jyby1hbnRkL2Jsb2IvbWFzdGVyL0xJQ0VOU0VcbiAqL1xuXG5pbXBvcnQgeyBub3JtYWxpemVQYXNzaXZlTGlzdGVuZXJPcHRpb25zIH0gZnJvbSAnQGFuZ3VsYXIvY2RrL3BsYXRmb3JtJztcbmltcG9ydCB7XG4gIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICBDb21wb25lbnQsXG4gIEVsZW1lbnRSZWYsXG4gIEV2ZW50RW1pdHRlcixcbiAgSG9zdExpc3RlbmVyLFxuICBJbnB1dCxcbiAgTmdab25lLFxuICBPbkluaXQsXG4gIE91dHB1dCxcbiAgUmVuZGVyZXIyXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgZnJvbUV2ZW50LCBtZXJnZSB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgdGFrZVVudGlsIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuXG5pbXBvcnQgeyBOekRlc3Ryb3lTZXJ2aWNlIH0gZnJvbSAnbmctem9ycm8tYW50ZC9jb3JlL3NlcnZpY2VzJztcblxuaW1wb3J0IHsgTnpSZXNpemFibGVTZXJ2aWNlIH0gZnJvbSAnLi9yZXNpemFibGUuc2VydmljZSc7XG5cbmV4cG9ydCB0eXBlIE56Q3Vyc29yVHlwZSA9ICd3aW5kb3cnIHwgJ2dyaWQnO1xuXG5leHBvcnQgdHlwZSBOelJlc2l6ZURpcmVjdGlvbiA9XG4gIHwgJ3RvcCdcbiAgfCAncmlnaHQnXG4gIHwgJ2JvdHRvbSdcbiAgfCAnbGVmdCdcbiAgfCAndG9wUmlnaHQnXG4gIHwgJ2JvdHRvbVJpZ2h0J1xuICB8ICdib3R0b21MZWZ0J1xuICB8ICd0b3BMZWZ0JztcblxuZXhwb3J0IGNsYXNzIE56UmVzaXplSGFuZGxlTW91c2VEb3duRXZlbnQge1xuICBjb25zdHJ1Y3RvcihcbiAgICBwdWJsaWMgZGlyZWN0aW9uOiBOelJlc2l6ZURpcmVjdGlvbixcbiAgICBwdWJsaWMgbW91c2VFdmVudDogTW91c2VFdmVudCB8IFRvdWNoRXZlbnRcbiAgKSB7fVxufVxuXG5jb25zdCBwYXNzaXZlRXZlbnRMaXN0ZW5lck9wdGlvbnMgPSA8QWRkRXZlbnRMaXN0ZW5lck9wdGlvbnM+bm9ybWFsaXplUGFzc2l2ZUxpc3RlbmVyT3B0aW9ucyh7IHBhc3NpdmU6IHRydWUgfSk7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ256LXJlc2l6ZS1oYW5kbGUsIFtuei1yZXNpemUtaGFuZGxlXScsXG4gIGV4cG9ydEFzOiAnbnpSZXNpemVIYW5kbGUnLFxuICB0ZW1wbGF0ZTogYCA8bmctY29udGVudD48L25nLWNvbnRlbnQ+IGAsXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxuICBob3N0OiB7XG4gICAgY2xhc3M6ICduei1yZXNpemFibGUtaGFuZGxlJyxcbiAgICAnW2NsYXNzLm56LXJlc2l6YWJsZS1oYW5kbGUtdG9wXSc6IGBuekRpcmVjdGlvbiA9PT0gJ3RvcCdgLFxuICAgICdbY2xhc3MubnotcmVzaXphYmxlLWhhbmRsZS1yaWdodF0nOiBgbnpEaXJlY3Rpb24gPT09ICdyaWdodCdgLFxuICAgICdbY2xhc3MubnotcmVzaXphYmxlLWhhbmRsZS1ib3R0b21dJzogYG56RGlyZWN0aW9uID09PSAnYm90dG9tJ2AsXG4gICAgJ1tjbGFzcy5uei1yZXNpemFibGUtaGFuZGxlLWxlZnRdJzogYG56RGlyZWN0aW9uID09PSAnbGVmdCdgLFxuICAgICdbY2xhc3MubnotcmVzaXphYmxlLWhhbmRsZS10b3BSaWdodF0nOiBgbnpEaXJlY3Rpb24gPT09ICd0b3BSaWdodCdgLFxuICAgICdbY2xhc3MubnotcmVzaXphYmxlLWhhbmRsZS1ib3R0b21SaWdodF0nOiBgbnpEaXJlY3Rpb24gPT09ICdib3R0b21SaWdodCdgLFxuICAgICdbY2xhc3MubnotcmVzaXphYmxlLWhhbmRsZS1ib3R0b21MZWZ0XSc6IGBuekRpcmVjdGlvbiA9PT0gJ2JvdHRvbUxlZnQnYCxcbiAgICAnW2NsYXNzLm56LXJlc2l6YWJsZS1oYW5kbGUtdG9wTGVmdF0nOiBgbnpEaXJlY3Rpb24gPT09ICd0b3BMZWZ0J2AsXG4gICAgJ1tjbGFzcy5uei1yZXNpemFibGUtaGFuZGxlLWN1cnNvci10eXBlLWdyaWRdJzogYG56Q3Vyc29yVHlwZSA9PT0gJ2dyaWQnYCxcbiAgICAnW2NsYXNzLm56LXJlc2l6YWJsZS1oYW5kbGUtY3Vyc29yLXR5cGUtd2luZG93XSc6IGBuekN1cnNvclR5cGUgPT09ICd3aW5kb3cnYFxuICB9LFxuICBwcm92aWRlcnM6IFtOekRlc3Ryb3lTZXJ2aWNlXSxcbiAgc3RhbmRhbG9uZTogdHJ1ZVxufSlcbmV4cG9ydCBjbGFzcyBOelJlc2l6ZUhhbmRsZUNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XG4gIEBJbnB1dCgpIG56RGlyZWN0aW9uOiBOelJlc2l6ZURpcmVjdGlvbiA9ICdib3R0b21SaWdodCc7XG4gIEBJbnB1dCgpIG56Q3Vyc29yVHlwZTogTnpDdXJzb3JUeXBlID0gJ3dpbmRvdyc7XG4gIEBPdXRwdXQoKSByZWFkb25seSBuek1vdXNlRG93biA9IG5ldyBFdmVudEVtaXR0ZXI8TnpSZXNpemVIYW5kbGVNb3VzZURvd25FdmVudD4oKTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIG5nWm9uZTogTmdab25lLFxuICAgIHByaXZhdGUgbnpSZXNpemFibGVTZXJ2aWNlOiBOelJlc2l6YWJsZVNlcnZpY2UsXG4gICAgcHJpdmF0ZSByZW5kZXJlcjogUmVuZGVyZXIyLFxuICAgIHByaXZhdGUgaG9zdDogRWxlbWVudFJlZjxIVE1MRWxlbWVudD4sXG4gICAgcHJpdmF0ZSBkZXN0cm95JDogTnpEZXN0cm95U2VydmljZVxuICApIHt9XG5cbiAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgdGhpcy5uelJlc2l6YWJsZVNlcnZpY2UubW91c2VFbnRlcmVkT3V0c2lkZUFuZ3VsYXIkLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKS5zdWJzY3JpYmUoZW50ZXJlZCA9PiB7XG4gICAgICBpZiAoZW50ZXJlZCkge1xuICAgICAgICB0aGlzLnJlbmRlcmVyLmFkZENsYXNzKHRoaXMuaG9zdC5uYXRpdmVFbGVtZW50LCAnbnotcmVzaXphYmxlLWhhbmRsZS1ib3gtaG92ZXInKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMucmVuZGVyZXIucmVtb3ZlQ2xhc3ModGhpcy5ob3N0Lm5hdGl2ZUVsZW1lbnQsICduei1yZXNpemFibGUtaGFuZGxlLWJveC1ob3ZlcicpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgdGhpcy5uZ1pvbmUucnVuT3V0c2lkZUFuZ3VsYXIoKCkgPT4ge1xuICAgICAgLy8gTm90ZTogc2luY2UgQ2hyb21lIDU2IGRlZmF1bHRzIGRvY3VtZW50IGxldmVsIGB0b3VjaHN0YXJ0YCBsaXN0ZW5lciB0byBwYXNzaXZlLlxuICAgICAgLy8gVGhlIGVsZW1lbnQgYHRvdWNoc3RhcnRgIGxpc3RlbmVyIGlzIG5vdCBwYXNzaXZlIGJ5IGRlZmF1bHRcbiAgICAgIC8vIFdlIG5ldmVyIGNhbGwgYHByZXZlbnREZWZhdWx0KClgIG9uIGl0LCBzbyB3ZSdyZSBzYWZlIG1ha2luZyBpdCBwYXNzaXZlIHRvby5cbiAgICAgIG1lcmdlKFxuICAgICAgICBmcm9tRXZlbnQ8TW91c2VFdmVudD4odGhpcy5ob3N0Lm5hdGl2ZUVsZW1lbnQsICdtb3VzZWRvd24nLCBwYXNzaXZlRXZlbnRMaXN0ZW5lck9wdGlvbnMpLFxuICAgICAgICBmcm9tRXZlbnQ8VG91Y2hFdmVudD4odGhpcy5ob3N0Lm5hdGl2ZUVsZW1lbnQsICd0b3VjaHN0YXJ0JywgcGFzc2l2ZUV2ZW50TGlzdGVuZXJPcHRpb25zKVxuICAgICAgKVxuICAgICAgICAucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpXG4gICAgICAgIC5zdWJzY3JpYmUoKGV2ZW50OiBNb3VzZUV2ZW50IHwgVG91Y2hFdmVudCkgPT4ge1xuICAgICAgICAgIHRoaXMubnpSZXNpemFibGVTZXJ2aWNlLmhhbmRsZU1vdXNlRG93bk91dHNpZGVBbmd1bGFyJC5uZXh0KFxuICAgICAgICAgICAgbmV3IE56UmVzaXplSGFuZGxlTW91c2VEb3duRXZlbnQodGhpcy5uekRpcmVjdGlvbiwgZXZlbnQpXG4gICAgICAgICAgKTtcbiAgICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICBASG9zdExpc3RlbmVyKCdwb2ludGVyZG93bicsIFsnJGV2ZW50J10pXG4gIG9uUG9pbnRlckRvd24oZXZlbnQ6IFBvaW50ZXJFdmVudCk6IHZvaWQge1xuICAgIChldmVudC50YXJnZXQgYXMgSFRNTEVsZW1lbnQpLnNldFBvaW50ZXJDYXB0dXJlKGV2ZW50LnBvaW50ZXJJZCk7XG4gIH1cblxuICBASG9zdExpc3RlbmVyKCdwb2ludGVydXAnLCBbJyRldmVudCddKVxuICBvblBvaW50ZXJVcChldmVudDogUG9pbnRlckV2ZW50KTogdm9pZCB7XG4gICAgKGV2ZW50LnRhcmdldCBhcyBIVE1MRWxlbWVudCkucmVsZWFzZVBvaW50ZXJDYXB0dXJlKGV2ZW50LnBvaW50ZXJJZCk7XG4gIH1cbn1cbiJdfQ==