ngx-resizable-ex
Version:
A Resizable Split-Pane Layout for Angular6+
146 lines • 18.4 kB
JavaScript
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==