ng-zorro-antd
Version:
An enterprise-class UI components based on Ant Design and Angular
96 lines • 15.8 kB
JavaScript
/**
* 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: "17.0.7", 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: "17.0.7", 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: "17.0.7", 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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O2dCQU12QyxXQUFXO3NCQURWLFlBQVk7dUJBQUMsV0FBVyxFQUFFLENBQUMsUUFBUSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZVxuICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2dpdGh1Yi5jb20vTkctWk9SUk8vbmctem9ycm8tYW50ZC9ibG9iL21hc3Rlci9MSUNFTlNFXG4gKi9cblxuaW1wb3J0IHsgbm9ybWFsaXplUGFzc2l2ZUxpc3RlbmVyT3B0aW9ucyB9IGZyb20gJ0Bhbmd1bGFyL2Nkay9wbGF0Zm9ybSc7XG5pbXBvcnQge1xuICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgQ29tcG9uZW50LFxuICBFbGVtZW50UmVmLFxuICBFdmVudEVtaXR0ZXIsXG4gIEhvc3RMaXN0ZW5lcixcbiAgSW5wdXQsXG4gIE5nWm9uZSxcbiAgT25Jbml0LFxuICBPdXRwdXQsXG4gIFJlbmRlcmVyMlxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IGZyb21FdmVudCwgbWVyZ2UgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IHRha2VVbnRpbCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcblxuaW1wb3J0IHsgTnpEZXN0cm95U2VydmljZSB9IGZyb20gJ25nLXpvcnJvLWFudGQvY29yZS9zZXJ2aWNlcyc7XG5cbmltcG9ydCB7IE56UmVzaXphYmxlU2VydmljZSB9IGZyb20gJy4vcmVzaXphYmxlLnNlcnZpY2UnO1xuXG5leHBvcnQgdHlwZSBOekN1cnNvclR5cGUgPSAnd2luZG93JyB8ICdncmlkJztcblxuZXhwb3J0IHR5cGUgTnpSZXNpemVEaXJlY3Rpb24gPVxuICB8ICd0b3AnXG4gIHwgJ3JpZ2h0J1xuICB8ICdib3R0b20nXG4gIHwgJ2xlZnQnXG4gIHwgJ3RvcFJpZ2h0J1xuICB8ICdib3R0b21SaWdodCdcbiAgfCAnYm90dG9tTGVmdCdcbiAgfCAndG9wTGVmdCc7XG5cbmV4cG9ydCBjbGFzcyBOelJlc2l6ZUhhbmRsZU1vdXNlRG93bkV2ZW50IHtcbiAgY29uc3RydWN0b3IoXG4gICAgcHVibGljIGRpcmVjdGlvbjogTnpSZXNpemVEaXJlY3Rpb24sXG4gICAgcHVibGljIG1vdXNlRXZlbnQ6IE1vdXNlRXZlbnQgfCBUb3VjaEV2ZW50XG4gICkge31cbn1cblxuY29uc3QgcGFzc2l2ZUV2ZW50TGlzdGVuZXJPcHRpb25zID0gPEFkZEV2ZW50TGlzdGVuZXJPcHRpb25zPm5vcm1hbGl6ZVBhc3NpdmVMaXN0ZW5lck9wdGlvbnMoeyBwYXNzaXZlOiB0cnVlIH0pO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICduei1yZXNpemUtaGFuZGxlLCBbbnotcmVzaXplLWhhbmRsZV0nLFxuICBleHBvcnRBczogJ256UmVzaXplSGFuZGxlJyxcbiAgdGVtcGxhdGU6IGAgPG5nLWNvbnRlbnQ+PC9uZy1jb250ZW50PiBgLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbiAgaG9zdDoge1xuICAgIGNsYXNzOiAnbnotcmVzaXphYmxlLWhhbmRsZScsXG4gICAgJ1tjbGFzcy5uei1yZXNpemFibGUtaGFuZGxlLXRvcF0nOiBgbnpEaXJlY3Rpb24gPT09ICd0b3AnYCxcbiAgICAnW2NsYXNzLm56LXJlc2l6YWJsZS1oYW5kbGUtcmlnaHRdJzogYG56RGlyZWN0aW9uID09PSAncmlnaHQnYCxcbiAgICAnW2NsYXNzLm56LXJlc2l6YWJsZS1oYW5kbGUtYm90dG9tXSc6IGBuekRpcmVjdGlvbiA9PT0gJ2JvdHRvbSdgLFxuICAgICdbY2xhc3MubnotcmVzaXphYmxlLWhhbmRsZS1sZWZ0XSc6IGBuekRpcmVjdGlvbiA9PT0gJ2xlZnQnYCxcbiAgICAnW2NsYXNzLm56LXJlc2l6YWJsZS1oYW5kbGUtdG9wUmlnaHRdJzogYG56RGlyZWN0aW9uID09PSAndG9wUmlnaHQnYCxcbiAgICAnW2NsYXNzLm56LXJlc2l6YWJsZS1oYW5kbGUtYm90dG9tUmlnaHRdJzogYG56RGlyZWN0aW9uID09PSAnYm90dG9tUmlnaHQnYCxcbiAgICAnW2NsYXNzLm56LXJlc2l6YWJsZS1oYW5kbGUtYm90dG9tTGVmdF0nOiBgbnpEaXJlY3Rpb24gPT09ICdib3R0b21MZWZ0J2AsXG4gICAgJ1tjbGFzcy5uei1yZXNpemFibGUtaGFuZGxlLXRvcExlZnRdJzogYG56RGlyZWN0aW9uID09PSAndG9wTGVmdCdgLFxuICAgICdbY2xhc3MubnotcmVzaXphYmxlLWhhbmRsZS1jdXJzb3ItdHlwZS1ncmlkXSc6IGBuekN1cnNvclR5cGUgPT09ICdncmlkJ2AsXG4gICAgJ1tjbGFzcy5uei1yZXNpemFibGUtaGFuZGxlLWN1cnNvci10eXBlLXdpbmRvd10nOiBgbnpDdXJzb3JUeXBlID09PSAnd2luZG93J2BcbiAgfSxcbiAgcHJvdmlkZXJzOiBbTnpEZXN0cm95U2VydmljZV0sXG4gIHN0YW5kYWxvbmU6IHRydWVcbn0pXG5leHBvcnQgY2xhc3MgTnpSZXNpemVIYW5kbGVDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xuICBASW5wdXQoKSBuekRpcmVjdGlvbjogTnpSZXNpemVEaXJlY3Rpb24gPSAnYm90dG9tUmlnaHQnO1xuICBASW5wdXQoKSBuekN1cnNvclR5cGU6IE56Q3Vyc29yVHlwZSA9ICd3aW5kb3cnO1xuICBAT3V0cHV0KCkgcmVhZG9ubHkgbnpNb3VzZURvd24gPSBuZXcgRXZlbnRFbWl0dGVyPE56UmVzaXplSGFuZGxlTW91c2VEb3duRXZlbnQ+KCk7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBuZ1pvbmU6IE5nWm9uZSxcbiAgICBwcml2YXRlIG56UmVzaXphYmxlU2VydmljZTogTnpSZXNpemFibGVTZXJ2aWNlLFxuICAgIHByaXZhdGUgcmVuZGVyZXI6IFJlbmRlcmVyMixcbiAgICBwcml2YXRlIGhvc3Q6IEVsZW1lbnRSZWY8SFRNTEVsZW1lbnQ+LFxuICAgIHByaXZhdGUgZGVzdHJveSQ6IE56RGVzdHJveVNlcnZpY2VcbiAgKSB7fVxuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIHRoaXMubnpSZXNpemFibGVTZXJ2aWNlLm1vdXNlRW50ZXJlZE91dHNpZGVBbmd1bGFyJC5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSkuc3Vic2NyaWJlKGVudGVyZWQgPT4ge1xuICAgICAgaWYgKGVudGVyZWQpIHtcbiAgICAgICAgdGhpcy5yZW5kZXJlci5hZGRDbGFzcyh0aGlzLmhvc3QubmF0aXZlRWxlbWVudCwgJ256LXJlc2l6YWJsZS1oYW5kbGUtYm94LWhvdmVyJyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnJlbmRlcmVyLnJlbW92ZUNsYXNzKHRoaXMuaG9zdC5uYXRpdmVFbGVtZW50LCAnbnotcmVzaXphYmxlLWhhbmRsZS1ib3gtaG92ZXInKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHRoaXMubmdab25lLnJ1bk91dHNpZGVBbmd1bGFyKCgpID0+IHtcbiAgICAgIC8vIE5vdGU6IHNpbmNlIENocm9tZSA1NiBkZWZhdWx0cyBkb2N1bWVudCBsZXZlbCBgdG91Y2hzdGFydGAgbGlzdGVuZXIgdG8gcGFzc2l2ZS5cbiAgICAgIC8vIFRoZSBlbGVtZW50IGB0b3VjaHN0YXJ0YCBsaXN0ZW5lciBpcyBub3QgcGFzc2l2ZSBieSBkZWZhdWx0XG4gICAgICAvLyBXZSBuZXZlciBjYWxsIGBwcmV2ZW50RGVmYXVsdCgpYCBvbiBpdCwgc28gd2UncmUgc2FmZSBtYWtpbmcgaXQgcGFzc2l2ZSB0b28uXG4gICAgICBtZXJnZShcbiAgICAgICAgZnJvbUV2ZW50PE1vdXNlRXZlbnQ+KHRoaXMuaG9zdC5uYXRpdmVFbGVtZW50LCAnbW91c2Vkb3duJywgcGFzc2l2ZUV2ZW50TGlzdGVuZXJPcHRpb25zKSxcbiAgICAgICAgZnJvbUV2ZW50PFRvdWNoRXZlbnQ+KHRoaXMuaG9zdC5uYXRpdmVFbGVtZW50LCAndG91Y2hzdGFydCcsIHBhc3NpdmVFdmVudExpc3RlbmVyT3B0aW9ucylcbiAgICAgIClcbiAgICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKVxuICAgICAgICAuc3Vic2NyaWJlKChldmVudDogTW91c2VFdmVudCB8IFRvdWNoRXZlbnQpID0+IHtcbiAgICAgICAgICB0aGlzLm56UmVzaXphYmxlU2VydmljZS5oYW5kbGVNb3VzZURvd25PdXRzaWRlQW5ndWxhciQubmV4dChcbiAgICAgICAgICAgIG5ldyBOelJlc2l6ZUhhbmRsZU1vdXNlRG93bkV2ZW50KHRoaXMubnpEaXJlY3Rpb24sIGV2ZW50KVxuICAgICAgICAgICk7XG4gICAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgQEhvc3RMaXN0ZW5lcigncG9pbnRlcmRvd24nLCBbJyRldmVudCddKVxuICBvblBvaW50ZXJEb3duKGV2ZW50OiBQb2ludGVyRXZlbnQpOiB2b2lkIHtcbiAgICAoZXZlbnQudGFyZ2V0IGFzIEhUTUxFbGVtZW50KS5zZXRQb2ludGVyQ2FwdHVyZShldmVudC5wb2ludGVySWQpO1xuICB9XG5cbiAgQEhvc3RMaXN0ZW5lcigncG9pbnRlcnVwJywgWyckZXZlbnQnXSlcbiAgb25Qb2ludGVyVXAoZXZlbnQ6IFBvaW50ZXJFdmVudCk6IHZvaWQge1xuICAgIChldmVudC50YXJnZXQgYXMgSFRNTEVsZW1lbnQpLnJlbGVhc2VQb2ludGVyQ2FwdHVyZShldmVudC5wb2ludGVySWQpO1xuICB9XG59XG4iXX0=