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