import * as i0 from '@angular/core'; import { EventEmitter, Component, ViewEncapsulation, ChangeDetectionStrategy, Input, Output, ContentChildren, ViewChild, NgModule } from '@angular/core'; import * as i1 from '@angular/common'; import { CommonModule } from '@angular/common'; import { DomHandler } from 'primeng/dom'; import { PrimeTemplate, SharedModule } from 'primeng/api'; class Splitter { constructor(cd, el) { this.cd = cd; this.el = el; this.stateStorage = "session"; this.stateKey = null; this.layout = "horizontal"; this.gutterSize = 4; this.panelSizes = []; this.minSizes = []; this.onResizeEnd = new EventEmitter(); this.onResizeStart = new EventEmitter(); this.nested = false; this.panels = []; this.dragging = false; this.mouseMoveListener = null; this.mouseUpListener = null; this.touchMoveListener = null; this.touchEndListener = null; this.size = null; this.gutterElement = null; this.startPos = null; this.prevPanelElement = null; this.nextPanelElement = null; this.nextPanelSize = null; this.prevPanelSize = null; this._panelSizes = null; this.prevPanelIndex = null; } ngOnInit() { this.nested = this.isNested(); } ngAfterContentInit() { this.templates.forEach((item) => { switch (item.getType()) { case 'panel': this.panels.push(item.template); break; default: this.panels.push(item.template); break; } }); } ngAfterViewInit() { if (this.panels && this.panels.length) { let initialized = false; if (this.isStateful()) { initialized = this.restoreState(); } if (!initialized) { let children = [...this.el.nativeElement.children[0].children].filter(child => DomHandler.hasClass(child, 'p-splitter-panel')); let _panelSizes = []; this.panels.map((panel, i) => { let panelInitialSize = this.panelSizes.length - 1 >= i ? this.panelSizes[i] : null; let panelSize = panelInitialSize || (100 / this.panels.length); _panelSizes[i] = panelSize; children[i].style.flexBasis = 'calc(' + panelSize + '% - ' + ((this.panels.length - 1) * this.gutterSize) + 'px)'; }); this._panelSizes = _panelSizes; } } } resizeStart(event, index) { this.gutterElement = event.currentTarget; this.size = this.horizontal() ? DomHandler.getWidth(this.containerViewChild.nativeElement) : DomHandler.getHeight(this.containerViewChild.nativeElement); this.dragging = true; this.startPos = this.horizontal() ? (event.pageX || event.changedTouches[0].pageX) : (event.pageY || event.changedTouches[0].pageY); this.prevPanelElement = this.gutterElement.previousElementSibling; this.nextPanelElement = this.gutterElement.nextElementSibling; this.prevPanelSize = 100 * (this.horizontal() ? DomHandler.getOuterWidth(this.prevPanelElement, true) : DomHandler.getOuterHeight(this.prevPanelElement, true)) / this.size; this.nextPanelSize = 100 * (this.horizontal() ? DomHandler.getOuterWidth(this.nextPanelElement, true) : DomHandler.getOuterHeight(this.nextPanelElement, true)) / this.size; this.prevPanelIndex = index; DomHandler.addClass(this.gutterElement, 'p-splitter-gutter-resizing'); DomHandler.addClass(this.containerViewChild.nativeElement, 'p-splitter-resizing'); this.onResizeStart.emit({ originalEvent: event, sizes: this._panelSizes }); } onResize(event) { let newPos; if (this.horizontal()) newPos = (event.pageX * 100 / this.size) - (this.startPos * 100 / this.size); else newPos = (event.pageY * 100 / this.size) - (this.startPos * 100 / this.size); let newPrevPanelSize = this.prevPanelSize + newPos; let newNextPanelSize = this.nextPanelSize - newPos; if (this.validateResize(newPrevPanelSize, newNextPanelSize)) { this.prevPanelElement.style.flexBasis = 'calc(' + newPrevPanelSize + '% - ' + ((this.panels.length - 1) * this.gutterSize) + 'px)'; this.nextPanelElement.style.flexBasis = 'calc(' + newNextPanelSize + '% - ' + ((this.panels.length - 1) * this.gutterSize) + 'px)'; this._panelSizes[this.prevPanelIndex] = newPrevPanelSize; this._panelSizes[this.prevPanelIndex + 1] = newNextPanelSize; } } resizeEnd(event) { if (this.isStateful()) { this.saveState(); } this.onResizeEnd.emit({ originalEvent: event, sizes: this._panelSizes }); DomHandler.removeClass(this.gutterElement, 'p-splitter-gutter-resizing'); DomHandler.removeClass(this.containerViewChild.nativeElement, 'p-splitter-resizing'); this.clear(); } onGutterMouseDown(event, index) { this.resizeStart(event, index); this.bindMouseListeners(); } onGutterTouchStart(event, index) { if (event.cancelable) { this.resizeStart(event, index); this.bindTouchListeners(); event.preventDefault(); } } onGutterTouchEnd(event) { this.resizeEnd(event); this.unbindTouchListeners(); if (event.cancelable) event.preventDefault(); } validateResize(newPrevPanelSize, newNextPanelSize) { if (this.minSizes.length >= 1 && this.minSizes[0] && this.minSizes[0] > newPrevPanelSize) { return false; } if (this.minSizes.length > 1 && this.minSizes[1] && this.minSizes[1] > newNextPanelSize) { return false; } return true; } bindMouseListeners() { if (!this.mouseMoveListener) { this.mouseMoveListener = event => this.onResize(event); document.addEventListener('mousemove', this.mouseMoveListener); } if (!this.mouseUpListener) { this.mouseUpListener = event => { this.resizeEnd(event); this.unbindMouseListeners(); }; document.addEventListener('mouseup', this.mouseUpListener); } } bindTouchListeners() { if (!this.touchMoveListener) { this.touchMoveListener = event => this.onResize(event.changedTouches[0]); document.addEventListener('touchmove', this.touchMoveListener); } if (!this.touchEndListener) { this.touchEndListener = event => { this.resizeEnd(event); this.unbindTouchListeners(); }; document.addEventListener('touchend', this.touchEndListener); } } unbindMouseListeners() { if (this.mouseMoveListener) { document.removeEventListener('mousemove', this.mouseMoveListener); this.mouseMoveListener = null; } if (this.mouseUpListener) { document.removeEventListener('mouseup', this.mouseUpListener); this.mouseUpListener = null; } } unbindTouchListeners() { if (this.touchMoveListener) { document.removeEventListener('touchmove', this.touchMoveListener); this.touchMoveListener = null; } if (this.touchEndListener) { document.removeEventListener('touchend', this.touchEndListener); this.touchEndListener = null; } } clear() { this.dragging = false; this.size = null; this.startPos = null; this.prevPanelElement = null; this.nextPanelElement = null; this.prevPanelSize = null; this.nextPanelSize = null; this.gutterElement = null; this.prevPanelIndex = null; } isNested() { if (this.el.nativeElement) { let parent = this.el.nativeElement.parentElement; while (parent && !DomHandler.hasClass(parent, 'p-splitter')) { parent = parent.parentElement; } return parent !== null; } else { return false; } } isStateful() { return this.stateKey != null; } getStorage() { switch (this.stateStorage) { case 'local': return window.localStorage; case 'session': return window.sessionStorage; default: throw new Error(this.stateStorage + ' is not a valid value for the state storage, supported values are "local" and "session".'); } } saveState() { this.getStorage().setItem(this.stateKey, JSON.stringify(this._panelSizes)); } restoreState() { const storage = this.getStorage(); const stateString = storage.getItem(this.stateKey); if (stateString) { this._panelSizes = JSON.parse(stateString); let children = [...this.containerViewChild.nativeElement.children].filter(child => DomHandler.hasClass(child, 'p-splitter-panel')); children.forEach((child, i) => { child.style.flexBasis = 'calc(' + this._panelSizes[i] + '% - ' + ((this.panels.length - 1) * this.gutterSize) + 'px)'; }); return true; } return false; } containerClass() { return { 'p-splitter p-component': true, 'p-splitter-horizontal': this.layout === "horizontal", 'p-splitter-vertical': this.layout === "vertical" }; } panelContainerClass() { return { 'p-splitter-panel': true, 'p-splitter-panel-nested': true }; } gutterStyle() { if (this.horizontal()) return { width: this.gutterSize + 'px' }; else return { height: this.gutterSize + 'px' }; } horizontal() { return this.layout === 'horizontal'; } } Splitter.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.0.0", ngImport: i0, type: Splitter, deps: [{ token: i0.ChangeDetectorRef }, { token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Component }); Splitter.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.0.0", type: Splitter, selector: "p-splitter", inputs: { styleClass: "styleClass", panelStyleClass: "panelStyleClass", style: "style", panelStyle: "panelStyle", stateStorage: "stateStorage", stateKey: "stateKey", layout: "layout", gutterSize: "gutterSize", panelSizes: "panelSizes", minSizes: "minSizes" }, outputs: { onResizeEnd: "onResizeEnd", onResizeStart: "onResizeStart" }, host: { properties: { "class.p-splitter-panel-nested": "nested" }, classAttribute: "p-element" }, queries: [{ propertyName: "templates", predicate: PrimeTemplate }], viewQueries: [{ propertyName: "containerViewChild", first: true, predicate: ["container"], descendants: true }], ngImport: i0, template: `
`, isInline: true, styles: [".p-splitter{display:flex;flex-wrap:nowrap}.p-splitter-vertical{flex-direction:column}.p-splitter-panel{flex-grow:1}.p-splitter-panel-nested{display:flex}.p-splitter-panel p-splitter{flex-grow:1}.p-splitter-panel .p-splitter{flex-grow:1;border:0 none}.p-splitter-gutter{flex-grow:0;flex-shrink:0;display:flex;align-items:center;justify-content:center;cursor:col-resize}.p-splitter-horizontal.p-splitter-resizing{cursor:col-resize;-webkit-user-select:none;-ms-user-select:none;user-select:none}.p-splitter-horizontal>.p-splitter-gutter>.p-splitter-gutter-handle{height:24px;width:100%}.p-splitter-horizontal>.p-splitter-gutter{cursor:col-resize}.p-splitter-vertical.p-splitter-resizing{cursor:row-resize;-webkit-user-select:none;-ms-user-select:none;user-select:none}.p-splitter-vertical>.p-splitter-gutter{cursor:row-resize}.p-splitter-vertical>.p-splitter-gutter>.p-splitter-gutter-handle{width:24px;height:100%}\n"], directives: [{ type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { type: i1.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet"] }, { type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.0.0", ngImport: i0, type: Splitter, decorators: [{ type: Component, args: [{ selector: 'p-splitter', template: `
`, encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush, host: { 'class': 'p-element', '[class.p-splitter-panel-nested]': 'nested' }, styles: [".p-splitter{display:flex;flex-wrap:nowrap}.p-splitter-vertical{flex-direction:column}.p-splitter-panel{flex-grow:1}.p-splitter-panel-nested{display:flex}.p-splitter-panel p-splitter{flex-grow:1}.p-splitter-panel .p-splitter{flex-grow:1;border:0 none}.p-splitter-gutter{flex-grow:0;flex-shrink:0;display:flex;align-items:center;justify-content:center;cursor:col-resize}.p-splitter-horizontal.p-splitter-resizing{cursor:col-resize;-webkit-user-select:none;-ms-user-select:none;user-select:none}.p-splitter-horizontal>.p-splitter-gutter>.p-splitter-gutter-handle{height:24px;width:100%}.p-splitter-horizontal>.p-splitter-gutter{cursor:col-resize}.p-splitter-vertical.p-splitter-resizing{cursor:row-resize;-webkit-user-select:none;-ms-user-select:none;user-select:none}.p-splitter-vertical>.p-splitter-gutter{cursor:row-resize}.p-splitter-vertical>.p-splitter-gutter>.p-splitter-gutter-handle{width:24px;height:100%}\n"] }] }], ctorParameters: function () { return [{ type: i0.ChangeDetectorRef }, { type: i0.ElementRef }]; }, propDecorators: { styleClass: [{ type: Input }], panelStyleClass: [{ type: Input }], style: [{ type: Input }], panelStyle: [{ type: Input }], stateStorage: [{ type: Input }], stateKey: [{ type: Input }], layout: [{ type: Input }], gutterSize: [{ type: Input }], panelSizes: [{ type: Input }], minSizes: [{ type: Input }], onResizeEnd: [{ type: Output }], onResizeStart: [{ type: Output }], templates: [{ type: ContentChildren, args: [PrimeTemplate] }], containerViewChild: [{ type: ViewChild, args: ['container', { static: false }] }] } }); class SplitterModule { } SplitterModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.0.0", ngImport: i0, type: SplitterModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); SplitterModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "12.0.0", version: "13.0.0", ngImport: i0, type: SplitterModule, declarations: [Splitter], imports: [CommonModule], exports: [Splitter, SharedModule] }); SplitterModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "13.0.0", ngImport: i0, type: SplitterModule, imports: [[CommonModule], SharedModule] }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.0.0", ngImport: i0, type: SplitterModule, decorators: [{ type: NgModule, args: [{ imports: [CommonModule], exports: [Splitter, SharedModule], declarations: [Splitter] }] }] }); /** * Generated bundle index. Do not edit. */ export { Splitter, SplitterModule };