UNPKG

primeng

Version:

[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT) [![npm version](https://badge.fury.io/js/primeng.svg)](https://badge.fury.io/js/primeng) [![npm downloads](https://img.shields.io/npm/dm/primeng.sv

224 lines (220 loc) 8.24 kB
import { Directive, ElementRef, Input, EventEmitter, Component, ChangeDetectionStrategy, ViewEncapsulation, ContentChildren, Output, NgModule } from '@angular/core'; import { DomHandler } from 'primeng/dom'; import { CommonModule } from '@angular/common'; import { RippleModule } from 'primeng/ripple'; import { PrimeTemplate } from 'primeng/api'; class ButtonDirective { constructor(el) { this.el = el; this.iconPos = 'left'; this.loadingIcon = "pi pi-spinner pi-spin"; this._loading = false; } ngAfterViewInit() { this._initialStyleClass = this.el.nativeElement.className; DomHandler.addMultipleClasses(this.el.nativeElement, this.getStyleClass()); if (this.icon) { this.createIconEl(); } let labelElement = document.createElement("span"); if (this.icon && !this.label) { labelElement.setAttribute('aria-hidden', 'true'); } labelElement.className = 'p-button-label'; if (this.label) labelElement.appendChild(document.createTextNode(this.label)); else labelElement.innerHTML = '&nbsp;'; this.el.nativeElement.appendChild(labelElement); this.initialized = true; } getStyleClass() { let styleClass = 'p-button p-component'; if (this.icon && !this.label) { styleClass = styleClass + ' p-button-icon-only'; } if (this.loading) { styleClass = styleClass + ' p-disabled p-button-loading'; if (!this.icon && this.label) styleClass = styleClass + ' p-button-loading-label-only'; } return styleClass; } setStyleClass() { let styleClass = this.getStyleClass(); this.el.nativeElement.className = styleClass + ' ' + this._initialStyleClass; } createIconEl() { let iconElement = document.createElement("span"); iconElement.className = 'p-button-icon'; iconElement.setAttribute("aria-hidden", "true"); let iconPosClass = this.label ? 'p-button-icon-' + this.iconPos : null; if (iconPosClass) { DomHandler.addClass(iconElement, iconPosClass); } DomHandler.addMultipleClasses(iconElement, this.getIconClass()); let labelEl = DomHandler.findSingle(this.el.nativeElement, '.p-button-label'); if (labelEl) this.el.nativeElement.insertBefore(iconElement, labelEl); else this.el.nativeElement.appendChild(iconElement); } getIconClass() { return this.loading ? 'p-button-loading-icon ' + this.loadingIcon : this._icon; } setIconClass() { let iconElement = DomHandler.findSingle(this.el.nativeElement, '.p-button-icon'); if (iconElement) { if (this.iconPos) iconElement.className = 'p-button-icon p-button-icon-' + this.iconPos + ' ' + this.getIconClass(); else iconElement.className = 'p-button-icon ' + this.getIconClass(); } else { this.createIconEl(); } } removeIconElement() { let iconElement = DomHandler.findSingle(this.el.nativeElement, '.p-button-icon'); this.el.nativeElement.removeChild(iconElement); } get label() { return this._label; } set label(val) { this._label = val; if (this.initialized) { DomHandler.findSingle(this.el.nativeElement, '.p-button-label').textContent = this._label || '&nbsp;'; this.setStyleClass(); } } get icon() { return this._icon; } set icon(val) { this._icon = val; if (this.initialized) { this.setIconClass(); this.setStyleClass(); } } get loading() { return this._loading; } set loading(val) { this._loading = val; if (this.initialized) { if (this.loading || this.icon) this.setIconClass(); else this.removeIconElement(); this.setStyleClass(); } } ngOnDestroy() { this.initialized = false; } } ButtonDirective.decorators = [ { type: Directive, args: [{ selector: '[pButton]' },] } ]; ButtonDirective.ctorParameters = () => [ { type: ElementRef } ]; ButtonDirective.propDecorators = { iconPos: [{ type: Input }], loadingIcon: [{ type: Input }], label: [{ type: Input }], icon: [{ type: Input }], loading: [{ type: Input }] }; class Button { constructor() { this.type = "button"; this.iconPos = 'left'; this.loading = false; this.loadingIcon = "pi pi-spinner pi-spin"; this.onClick = new EventEmitter(); this.onFocus = new EventEmitter(); this.onBlur = new EventEmitter(); } ngAfterContentInit() { this.templates.forEach((item) => { switch (item.getType()) { case 'content': this.contentTemplate = item.template; break; default: this.contentTemplate = item.template; break; } }); } badgeStyleClass() { return { 'p-badge p-component': true, 'p-badge-no-gutter': this.badge && String(this.badge).length === 1 }; } } Button.decorators = [ { type: Component, args: [{ selector: 'p-button', template: ` <button [attr.type]="type" [class]="styleClass" [ngStyle]="style" [disabled]="disabled || loading" [ngClass]="{'p-button p-component':true, 'p-button-icon-only': (icon && !label), 'p-button-vertical': (iconPos === 'top' || iconPos === 'bottom') && label, 'p-disabled': this.disabled || this.loading, 'p-button-loading': this.loading, 'p-button-loading-label-only': this.loading && !this.icon && this.label}" (click)="onClick.emit($event)" (focus)="onFocus.emit($event)" (blur)="onBlur.emit($event)" pRipple> <ng-content></ng-content> <ng-container *ngTemplateOutlet="contentTemplate"></ng-container> <span [ngClass]="{'p-button-icon': true, 'p-button-icon-left': iconPos === 'left' && label, 'p-button-icon-right': iconPos === 'right' && label, 'p-button-icon-top': iconPos === 'top' && label, 'p-button-icon-bottom': iconPos === 'bottom' && label}" [class]="loading ? 'p-button-loading-icon ' + loadingIcon : icon" *ngIf="!contentTemplate && (icon||loading)" [attr.aria-hidden]="true"></span> <span class="p-button-label" [attr.aria-hidden]="icon && !label" *ngIf="!contentTemplate">{{label||'&nbsp;'}}</span> <span [ngClass]="badgeStyleClass()" [class]="badgeClass" *ngIf="!contentTemplate && badge">{{badge}}</span> </button> `, changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None },] } ]; Button.propDecorators = { type: [{ type: Input }], iconPos: [{ type: Input }], icon: [{ type: Input }], badge: [{ type: Input }], label: [{ type: Input }], disabled: [{ type: Input }], loading: [{ type: Input }], loadingIcon: [{ type: Input }], style: [{ type: Input }], styleClass: [{ type: Input }], badgeClass: [{ type: Input }], templates: [{ type: ContentChildren, args: [PrimeTemplate,] }], onClick: [{ type: Output }], onFocus: [{ type: Output }], onBlur: [{ type: Output }] }; class ButtonModule { } ButtonModule.decorators = [ { type: NgModule, args: [{ imports: [CommonModule, RippleModule], exports: [ButtonDirective, Button], declarations: [ButtonDirective, Button] },] } ]; /** * Generated bundle index. Do not edit. */ export { Button, ButtonDirective, ButtonModule }; //# sourceMappingURL=primeng-button.js.map