import {NgModule,Component,Input,Output,EventEmitter,ElementRef,ContentChild,ChangeDetectionStrategy, ViewEncapsulation, ContentChildren, QueryList, TemplateRef, AfterContentInit} from '@angular/core'; import {CommonModule} from '@angular/common'; import {SharedModule,Footer, PrimeTemplate} from 'mirra-ui/api'; import {BlockableUI} from 'mirra-ui/api'; import {RippleModule} from 'mirra-ui/ripple'; import {trigger,state,style,transition,animate} from '@angular/animations'; let idx: number = 0; @Component({ selector: 'p-panel', template: `
{{header}}
`, animations: [ trigger('panelContent', [ state('hidden', style({ height: '0', overflow: 'hidden' })), state('void', style({ height: '{{height}}' }), {params: {height: '0'}}), state('visible', style({ height: '*' })), transition('visible <=> hidden', [style({ overflow: 'hidden'}), animate('{{transitionParams}}')]), transition('void => hidden', animate('{{transitionParams}}')), transition('void => visible', animate('{{transitionParams}}')) ]) ], changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, styleUrls: ['./panel.scss'] }) export class Panel implements AfterContentInit,BlockableUI { @Input() toggleable: boolean; @Input() header: string; @Input() collapsed: boolean = false; @Input() style: any; @Input() styleClass: string; @Input() expandIcon: string = 'far fa-plus'; @Input() collapseIcon: string = 'far fa-minus'; @Input() showHeader: boolean = true; @Input() toggler: string = "icon"; @Output() collapsedChange: EventEmitter = new EventEmitter(); @Output() onBeforeToggle: EventEmitter = new EventEmitter(); @Output() onAfterToggle: EventEmitter = new EventEmitter(); @Input() transitionOptions: string = '400ms cubic-bezier(0.86, 0, 0.07, 1)'; @ContentChild(Footer) footerFacet; @ContentChildren(PrimeTemplate) templates: QueryList; public iconTemplate: TemplateRef; animating: boolean; headerTemplate: TemplateRef; contentTemplate: TemplateRef; footerTemplate: TemplateRef; id: string = `p-panel-${idx++}`; constructor(private el: ElementRef) { } ngAfterContentInit() { this.templates.forEach((item) => { switch(item.getType()) { case 'header': this.headerTemplate = item.template; break; case 'content': this.contentTemplate = item.template; break; case 'footer': this.footerTemplate = item.template; break; case 'icons': this.iconTemplate = item.template; break; default: this.contentTemplate = item.template; break; } }); } onHeaderClick(event: Event) { if (this.toggler === 'header') { this.toggle(event); } } onIconClick(event: Event) { if (this.toggler === 'icon') { this.toggle(event); } } toggle(event: Event) { if (this.animating) { return false; } this.animating = true; this.onBeforeToggle.emit({originalEvent: event, collapsed: this.collapsed}); if (this.toggleable) { if (this.collapsed) this.expand(event); else this.collapse(event); } event.preventDefault(); } expand(event) { this.collapsed = false; this.collapsedChange.emit(this.collapsed); } collapse(event) { this.collapsed = true; this.collapsedChange.emit(this.collapsed); } getBlockableElement(): HTMLElement { return this.el.nativeElement.children[0]; } onToggleDone(event: Event) { this.animating = false; this.onAfterToggle.emit({originalEvent: event, collapsed: this.collapsed}); } } @NgModule({ imports: [CommonModule,SharedModule,RippleModule], exports: [Panel,SharedModule], declarations: [Panel] }) export class PanelModule { }