UNPKG

@3dgenomes/ngx-resizable

Version:

A Resizable Split-Pane Layout for Angular6+

241 lines 20.5 kB
/** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc */ import { Component, HostBinding, Input, ElementRef, ViewEncapsulation, Output, EventEmitter } from '@angular/core'; import { NgxResizeableWindowRef } from '../window.service'; const ɵ0 = window; export class ResizableComponent { /** * @param {?} regionElement * @param {?} windowRef */ 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; } /** * @return {?} */ 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'; } /** * @return {?} */ ngAfterViewInit() { this.style = this.windowRef.nativeWindow.getComputedStyle(this.nativeElement); } /** * @private * @param {?} e * @return {?} */ 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; } /** * @param {?} e * @param {?} direction * @return {?} */ dragStart(e, direction) { /** @type {?} */ 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; } /** * @param {?} e * @return {?} */ dragEnd(e) { /** @type {?} */ const mouseEvent = e.originalEvent; this.updateInfo(mouseEvent); this.resizeEnd.emit({ info: this.info }); this.noTransition = false; } /** * @param {?} e * @return {?} */ dragging(e) { /** @type {?} */ const mouseEvent = e.originalEvent; /** @type {?} */ const offset = (this.axis === 'x') ? this.start - mouseEvent.clientX : this.start - mouseEvent.clientY; /** @type {?} */ let operand = 1; switch (this.dragDir) { case 'top': operand = -1; /* falls through */ case 'bottom': /** @type {?} */ 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': /** @type {?} */ 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 }); } } ResizableComponent.decorators = [ { type: Component, args: [{ 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:-webkit-box;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;flex-flow:column nowrap}.row{-webkit-box-flex:1;flex:1;display:-webkit-box;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;flex-flow:row nowrap}.row.resizable{-webkit-box-flex:0;flex:0 0 360px}.cell{box-sizing:border-box;background:#fff;border:4px solid #f0f0f0;-webkit-box-flex:1;flex:1;min-height:60px}.cell.resizable{-webkit-box-flex:0;flex:0 0 360px}.resizable{position:relative}.resizable.no-transition{-webkit-transition:none!important;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{-webkit-box-orient:horizontal;-webkit-box-direction:normal;flex-flow:row nowrap}.content.cols .row{-webkit-box-orient:vertical;-webkit-box-direction:normal;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}"] }] } ]; /** @nocollapse */ ResizableComponent.ctorParameters = () => [ { type: ElementRef }, { type: NgxResizeableWindowRef } ]; ResizableComponent.propDecorators = { resizable: [{ type: HostBinding, args: ['class.resizable',] }], noTransition: [{ type: HostBinding, args: ['class.no-transition',] }], width: [{ type: HostBinding, args: ['style.width',] }], height: [{ type: HostBinding, args: ['style.height',] }], flexBasis: [{ type: HostBinding, args: ['style.flex-basis',] }], directions: [{ type: Input }], rFlex: [{ type: Input }], resizeStart: [{ type: Output }], resizing: [{ type: Output }], resizeEnd: [{ type: Output }] }; if (false) { /** @type {?} */ ResizableComponent.prototype.resizable; /** @type {?} */ ResizableComponent.prototype.noTransition; /** @type {?} */ ResizableComponent.prototype.width; /** @type {?} */ ResizableComponent.prototype.height; /** @type {?} */ ResizableComponent.prototype.flexBasis; /** @type {?} */ ResizableComponent.prototype.directions; /** @type {?} */ ResizableComponent.prototype.rFlex; /** @type {?} */ ResizableComponent.prototype.resizeStart; /** @type {?} */ ResizableComponent.prototype.resizing; /** @type {?} */ ResizableComponent.prototype.resizeEnd; /** * @type {?} * @private */ ResizableComponent.prototype.nativeElement; /** * @type {?} * @private */ ResizableComponent.prototype.style; /** * @type {?} * @private */ ResizableComponent.prototype.w; /** * @type {?} * @private */ ResizableComponent.prototype.h; /** * @type {?} * @private */ ResizableComponent.prototype.vx; /** * @type {?} * @private */ ResizableComponent.prototype.vy; /** * @type {?} * @private */ ResizableComponent.prototype.start; /** * @type {?} * @private */ ResizableComponent.prototype.dragDir; /** * @type {?} * @private */ ResizableComponent.prototype.axis; /** * @type {?} * @private */ ResizableComponent.prototype.info; /** * @type {?} * @private */ ResizableComponent.prototype.regionElement; /** * @type {?} * @private */ ResizableComponent.prototype.windowRef; } export { ɵ0 }; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVzaXphYmxlLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiJuZzovL0AzZGdlbm9tZXMvbmd4LXJlc2l6YWJsZS8iLCJzb3VyY2VzIjpbImxpYi9yZXNpemFibGUvcmVzaXphYmxlLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7O0FBQUEsT0FBTyxFQUFFLFNBQVMsRUFBVSxXQUFXLEVBQUUsS0FBSyxFQUFFLFVBQVUsRUFBRSxpQkFBaUIsRUFBRSxNQUFNLEVBQUUsWUFBWSxFQUFpQixNQUFNLGVBQWUsQ0FBQztBQUMxSSxPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztXQU1iLE1BQU07QUFHcEQsTUFBTSxPQUFPLGtCQUFrQjs7Ozs7SUFpQzdCLFlBQW9CLGFBQXlCLEVBQVUsU0FBaUM7UUFBcEUsa0JBQWEsR0FBYixhQUFhLENBQVk7UUFBVSxjQUFTLEdBQVQsU0FBUyxDQUF3QjtRQS9CeEQsY0FBUyxHQUFHLElBQUksQ0FBQztRQUNiLGlCQUFZLEdBQUcsS0FBSyxDQUFDO1FBTWhELFVBQUssR0FBRyxLQUFLLENBQUM7UUFFYixnQkFBVyxHQUFHLElBQUksWUFBWSxFQUFFLENBQUM7UUFDakMsYUFBUSxHQUFHLElBQUksWUFBWSxFQUFFLENBQUM7UUFDOUIsY0FBUyxHQUFHLElBQUksWUFBWSxFQUFFLENBQUM7UUFTakMsT0FBRSxHQUFHLENBQUMsQ0FBQztRQUNQLE9BQUUsR0FBRyxDQUFDLENBQUM7UUFRUCxTQUFJLEdBQUcsRUFBRSxDQUFDO1FBR2hCLElBQUksQ0FBQyxhQUFhLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxhQUFhLENBQUM7SUFDeEQsQ0FBQzs7OztJQUVELFFBQVE7UUFDTixJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRTtZQUFFLElBQUksQ0FBQyxTQUFTLEdBQUcsS0FBSyxDQUFDO1NBQUUsQ0FBQyxpREFBaUQ7UUFDOUYsSUFBSSxDQUFDLFNBQVMsR0FBRyxXQUFXLElB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LDJDQUFpQzs7Ozs7SUFBRSx1Q0FBeUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIE9uSW5pdCwgSG9zdEJpbmRpbmcsIElucHV0LCBFbGVtZW50UmVmLCBWaWV3RW5jYXBzdWxhdGlvbiwgT3V0cHV0LCBFdmVudEVtaXR0ZXIsIEFmdGVyVmlld0luaXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IE5neFJlc2l6ZWFibGVXaW5kb3dSZWYgfSBmcm9tICcuLi93aW5kb3cuc2VydmljZSc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ3Jzei1sYXlvdXQnLFxuICB0ZW1wbGF0ZVVybDogJ3Jlc2l6YWJsZS5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWydyZXNpemFibGUuY29tcG9uZW50LnNjc3MnXSxcbiAgcHJvdmlkZXJzOiBbIHsgcHJvdmlkZTogJ1dpbmRvdycsIHVzZVZhbHVlOiB3aW5kb3cgfSBdLFxuICBlbmNhcHN1bGF0aW9uOiBWaWV3RW5jYXBzdWxhdGlvbi5Ob25lXG59KVxuZXhwb3J0IGNsYXNzIFJlc2l6YWJsZUNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgQWZ0ZXJWaWV3SW5pdCB7XG5cbiAgQEhvc3RCaW5kaW5nKCdjbGFzcy5yZXNpemFibGUnKSByZXNpemFibGUgPSB0cnVlO1xuICBASG9zdEJpbmRpbmcoJ2NsYXNzLm5vLXRyYW5zaXRpb24nKSBub1RyYW5zaXRpb24gPSBmYWxzZTtcbiAgQEhvc3RCaW5kaW5nKCdzdHlsZS53aWR0aCcpIHdpZHRoO1xuICBASG9zdEJpbmRpbmcoJ3N0eWxlLmhlaWdodCcpIGhlaWdodDtcbiAgQEhvc3RCaW5kaW5nKCdzdHlsZS5mbGV4LWJhc2lzJykgZmxleEJhc2lzO1xuXG4gIEBJbnB1dCgpIGRpcmVjdGlvbnM7XG4gIEBJbnB1dCgpIHJGbGV4ID0gZmFsc2U7XG5cbiAgQE91dHB1dCgpIHJlc2l6ZVN0YXJ0ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICBAT3V0cHV0KCkgcmVzaXppbmcgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gIEBPdXRwdXQoKSByZXNpemVFbmQgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG5cbiAgcHJpdmF0ZSBuYXRpdmVFbGVtZW50O1xuXG4gIHByaXZhdGUgc3R5bGU7XG5cbiAgcHJpdmF0ZSB3O1xuICBwcml2YXRlIGg7XG5cbiAgcHJpdmF0ZSB2eCA9IDE7XG4gIHByaXZhdGUgdnkgPSAxO1xuXG4gIHByaXZhdGUgc3RhcnQ7XG5cbiAgcHJpdmF0ZSBkcmFnRGlyO1xuXG4gIHByaXZhdGUgYXhpcztcblxuICBwcml2YXRlIGluZm8gPSB7fTtcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIHJlZ2lvbkVsZW1lbnQ6IEVsZW1lbnRSZWYsIHByaXZhdGUgd2luZG93UmVmOiBOZ3hSZXNpemVhYmxlV2luZG93UmVmKSB7XG4gICAgdGhpcy5uYXRpdmVFbGVtZW50ID0gdGhpcy5yZWdpb25FbGVtZW50Lm5hdGl2ZUVsZW1lbnQ7XG4gIH1cblxuICBuZ09uSW5pdCgpIHtcbiAgICBpZiAoIXRoaXMuckZsZXgpIHsgdGhpcy5yZXNpemFibGUgPSBmYWxzZTsgfSAvLyBBZGRlZCB0byBwZXJtaXQgdXNlIG9mIGNvbXBvbmVudCBmb3IgYWxsIGNlbGxzXG4gICAgdGhpcy5mbGV4QmFzaXMgPSAnZmxleEJhc2lzJyBpbiB0aGlzLm5hdGl2ZUVsZW1lbnQuc3R5bGUgPyAnZmxleEJhc2lzJyA6XG4gICAgICAnd2Via2l0RmxleEJhc2lzJyBpbiB0aGlzLm5hdGl2ZUVsZW1lbnQuc3R5bGUgPyAnd2Via2l0RmxleEJhc2lzJyA6XG4gICAgICAnbXNGbGV4UHJlZmVycmVkU2l6ZScgaW4gdGhpcy5uYXRpdmVFbGVtZW50LnN0eWxlID8gJ21zRmxleFByZWZlcnJlZFNpemUnIDogJ2ZsZXhCYXNpcyc7XG4gIH1cblxuICBuZ0FmdGVyVmlld0luaXQoKSB7XG4gICAgdGhpcy5zdHlsZSA9IHRoaXMud2luZG93UmVmLm5hdGl2ZVdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKHRoaXMubmF0aXZlRWxlbWVudCk7XG4gIH1cblxuICBwcml2YXRlIHVwZGF0ZUluZm8oZSkge1xuICAgIHRoaXMuaW5mb1snd2lkdGgnXSA9IGZhbHNlOyB0aGlzLmluZm9bJ2hlaWdodCddID0gZmFsc2U7XG4gICAgaWYgKHRoaXMuYXhpcyA9PT0gJ3gnKSB7XG4gICAgICB0aGlzLmluZm9bJ3dpZHRoJ10gPSBwYXJzZUludCh0aGlzLm5hdGl2ZUVsZW1lbnQuc3R5bGVbdGhpcy5yRmxleCA/IHRoaXMuZmxleEJhc2lzIDogJ3dpZHRoJ10sIDEwKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5pbmZvWydoZWlnaHQnXSA9IHBhcnNlSW50KHRoaXMubmF0aXZlRWxlbWVudC5zdHlsZVt0aGlzLnJGbGV4ID8gdGhpcy5mbGV4QmFzaXMgOiAnaGVpZ2h0J10sIDEwKTtcbiAgICB9XG4gICAgdGhpcy5pbmZvWydpZCddID0gdGhpcy5uYXRpdmVFbGVtZW50LmlkO1xuICAgIHRoaXMuaW5mb1snZXZ0J10gPSBlO1xuICB9XG5cbiAgcHVibGljIGRyYWdTdGFydChlLCBkaXJlY3Rpb24pIHtcbiAgICBjb25zdCBtb3VzZUV2ZW50ID0gZS5vcmlnaW5hbEV2ZW50O1xuXG4gICAgdGhpcy5kcmFnRGlyID0gZGlyZWN0aW9uO1xuICAgIHRoaXMuYXhpcyA9ICh0aGlzLmRyYWdEaXIgPT09ICdsZWZ0JyB8fCB0aGlzLmRyYWdEaXIgPT09ICdyaWdodCcpID8gJ3gnIDogJ3knO1xuICAgIHRoaXMuc3RhcnQgPSAodGhpcy5heGlzID09PSAneCcgPyBtb3VzZUV2ZW50LmNsaWVudFggOiBtb3VzZUV2ZW50LmNsaWVudFkpO1xuICAgIHRoaXMudyA9IHBhcnNlSW50KHRoaXMuc3R5bGUuZ2V0UHJvcGVydHlWYWx1ZSgnd2lkdGgnKSwgMTApO1xuICAgIHRoaXMuaCA9IHBhcnNlSW50KHRoaXMuc3R5bGUuZ2V0UHJvcGVydHlWYWx1ZSgnaGVpZ2h0JyksIDEwKTtcblxuICAgIHRoaXMucmVzaXplU3RhcnQuZW1pdCh7IGluZm86IHRoaXMuaW5mbyB9KTtcblxuICAgIC8vIHByZXZlbnQgdHJhbnNpdGlvbiB3aGlsZSBkcmFnZ2luZ1xuICAgIHRoaXMubm9UcmFuc2l0aW9uID0gdHJ1ZTtcbiAgfVxuXG4gIHB1YmxpYyBkcmFnRW5kKGUpIHtcbiAgICBjb25zdCBtb3VzZUV2ZW50ID0gZS5vcmlnaW5hbEV2ZW50O1xuXG4gICAgdGhpcy51cGRhdGVJbmZvKG1vdXNlRXZlbnQpO1xuICAgIHRoaXMucmVzaXplRW5kLmVtaXQoeyBpbmZvOiB0aGlzLmluZm8gfSk7XG4gICAgdGhpcy5ub1RyYW5zaXRpb24gPSBmYWxzZTtcbiAgfVxuXG4gIHB1YmxpYyBkcmFnZ2luZyhlKSB7XG4gICAgY29uc3QgbW91c2VFdmVudCA9IGUub3JpZ2luYWxFdmVudDtcbiAgICBjb25zdCBvZmZzZXQgPSAodGhpcy5heGlzID09PSAneCcpID8gdGhpcy5zdGFydCAtIG1vdXNlRXZlbnQuY2xpZW50WCA6IHRoaXMuc3RhcnQgLSBtb3VzZUV2ZW50LmNsaWVudFk7XG5cbiAgICBsZXQgb3BlcmFuZCA9IDE7XG4gICAgc3dpdGNoICh0aGlzLmRyYWdEaXIpIHtcbiAgICAgIGNhc2UgJ3RvcCc6XG4gICAgICAgIG9wZXJhbmQgPSAtMTtcbiAgICAgICAgLyogZmFsbHMgdGhyb3VnaCAqL1xuICAgICAgY2FzZSAnYm90dG9tJzpcbiAgICAgICAgY29uc3QgaGVpZ2h0ID0gKHRoaXMuaCAtIG9mZnNldCAqIHRoaXMudnkgKiBvcGVyYW5kKSArICdweCc7XG4gICAgICAgIGlmICh0aGlzLnJGbGV4KSB7XG4gICAgICAgICAgdGhpcy5mbGV4QmFzaXMgPSBoZWlnaHQ7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5oZWlnaHQgPSBoZWlnaHQ7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdsZWZ0JzpcbiAgICAgICAgb3BlcmFuZCA9IC0xO1xuICAgICAgICAvKiBmYWxscyB0aHJvdWdoICovXG4gICAgICBjYXNlICdyaWdodCc6XG4gICAgICAgIGNvbnN0IHdpZHRoID0gKHRoaXMudyAtIG9mZnNldCAqIHRoaXMudnggKiBvcGVyYW5kKSArICdweCc7XG4gICAgICAgIGlmICh0aGlzLnJGbGV4KSB7XG4gICAgICAgICAgdGhpcy5mbGV4QmFzaXMgPSB3aWR0aDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLndpZHRoID0gd2lkdGg7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgfVxuICAgIHRoaXMudXBkYXRlSW5mbyhtb3VzZUV2ZW50KTtcbiAgICB0aGlzLnJlc2l6aW5nLmVtaXQoeyBpbmZvOiB0aGlzLmluZm8gfSk7XG4gIH1cbn1cbiJdfQ==