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: `
`,
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 { }