UNPKG

ngx-resizable-ex

Version:

A Resizable Split-Pane Layout for Angular6+

146 lines 18.4 kB
import * as tslib_1 from "tslib"; import { Component, HostBinding, Input, ElementRef, ViewEncapsulation, Output, EventEmitter } from '@angular/core'; import { NgxResizeableWindowRef } from '../window.service'; const ɵ0 = window; let ResizableComponent = class ResizableComponent { constructor(regionElement, windowRef) { this.regionElement = regionElement; this.windowRef = windowRef; this.resizable = true; this.noTransition = false; this.rFlex = false; this.resizeStart = new EventEmitter(); this.resizing = new EventEmitter(); this.resizeEnd = new EventEmitter(); this.vx = 1; this.vy = 1; this.info = {}; this.nativeElement = this.regionElement.nativeElement; } ngOnInit() { if (!this.rFlex) { this.resizable = false; } // Added to permit use of component for all cells this.flexBasis = 'flexBasis' in this.nativeElement.style ? 'flexBasis' : 'webkitFlexBasis' in this.nativeElement.style ? 'webkitFlexBasis' : 'msFlexPreferredSize' in this.nativeElement.style ? 'msFlexPreferredSize' : 'flexBasis'; } ngAfterViewInit() { this.style = this.windowRef.nativeWindow.getComputedStyle(this.nativeElement); } updateInfo(e) { this.info['width'] = false; this.info['height'] = false; if (this.axis === 'x') { this.info['width'] = parseInt(this.nativeElement.style[this.rFlex ? this.flexBasis : 'width'], 10); } else { this.info['height'] = parseInt(this.nativeElement.style[this.rFlex ? this.flexBasis : 'height'], 10); } this.info['id'] = this.nativeElement.id; this.info['evt'] = e; } dragStart(e, direction) { const mouseEvent = e.originalEvent; this.dragDir = direction; this.axis = (this.dragDir === 'left' || this.dragDir === 'right') ? 'x' : 'y'; this.start = (this.axis === 'x' ? mouseEvent.clientX : mouseEvent.clientY); this.w = parseInt(this.style.getPropertyValue('width'), 10); this.h = parseInt(this.style.getPropertyValue('height'), 10); this.resizeStart.emit({ info: this.info }); // prevent transition while dragging this.noTransition = true; } dragEnd(e) { const mouseEvent = e.originalEvent; this.updateInfo(mouseEvent); this.resizeEnd.emit({ info: this.info }); this.noTransition = false; } dragging(e) { const mouseEvent = e.originalEvent; const offset = (this.axis === 'x') ? this.start - mouseEvent.clientX : this.start - mouseEvent.clientY; let operand = 1; switch (this.dragDir) { case 'top': operand = -1; /* falls through */ case 'bottom': const height = (this.h - offset * this.vy * operand) + 'px'; if (this.rFlex) { this.flexBasis = height; } else { this.height = height; } break; case 'left': operand = -1; /* falls through */ case 'right': const width = (this.w - offset * this.vx * operand) + 'px'; if (this.rFlex) { this.flexBasis = width; } else { this.width = width; } break; } this.updateInfo(mouseEvent); this.resizing.emit({ info: this.info }); } }; tslib_1.__decorate([ HostBinding('class.resizable'), tslib_1.__metadata("design:type", Object) ], ResizableComponent.prototype, "resizable", void 0); tslib_1.__decorate([ HostBinding('class.no-transition'), tslib_1.__metadata("design:type", Object) ], ResizableComponent.prototype, "noTransition", void 0); tslib_1.__decorate([ HostBinding('style.width'), tslib_1.__metadata("design:type", Object) ], ResizableComponent.prototype, "width", void 0); tslib_1.__decorate([ HostBinding('style.height'), tslib_1.__metadata("design:type", Object) ], ResizableComponent.prototype, "height", void 0); tslib_1.__decorate([ HostBinding('style.flex-basis'), tslib_1.__metadata("design:type", Object) ], ResizableComponent.prototype, "flexBasis", void 0); tslib_1.__decorate([ Input(), tslib_1.__metadata("design:type", Object) ], ResizableComponent.prototype, "directions", void 0); tslib_1.__decorate([ Input(), tslib_1.__metadata("design:type", Object) ], ResizableComponent.prototype, "rFlex", void 0); tslib_1.__decorate([ Output(), tslib_1.__metadata("design:type", Object) ], ResizableComponent.prototype, "resizeStart", void 0); tslib_1.__decorate([ Output(), tslib_1.__metadata("design:type", Object) ], ResizableComponent.prototype, "resizing", void 0); tslib_1.__decorate([ Output(), tslib_1.__metadata("design:type", Object) ], ResizableComponent.prototype, "resizeEnd", void 0); ResizableComponent = tslib_1.__decorate([ Component({ selector: 'rsz-layout', template: "<ng-content></ng-content>\n\n<div *ngFor='let direction of directions'\n [class]=\"'rg-' + direction\"\n rszDragHandle\n (DragStart)=\"dragStart($event, direction);\"\n (DragEnd)=\"dragEnd($event)\"\n (Drag)=\"dragging($event)\">\n <span></span>\n</div>", providers: [{ provide: 'Window', useValue: ɵ0 }], encapsulation: ViewEncapsulation.None, styles: [".content{display:flex;flex-flow:column nowrap}.row{flex:1;display:flex;flex-flow:row nowrap}.row.resizable{flex:0 0 360px}.cell{box-sizing:border-box;background:#fff;border:4px solid #f0f0f0;flex:1;min-height:60px}.cell.resizable{flex:0 0 360px}.resizable{position:relative}.resizable.no-transition{transition:none!important}.rg-none{display:none}.rg-bottom,.rg-left,.rg-right,.rg-top{display:block;width:8px;height:8px;line-height:8px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;background:0 0;position:absolute;z-index:1}.rg-bottom span,.rg-left span,.rg-right span,.rg-top span{position:absolute;box-sizing:border-box;display:block;border:1px solid #ccc}.rg-left span,.rg-right span{border-width:0 1px;top:50%;margin:-10px 0 0 2px;height:20px;width:4px}.rg-bottom span,.rg-top span{border-width:1px 0;left:50%;margin:2px 0 0 -10px;width:20px;height:4px}.rg-top{cursor:row-resize;width:100%;top:0;left:0;margin-top:-4px}.rg-right{cursor:col-resize;height:100%;right:0;top:0;margin-right:-8px}.rg-bottom{cursor:row-resize;width:100%;bottom:0;left:0;margin-bottom:-4px}.rg-left{cursor:col-resize;height:100%;left:0;top:0;margin-left:-8px}.content.cols{flex-flow:row nowrap}.content.cols .row{flex-flow:column nowrap}.content.cols .cell{min-width:60px}.content.cols .rg-top{margin-top:-8px}.content.cols .rg-right{margin-right:-4px}.content.cols .rg-bottom{margin-bottom:-8px}.content.cols .rg-left{margin-left:-4px}"] }), tslib_1.__metadata("design:paramtypes", [ElementRef, NgxResizeableWindowRef]) ], ResizableComponent); export { ResizableComponent }; export { ɵ0 }; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVzaXphYmxlLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiJuZzovL25neC1yZXNpemFibGUtZXgvIiwic291cmNlcyI6WyJsaWIvcmVzaXphYmxlL3Jlc2l6YWJsZS5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQVUsV0FBVyxFQUFFLEtBQUssRUFBRSxVQUFVLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxFQUFFLFlBQVksRUFBaUIsTUFBTSxlQUFlLENBQUM7QUFDMUksT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0sbUJBQW1CLENBQUM7V0FNYixNQUFNO0FBR3BELElBQWEsa0JBQWtCLEdBQS9CLE1BQWEsa0JBQWtCO0lBaUM3QixZQUFvQixhQUF5QixFQUFVLFNBQWlDO1FBQXBFLGtCQUFhLEdBQWIsYUFBYSxDQUFZO1FBQVUsY0FBUyxHQUFULFNBQVMsQ0FBd0I7UUEvQnhELGNBQVMsR0FBRyxJQUFJLENBQUM7UUFDYixpQkFBWSxHQUFHLEtBQUssQ0FBQztRQU1oRCxVQUFLLEdBQUcsS0FBSyxDQUFDO1FBRWIsZ0JBQVcsR0FBRyxJQUFJLFlBQVksRUFBRSxDQUFDO1FBQ2pDLGFBQVEsR0FBRyxJQUFJLFlBQVksRUFBRSxDQUFDO1FBQzlCLGNBQVMsR0FBRyxJQUFJLFlBQVksRUFBRSxDQUFDO1FBU2pDLE9BQUUsR0FBRyxDQUFDLENBQUM7UUFDUCxPQUFFLEdBQUcsQ0FBQyxDQUFDO1FBUVAsU0FBSSxHQUFHLEVBQUUsQ0FBQztRQUdoQixJQUFJLENBQUMsYUFBYSxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsYUFBYSxDQUFDO0lBQ3hELENBQUM7SUFFRCxRQUFRO1FBQ04sSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUU7WUFBRSxJQUFJLENBQUMsU0FBUyxHQUFHLEtBQUssQ0FBQztTQUFFLENBQUMsaURBQWlEO1FBQzlGLElBQUksQ0FBQyxTQUFTLEdBQUcsV0FBVyxJQUFJLElB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aXQsIEhvc3RCaW5kaW5nLCBJbnB1dCwgRWxlbWVudFJlZiwgVmlld0VuY2Fwc3VsYXRpb24sIE91dHB1dCwgRXZlbnRFbWl0dGVyLCBBZnRlclZpZXdJbml0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBOZ3hSZXNpemVhYmxlV2luZG93UmVmIH0gZnJvbSAnLi4vd2luZG93LnNlcnZpY2UnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdyc3otbGF5b3V0JyxcbiAgdGVtcGxhdGVVcmw6ICdyZXNpemFibGUuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsncmVzaXphYmxlLmNvbXBvbmVudC5zY3NzJ10sXG4gIHByb3ZpZGVyczogWyB7IHByb3ZpZGU6ICdXaW5kb3cnLCB1c2VWYWx1ZTogd2luZG93IH0gXSxcbiAgZW5jYXBzdWxhdGlvbjogVmlld0VuY2Fwc3VsYXRpb24uTm9uZVxufSlcbmV4cG9ydCBjbGFzcyBSZXNpemFibGVDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIEFmdGVyVmlld0luaXQge1xuXG4gIEBIb3N0QmluZGluZygnY2xhc3MucmVzaXphYmxlJykgcmVzaXphYmxlID0gdHJ1ZTtcbiAgQEhvc3RCaW5kaW5nKCdjbGFzcy5uby10cmFuc2l0aW9uJykgbm9UcmFuc2l0aW9uID0gZmFsc2U7XG4gIEBIb3N0QmluZGluZygnc3R5bGUud2lkdGgnKSB3aWR0aDtcbiAgQEhvc3RCaW5kaW5nKCdzdHlsZS5oZWlnaHQnKSBoZWlnaHQ7XG4gIEBIb3N0QmluZGluZygnc3R5bGUuZmxleC1iYXNpcycpIGZsZXhCYXNpcztcblxuICBASW5wdXQoKSBkaXJlY3Rpb25zO1xuICBASW5wdXQoKSByRmxleCA9IGZhbHNlO1xuXG4gIEBPdXRwdXQoKSByZXNpemVTdGFydCA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgQE91dHB1dCgpIHJlc2l6aW5nID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICBAT3V0cHV0KCkgcmVzaXplRW5kID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuXG4gIHByaXZhdGUgbmF0aXZlRWxlbWVudDtcblxuICBwcml2YXRlIHN0eWxlO1xuXG4gIHByaXZhdGUgdztcbiAgcHJpdmF0ZSBoO1xuXG4gIHByaXZhdGUgdnggPSAxO1xuICBwcml2YXRlIHZ5ID0gMTtcblxuICBwcml2YXRlIHN0YXJ0O1xuXG4gIHByaXZhdGUgZHJhZ0RpcjtcblxuICBwcml2YXRlIGF4aXM7XG5cbiAgcHJpdmF0ZSBpbmZvID0ge307XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSByZWdpb25FbGVtZW50OiBFbGVtZW50UmVmLCBwcml2YXRlIHdpbmRvd1JlZjogTmd4UmVzaXplYWJsZVdpbmRvd1JlZikge1xuICAgIHRoaXMubmF0aXZlRWxlbWVudCA9IHRoaXMucmVnaW9uRWxlbWVudC5uYXRpdmVFbGVtZW50O1xuICB9XG5cbiAgbmdPbkluaXQoKSB7XG4gICAgaWYgKCF0aGlzLnJGbGV4KSB7IHRoaXMucmVzaXphYmxlID0gZmFsc2U7IH0gLy8gQWRkZWQgdG8gcGVybWl0IHVzZSBvZiBjb21wb25lbnQgZm9yIGFsbCBjZWxsc1xuICAgIHRoaXMuZmxleEJhc2lzID0gJ2ZsZXhCYXNpcycgaW4gdGhpcy5uYXRpdmVFbGVtZW50LnN0eWxlID8gJ2ZsZXhCYXNpcycgOlxuICAgICAgJ3dlYmtpdEZsZXhCYXNpcycgaW4gdGhpcy5uYXRpdmVFbGVtZW50LnN0eWxlID8gJ3dlYmtpdEZsZXhCYXNpcycgOlxuICAgICAgJ21zRmxleFByZWZlcnJlZFNpemUnIGluIHRoaXMubmF0aXZlRWxlbWVudC5zdHlsZSA/ICdtc0ZsZXhQcmVmZXJyZWRTaXplJyA6ICdmbGV4QmFzaXMnO1xuICB9XG5cbiAgbmdBZnRlclZpZXdJbml0KCkge1xuICAgIHRoaXMuc3R5bGUgPSB0aGlzLndpbmRvd1JlZi5uYXRpdmVXaW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZSh0aGlzLm5hdGl2ZUVsZW1lbnQpO1xuICB9XG5cbiAgcHJpdmF0ZSB1cGRhdGVJbmZvKGUpIHtcbiAgICB0aGlzLmluZm9bJ3dpZHRoJ10gPSBmYWxzZTsgdGhpcy5pbmZvWydoZWlnaHQnXSA9IGZhbHNlO1xuICAgIGlmICh0aGlzLmF4aXMgPT09ICd4Jykge1xuICAgICAgdGhpcy5pbmZvWyd3aWR0aCddID0gcGFyc2VJbnQodGhpcy5uYXRpdmVFbGVtZW50LnN0eWxlW3RoaXMuckZsZXggPyB0aGlzLmZsZXhCYXNpcyA6ICd3aWR0aCddLCAxMCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuaW5mb1snaGVpZ2h0J10gPSBwYXJzZUludCh0aGlzLm5hdGl2ZUVsZW1lbnQuc3R5bGVbdGhpcy5yRmxleCA/IHRoaXMuZmxleEJhc2lzIDogJ2hlaWdodCddLCAxMCk7XG4gICAgfVxuICAgIHRoaXMuaW5mb1snaWQnXSA9IHRoaXMubmF0aXZlRWxlbWVudC5pZDtcbiAgICB0aGlzLmluZm9bJ2V2dCddID0gZTtcbiAgfVxuXG4gIHB1YmxpYyBkcmFnU3RhcnQoZSwgZGlyZWN0aW9uKSB7XG4gICAgY29uc3QgbW91c2VFdmVudCA9IGUub3JpZ2luYWxFdmVudDtcblxuICAgIHRoaXMuZHJhZ0RpciA9IGRpcmVjdGlvbjtcbiAgICB0aGlzLmF4aXMgPSAodGhpcy5kcmFnRGlyID09PSAnbGVmdCcgfHwgdGhpcy5kcmFnRGlyID09PSAncmlnaHQnKSA/ICd4JyA6ICd5JztcbiAgICB0aGlzLnN0YXJ0ID0gKHRoaXMuYXhpcyA9PT0gJ3gnID8gbW91c2VFdmVudC5jbGllbnRYIDogbW91c2VFdmVudC5jbGllbnRZKTtcbiAgICB0aGlzLncgPSBwYXJzZUludCh0aGlzLnN0eWxlLmdldFByb3BlcnR5VmFsdWUoJ3dpZHRoJyksIDEwKTtcbiAgICB0aGlzLmggPSBwYXJzZUludCh0aGlzLnN0eWxlLmdldFByb3BlcnR5VmFsdWUoJ2hlaWdodCcpLCAxMCk7XG5cbiAgICB0aGlzLnJlc2l6ZVN0YXJ0LmVtaXQoeyBpbmZvOiB0aGlzLmluZm8gfSk7XG5cbiAgICAvLyBwcmV2ZW50IHRyYW5zaXRpb24gd2hpbGUgZHJhZ2dpbmdcbiAgICB0aGlzLm5vVHJhbnNpdGlvbiA9IHRydWU7XG4gIH1cblxuICBwdWJsaWMgZHJhZ0VuZChlKSB7XG4gICAgY29uc3QgbW91c2VFdmVudCA9IGUub3JpZ2luYWxFdmVudDtcblxuICAgIHRoaXMudXBkYXRlSW5mbyhtb3VzZUV2ZW50KTtcbiAgICB0aGlzLnJlc2l6ZUVuZC5lbWl0KHsgaW5mbzogdGhpcy5pbmZvIH0pO1xuICAgIHRoaXMubm9UcmFuc2l0aW9uID0gZmFsc2U7XG4gIH1cblxuICBwdWJsaWMgZHJhZ2dpbmcoZSkge1xuICAgIGNvbnN0IG1vdXNlRXZlbnQgPSBlLm9yaWdpbmFsRXZlbnQ7XG4gICAgY29uc3Qgb2Zmc2V0ID0gKHRoaXMuYXhpcyA9PT0gJ3gnKSA/IHRoaXMuc3RhcnQgLSBtb3VzZUV2ZW50LmNsaWVudFggOiB0aGlzLnN0YXJ0IC0gbW91c2VFdmVudC5jbGllbnRZO1xuXG4gICAgbGV0IG9wZXJhbmQgPSAxO1xuICAgIHN3aXRjaCAodGhpcy5kcmFnRGlyKSB7XG4gICAgICBjYXNlICd0b3AnOlxuICAgICAgICBvcGVyYW5kID0gLTE7XG4gICAgICAgIC8qIGZhbGxzIHRocm91Z2ggKi9cbiAgICAgIGNhc2UgJ2JvdHRvbSc6XG4gICAgICAgIGNvbnN0IGhlaWdodCA9ICh0aGlzLmggLSBvZmZzZXQgKiB0aGlzLnZ5ICogb3BlcmFuZCkgKyAncHgnO1xuICAgICAgICBpZiAodGhpcy5yRmxleCkge1xuICAgICAgICAgIHRoaXMuZmxleEJhc2lzID0gaGVpZ2h0O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMuaGVpZ2h0ID0gaGVpZ2h0O1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnbGVmdCc6XG4gICAgICAgIG9wZXJhbmQgPSAtMTtcbiAgICAgICAgLyogZmFsbHMgdGhyb3VnaCAqL1xuICAgICAgY2FzZSAncmlnaHQnOlxuICAgICAgICBjb25zdCB3aWR0aCA9ICh0aGlzLncgLSBvZmZzZXQgKiB0aGlzLnZ4ICogb3BlcmFuZCkgKyAncHgnO1xuICAgICAgICBpZiAodGhpcy5yRmxleCkge1xuICAgICAgICAgIHRoaXMuZmxleEJhc2lzID0gd2lkdGg7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy53aWR0aCA9IHdpZHRoO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgIH1cbiAgICB0aGlzLnVwZGF0ZUluZm8obW91c2VFdmVudCk7XG4gICAgdGhpcy5yZXNpemluZy5lbWl0KHsgaW5mbzogdGhpcy5pbmZvIH0pO1xuICB9XG5cbn1cbiJdfQ==