UNPKG

truly-ui

Version:

Web Components for Desktop Applications.

128 lines (126 loc) 16.9 kB
/* MIT License Copyright (c) 2019 Temainfo Sistemas Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ import { ViewChild, Input, Component, ViewContainerRef } from '@angular/core'; import { MenuService } from '../core/services/menu.service'; import { TlButton } from '../button/button'; import { FixedPositionDirective } from '../misc/fixed-position.directive'; import * as i0 from "@angular/core"; import * as i1 from "../core/services/menu.service"; import * as i2 from "../misc/fixed-position.directive"; let documentClick; export class TlPopupMenu { constructor(menuService, renderer) { this.menuService = menuService; this.renderer = renderer; this.items = []; this.label = ''; this.icon = ''; this.subItem = ''; this.positionY = 'bellow'; this.overlapTrigger = false; this.positionX = 'before'; this.hover = false; } ngOnInit() { this.listenDocumentClick(); } ngAfterViewInit() { this.validateTarget(); this.listenTrigger(); this.listenTriggerMouseLeave(); this.menuService.setMenuConfig({ label: this.label, icon: this.icon, items: this.items, subItem: this.subItem }, this.wrapperMenuItem, this.renderer); } validateTarget() { if (this.target instanceof TlButton) { this.target = this.target['button'].nativeElement; } if (this.trigger instanceof TlButton) { this.trigger = this.trigger['button'].nativeElement; } if (!this.target) { throw new Error('The [target] property is required'); } } listenDocumentClick() { documentClick = this.renderer.listen(document, 'click', ($event) => { if (($event.path.indexOf(this.target) < 0) && ($event.path.indexOf(this.trigger) < 0)) { this.menuService.resetMenu(); } }); } listenTrigger() { const element = this.trigger ? this.trigger : this.target; const eventType = this.hover ? 'mouseenter' : 'click'; this.renderer.listen(element, eventType, () => { if (this.menuService.created) { this.menuService.resetMenu(); return; } this.menuService.createList(); this.fixedPos.setPositioning(); }); } listenTriggerMouseLeave() { if (this.hover) { const element = this.trigger ? this.trigger : this.target; this.renderer.listen(element, 'mouseleave', ($event) => { if (!$event.relatedTarget.getAttribute('menuitem')) { this.menuService.resetMenu(); } }); } } ngOnDestroy() { documentClick(); } } /** @nocollapse */ TlPopupMenu.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: TlPopupMenu, deps: [{ token: i1.MenuService }, { token: i0.Renderer2 }], target: i0.ɵɵFactoryTarget.Component }); /** @nocollapse */ TlPopupMenu.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.10", type: TlPopupMenu, selector: "tl-popupmenu", inputs: { items: "items", label: "label", icon: "icon", subItem: "subItem", trigger: "trigger", target: "target", positionY: "positionY", overlapTrigger: "overlapTrigger", positionX: "positionX", hover: "hover" }, providers: [MenuService], viewQueries: [{ propertyName: "wrapperMenuItem", first: true, predicate: ["wrapperMenuItem"], descendants: true, read: ViewContainerRef, static: true }, { propertyName: "fixedPos", first: true, predicate: FixedPositionDirective, descendants: true, static: true }], ngImport: i0, template: "<div class=\"ui-wrapper-menu\" fixedPosition [target]=\"target\"\n [positionY]=\"positionY\" [overlapTrigger]=\"overlapTrigger\" [positionX]=\"positionX\">\n <div class=\"wrapper-menu-item\" #wrapperMenuItem></div>\n</div>\n\n\n", styles: [".ui-wrapper-menu{position:fixed;z-index:1000}.wrapper-menu-item{position:relative;width:100%;height:100%}\n"], dependencies: [{ kind: "directive", type: i2.FixedPositionDirective, selector: "[fixedPosition]", inputs: ["positionY", "positionX", "overlapTrigger", "target"] }] }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: TlPopupMenu, decorators: [{ type: Component, args: [{ selector: 'tl-popupmenu', providers: [MenuService], template: "<div class=\"ui-wrapper-menu\" fixedPosition [target]=\"target\"\n [positionY]=\"positionY\" [overlapTrigger]=\"overlapTrigger\" [positionX]=\"positionX\">\n <div class=\"wrapper-menu-item\" #wrapperMenuItem></div>\n</div>\n\n\n", styles: [".ui-wrapper-menu{position:fixed;z-index:1000}.wrapper-menu-item{position:relative;width:100%;height:100%}\n"] }] }], ctorParameters: function () { return [{ type: i1.MenuService }, { type: i0.Renderer2 }]; }, propDecorators: { items: [{ type: Input }], label: [{ type: Input }], icon: [{ type: Input }], subItem: [{ type: Input }], trigger: [{ type: Input }], target: [{ type: Input }], positionY: [{ type: Input }], overlapTrigger: [{ type: Input }], positionX: [{ type: Input }], hover: [{ type: Input }], wrapperMenuItem: [{ type: ViewChild, args: ['wrapperMenuItem', { read: ViewContainerRef, static: true }] }], fixedPos: [{ type: ViewChild, args: [FixedPositionDirective, { static: true }] }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicG9wdXBtZW51LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvdHJ1bHktdWkvc3JjL2NvbXBvbmVudHMvcG9wdXBtZW51L3BvcHVwbWVudS50cyIsIi4uLy4uLy4uLy4uL3Byb2plY3RzL3RydWx5LXVpL3NyYy9jb21wb25lbnRzL3BvcHVwbWVudS9wb3B1cG1lbnUuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FvQkc7QUFDSCxPQUFPLEVBQ0wsU0FBUyxFQUFFLEtBQUssRUFBaUIsU0FBUyxFQUFhLGdCQUFnQixFQUV4RSxNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFDNUQsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQzVDLE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxNQUFNLGtDQUFrQyxDQUFDOzs7O0FBRTFFLElBQUksYUFBYSxDQUFDO0FBUWxCLE1BQU0sT0FBTyxXQUFXO0lBMEJ0QixZQUFvQixXQUF3QixFQUFVLFFBQW1CO1FBQXJELGdCQUFXLEdBQVgsV0FBVyxDQUFhO1FBQVUsYUFBUSxHQUFSLFFBQVEsQ0FBVztRQXhCaEUsVUFBSyxHQUFHLEVBQUUsQ0FBQztRQUVYLFVBQUssR0FBRyxFQUFFLENBQUM7UUFFWCxTQUFJLEdBQUcsRUFBRSxDQUFDO1FBRVYsWUFBTyxHQUFHLEVBQUUsQ0FBQztRQU1iLGNBQVMsR0FBRyxRQUFRLENBQUM7UUFFckIsbUJBQWMsR0FBRyxLQUFLLENBQUM7UUFFdkIsY0FBUyxHQUFHLFFBQVEsQ0FBQztRQUVyQixVQUFLLEdBQUcsS0FBSyxDQUFDO0lBTXFELENBQUM7SUFFN0UsUUFBUTtRQUNOLElBQUksQ0FBQyxtQkFBbUIsRUFBRSxDQUFDO0lBQzdCLENBQUM7SUFFRCxlQUFlO1FBQ2IsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFD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RCxXQUFXO1FBQ1QsYUFBYSxFQUFFLENBQUM7SUFDbEIsQ0FBQzs7NEhBdEZVLFdBQVc7Z0hBQVgsV0FBVyw2UEFGWCxDQUFDLFdBQVcsQ0FBQyx5SEF3QmUsZ0JBQWdCLHNFQUUzQyxzQkFBc0IsOERDN0RwQyw0T0FNQTs0RkQrQmEsV0FBVztrQkFOdkIsU0FBUzsrQkFDRSxjQUFjLGFBR2IsQ0FBQyxXQUFXLENBQUM7MEhBSWYsS0FBSztzQkFBYixLQUFLO2dCQUVHLEtBQUs7c0JBQWIsS0FBSztnQkFFRyxJQUFJO3NCQUFaLEtBQUs7Z0JBRUcsT0FBTztzQkFBZixLQUFLO2dCQUVHLE9BQU87c0JBQWYsS0FBSztnQkFFRyxNQUFNO3NCQUFkLEtBQUs7Z0JBRUcsU0FBUztzQkFBakIsS0FBSztnQkFFRyxjQUFjO3NCQUF0QixLQUFLO2dCQUVHLFNBQVM7c0JBQWpCLEtBQUs7Z0JBRUcsS0FBSztzQkFBYixLQUFLO2dCQUVvRSxlQUFlO3NCQUF4RixTQUFTO3VCQUFFLGlCQUFpQixFQUFFLEVBQUUsSUFBSSxFQUFFLGdCQUFnQixFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUU7Z0JBRWxCLFFBQVE7c0JBQTVELFNBQVM7dUJBQUUsc0JBQXNCLEVBQUUsRUFBQyxNQUFNLEVBQUUsSUFBSSxFQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLypcbiBNSVQgTGljZW5zZVxuXG4gQ29weXJpZ2h0IChjKSAyMDE5IFRlbWFpbmZvIFNpc3RlbWFzXG5cbiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5XG4gb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgXCJTb2Z0d2FyZVwiKSwgdG8gZGVhbFxuIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHNcbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsXG4gY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzXG4gZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczpcbiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGxcbiBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1JcbiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSxcbiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEVcbiBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSXG4gTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSxcbiBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRVxuIFNPRlRXQVJFLlxuICovXG5pbXBvcnQge1xuICBWaWV3Q2hpbGQsIElucHV0LCBBZnRlclZpZXdJbml0LCBDb21wb25lbnQsIE9uRGVzdHJveSwgVmlld0NvbnRhaW5lclJlZiwgUmVuZGVyZXIyLFxuICBPbkluaXRcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBNZW51U2VydmljZSB9IGZyb20gJy4uL2NvcmUvc2VydmljZXMvbWVudS5zZXJ2aWNlJztcbmltcG9ydCB7IFRsQnV0dG9uIH0gZnJvbSAnLi4vYnV0dG9uL2J1dHRvbic7XG5pbXBvcnQgeyBGaXhlZFBvc2l0aW9uRGlyZWN0aXZlIH0gZnJvbSAnLi4vbWlzYy9maXhlZC1wb3NpdGlvbi5kaXJlY3RpdmUnO1xuXG5sZXQgZG9jdW1lbnRDbGljaztcblxuQENvbXBvbmVudCgge1xuICBzZWxlY3RvcjogJ3RsLXBvcHVwbWVudScsXG4gIHRlbXBsYXRlVXJsOiAnLi9wb3B1cG1lbnUuaHRtbCcsXG4gIHN0eWxlVXJsczogWyAnLi9wb3B1cG1lbnUuc2NzcycgXSxcbiAgcHJvdmlkZXJzOiBbTWVudVNlcnZpY2VdXG59IClcbmV4cG9ydCBjbGFzcyBUbFBvcHVwTWVudSBpbXBsZW1lbnRzIEFmdGVyVmlld0luaXQsIE9uSW5pdCwgT25EZXN0cm95IHtcblxuICBASW5wdXQoKSBpdGVtcyA9IFtdO1xuXG4gIEBJbnB1dCgpIGxhYmVsID0gJyc7XG5cbiAgQElucHV0KCkgaWNvbiA9ICcnO1xuXG4gIEBJbnB1dCgpIHN1Ykl0ZW0gPSAnJztcblxuICBASW5wdXQoKSB0cmlnZ2VyO1xuXG4gIEBJbnB1dCgpIHRhcmdldDtcblxuICBASW5wdXQoKSBwb3NpdGlvblkgPSAnYmVsbG93JztcblxuICBASW5wdXQoKSBvdmVybGFwVHJpZ2dlciA9IGZhbHNlO1xuXG4gIEBJbnB1dCgpIHBvc2l0aW9uWCA9ICdiZWZvcmUnO1xuXG4gIEBJbnB1dCgpIGhvdmVyID0gZmFsc2U7XG5cbiAgQFZpZXdDaGlsZCggJ3dyYXBwZXJNZW51SXRlbScsIHsgcmVhZDogVmlld0NvbnRhaW5lclJlZiwgc3RhdGljOiB0cnVlIH0gKSB3cmFwcGVyTWVudUl0ZW06IFZpZXdDb250YWluZXJSZWY7XG5cbiAgQFZpZXdDaGlsZCggRml4ZWRQb3NpdGlvbkRpcmVjdGl2ZSwge3N0YXRpYzogdHJ1ZX0gKSBmaXhlZFBvczogRml4ZWRQb3NpdGlvbkRpcmVjdGl2ZTtcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIG1lbnVTZXJ2aWNlOiBNZW51U2VydmljZSwgcHJpdmF0ZSByZW5kZXJlcjogUmVuZGVyZXIyKSB7fVxuXG4gIG5nT25Jbml0KCkge1xuICAgIHRoaXMubGlzdGVuRG9jdW1lbnRDbGljaygpO1xuICB9XG5cbiAgbmdBZnRlclZpZXdJbml0KCkge1xuICAgIHRoaXMudmFsaWRhdGVUYXJnZXQoKTtcbiAgICB0aGlzLmxpc3RlblRyaWdnZXIoKTtcbiAgICB0aGlzLmxpc3RlblRyaWdnZXJNb3VzZUxlYXZlKCk7XG4gICAgdGhpcy5tZW51U2VydmljZS5zZXRNZW51Q29uZmlnKHsgbGFiZWw6IHRoaXMubGFiZWwsIGljb246IHRoaXMuaWNvbiwgaXRlbXM6IHRoaXMuaXRlbXMsIHN1Ykl0ZW06IHRoaXMuc3ViSXRlbX0sXG4gICAgICB0aGlzLndyYXBwZXJNZW51SXRlbSwgdGhpcy5yZW5kZXJlcik7XG4gIH1cblxuICB2YWxpZGF0ZVRhcmdldCgpIHtcbiAgICBpZiAodGhpcy50YXJnZXQgaW5zdGFuY2VvZiBUbEJ1dHRvbikge1xuICAgICAgdGhpcy50YXJnZXQgPSB0aGlzLnRhcmdldFsnYnV0dG9uJ10ubmF0aXZlRWxlbWVudDtcbiAgICB9XG4gICAgaWYgKHRoaXMudHJpZ2dlciBpbnN0YW5jZW9mIFRsQnV0dG9uKSB7XG4gICAgICB0aGlzLnRyaWdnZXIgPSB0aGlzLnRyaWdnZXJbJ2J1dHRvbiddLm5hdGl2ZUVsZW1lbnQ7XG4gICAgfVxuICAgIGlmICghdGhpcy50YXJnZXQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignVGhlIFt0YXJnZXRdIHByb3BlcnR5IGlzIHJlcXVpcmVkJyk7XG4gICAgfVxuICB9XG5cbiAgbGlzdGVuRG9jdW1lbnRDbGljaygpIHtcbiAgICBkb2N1bWVudENsaWNrID0gdGhpcy5yZW5kZXJlci5saXN0ZW4oIGRvY3VtZW50LCAnY2xpY2snLCAoICRldmVudCApID0+IHtcbiAgICAgIGlmICgoJGV2ZW50LnBhdGguaW5kZXhPZih0aGlzLnRhcmdldCkgPCAwKSAmJiAoJGV2ZW50LnBhdGguaW5kZXhPZih0aGlzLnRyaWdnZXIpIDwgMCkpIHtcbiAgICAgICAgdGhpcy5tZW51U2VydmljZS5yZXNldE1lbnUoKTtcbiAgICAgIH1cbiAgICB9ICk7XG4gIH1cblxuICBsaXN0ZW5UcmlnZ2VyKCkge1xuICAgIGNvbnN0IGVsZW1lbnQgPSB0aGlzLnRyaWdnZXIgPyB0aGlzLnRyaWdnZXIgOiB0aGlzLnRhcmdldDtcbiAgICBjb25zdCBldmVudFR5cGUgPSB0aGlzLmhvdmVyID8gJ21vdXNlZW50ZXInIDogJ2NsaWNrJztcbiAgICB0aGlzLnJlbmRlcmVyLmxpc3RlbihlbGVtZW50LCBldmVudFR5cGUsICgpID0+IHtcbiAgICAgIGlmICh0aGlzLm1lbnVTZXJ2aWNlLmNyZWF0ZWQpIHtcbiAgICAgICAgdGhpcy5tZW51U2VydmljZS5yZXNldE1lbnUoKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgdGhpcy5tZW51U2VydmljZS5jcmVhdGVMaXN0KCk7XG4gICAgICB0aGlzLmZpeGVkUG9zLnNldFBvc2l0aW9uaW5nKCk7XG4gICAgfSk7XG4gIH1cblxuICBsaXN0ZW5UcmlnZ2VyTW91c2VMZWF2ZSgpIHtcbiAgICBpZiAodGhpcy5ob3Zlcikge1xuICAgICAgY29uc3QgZWxlbWVudCA9IHRoaXMudHJpZ2dlciA/IHRoaXMudHJpZ2dlciA6IHRoaXMudGFyZ2V0O1xuICAgICAgdGhpcy5yZW5kZXJlci5saXN0ZW4oZWxlbWVudCwgJ21vdXNlbGVhdmUnLCAoJGV2ZW50KSA9PiB7XG4gICAgICAgIGlmICghJGV2ZW50LnJlbGF0ZWRUYXJnZXQuZ2V0QXR0cmlidXRlKCdtZW51aXRlbScpKSB7XG4gICAgICAgICAgdGhpcy5tZW51U2VydmljZS5yZXNldE1lbnUoKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgbmdPbkRlc3Ryb3koKSB7XG4gICAgZG9jdW1lbnRDbGljaygpO1xuICB9XG5cbn1cbiIsIjxkaXYgY2xhc3M9XCJ1aS13cmFwcGVyLW1lbnVcIiBmaXhlZFBvc2l0aW9uIFt0YXJnZXRdPVwidGFyZ2V0XCJcbiAgICAgW3Bvc2l0aW9uWV09XCJwb3NpdGlvbllcIiBbb3ZlcmxhcFRyaWdnZXJdPVwib3ZlcmxhcFRyaWdnZXJcIiBbcG9zaXRpb25YXT1cInBvc2l0aW9uWFwiPlxuICAgPGRpdiBjbGFzcz1cIndyYXBwZXItbWVudS1pdGVtXCIgI3dyYXBwZXJNZW51SXRlbT48L2Rpdj5cbjwvZGl2PlxuXG5cbiJdfQ==