import {NgModule,Component,Input,Output,EventEmitter,ElementRef,ContentChild} from '@angular/core'; import {CommonModule} from '@angular/common'; import {SharedModule,Footer} from '../common/shared'; import {BlockableUI} from '../common/blockableui'; 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', opacity: 0 })), state('visible', style({ height: '*', opacity: 1 })), transition('visible <=> hidden', animate('400ms cubic-bezier(0.86, 0, 0.07, 1)')) ]) ] }) export class Panel implements BlockableUI { @Input() toggleable: boolean; @Input() header: string; @Input() collapsed: boolean = false; @Input() style: any; @Input() styleClass: string; @Input() expandIcon: string = 'fa-plus'; @Input() collapseIcon: string = 'fa-minus'; @Input() showHeader: boolean = true; @Output() collapsedChange: EventEmitter = new EventEmitter(); @Output() onBeforeToggle: EventEmitter = new EventEmitter(); @Output() onAfterToggle: EventEmitter = new EventEmitter(); @ContentChild(Footer) footerFacet; animating: boolean; id: string = `ui-panel-${idx++}`; constructor(private el: ElementRef) {} toggle(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], exports: [Panel,SharedModule], declarations: [Panel] }) export class PanelModule { }