UNPKG

7.43 kBJavaScriptView Raw
1import { EventEmitter, Component, ChangeDetectionStrategy, ViewEncapsulation, ElementRef, Input, Output, ContentChild, ContentChildren, NgModule } from '@angular/core';
2import { CommonModule } from '@angular/common';
3import { Footer, PrimeTemplate, SharedModule } from 'primeng/api';
4import { RippleModule } from 'primeng/ripple';
5import { trigger, state, style, transition, animate } from '@angular/animations';
6
7let idx = 0;
8class Panel {
9 constructor(el) {
10 this.el = el;
11 this.collapsed = false;
12 this.expandIcon = 'pi pi-plus';
13 this.collapseIcon = 'pi pi-minus';
14 this.showHeader = true;
15 this.toggler = "icon";
16 this.collapsedChange = new EventEmitter();
17 this.onBeforeToggle = new EventEmitter();
18 this.onAfterToggle = new EventEmitter();
19 this.transitionOptions = '400ms cubic-bezier(0.86, 0, 0.07, 1)';
20 this.id = `p-panel-${idx++}`;
21 }
22 ngAfterContentInit() {
23 this.templates.forEach((item) => {
24 switch (item.getType()) {
25 case 'header':
26 this.headerTemplate = item.template;
27 break;
28 case 'content':
29 this.contentTemplate = item.template;
30 break;
31 case 'footer':
32 this.footerTemplate = item.template;
33 break;
34 case 'icons':
35 this.iconTemplate = item.template;
36 break;
37 default:
38 this.contentTemplate = item.template;
39 break;
40 }
41 });
42 }
43 onHeaderClick(event) {
44 if (this.toggler === 'header') {
45 this.toggle(event);
46 }
47 }
48 onIconClick(event) {
49 if (this.toggler === 'icon') {
50 this.toggle(event);
51 }
52 }
53 toggle(event) {
54 if (this.animating) {
55 return false;
56 }
57 this.animating = true;
58 this.onBeforeToggle.emit({ originalEvent: event, collapsed: this.collapsed });
59 if (this.toggleable) {
60 if (this.collapsed)
61 this.expand(event);
62 else
63 this.collapse(event);
64 }
65 event.preventDefault();
66 }
67 expand(event) {
68 this.collapsed = false;
69 this.collapsedChange.emit(this.collapsed);
70 }
71 collapse(event) {
72 this.collapsed = true;
73 this.collapsedChange.emit(this.collapsed);
74 }
75 getBlockableElement() {
76 return this.el.nativeElement.children[0];
77 }
78 onToggleDone(event) {
79 this.animating = false;
80 this.onAfterToggle.emit({ originalEvent: event, collapsed: this.collapsed });
81 }
82}
83Panel.decorators = [
84 { type: Component, args: [{
85 selector: 'p-panel',
86 template: `
87 <div [attr.id]="id" [ngClass]="{'p-panel p-component': true, 'p-panel-toggleable': toggleable}" [ngStyle]="style" [class]="styleClass">
88 <div class="p-panel-header" *ngIf="showHeader" (click)="onHeaderClick($event)" [attr.id]="id + '-titlebar'">
89 <span class="p-panel-title" *ngIf="header" [attr.id]="id + '_header'">{{header}}</span>
90 <ng-content select="p-header"></ng-content>
91 <ng-container *ngTemplateOutlet="headerTemplate"></ng-container>
92 <div class="p-panel-icons">
93 <ng-template *ngTemplateOutlet="iconTemplate"></ng-template>
94 <button *ngIf="toggleable" type="button" [attr.id]="id + '-label'" class="p-panel-header-icon p-panel-toggler p-link" pRipple
95 (click)="onIconClick($event)" (keydown.enter)="onIconClick($event)" [attr.aria-controls]="id + '-content'" role="tab" [attr.aria-expanded]="!collapsed">
96 <span [class]="collapsed ? expandIcon : collapseIcon"></span>
97 </button>
98 </div>
99 </div>
100 <div [attr.id]="id + '-content'" class="p-toggleable-content" [@panelContent]="collapsed ? {value: 'hidden', params: {transitionParams: animating ? transitionOptions : '0ms', height: '0', opacity:'0'}} : {value: 'visible', params: {transitionParams: animating ? transitionOptions : '0ms', height: '*', opacity: '1'}}" (@panelContent.done)="onToggleDone($event)"
101 role="region" [attr.aria-hidden]="collapsed" [attr.aria-labelledby]="id + '-titlebar'">
102 <div class="p-panel-content">
103 <ng-content></ng-content>
104 <ng-container *ngTemplateOutlet="contentTemplate"></ng-container>
105 </div>
106
107 <div class="p-panel-footer" *ngIf="footerFacet || footerTemplate">
108 <ng-content select="p-footer"></ng-content>
109 <ng-container *ngTemplateOutlet="footerTemplate"></ng-container>
110 </div>
111 </div>
112 </div>
113 `,
114 animations: [
115 trigger('panelContent', [
116 state('hidden', style({
117 height: '0',
118 overflow: 'hidden'
119 })),
120 state('void', style({
121 height: '{{height}}'
122 }), { params: { height: '0' } }),
123 state('visible', style({
124 height: '*'
125 })),
126 transition('visible <=> hidden', [style({ overflow: 'hidden' }), animate('{{transitionParams}}')]),
127 transition('void => hidden', animate('{{transitionParams}}')),
128 transition('void => visible', animate('{{transitionParams}}'))
129 ])
130 ],
131 changeDetection: ChangeDetectionStrategy.OnPush,
132 encapsulation: ViewEncapsulation.None,
133 styles: [".p-panel-header{-ms-flex-align:center;-ms-flex-pack:justify;align-items:center;display:-ms-flexbox;display:flex;justify-content:space-between}.p-panel-title{line-height:1}.p-panel-header-icon{-ms-flex-align:center;-ms-flex-pack:center;align-items:center;cursor:pointer;display:-ms-inline-flexbox;display:inline-flex;justify-content:center;overflow:hidden;position:relative;text-decoration:none}"]
134 },] }
135];
136Panel.ctorParameters = () => [
137 { type: ElementRef }
138];
139Panel.propDecorators = {
140 toggleable: [{ type: Input }],
141 header: [{ type: Input }],
142 collapsed: [{ type: Input }],
143 style: [{ type: Input }],
144 styleClass: [{ type: Input }],
145 expandIcon: [{ type: Input }],
146 collapseIcon: [{ type: Input }],
147 showHeader: [{ type: Input }],
148 toggler: [{ type: Input }],
149 collapsedChange: [{ type: Output }],
150 onBeforeToggle: [{ type: Output }],
151 onAfterToggle: [{ type: Output }],
152 transitionOptions: [{ type: Input }],
153 footerFacet: [{ type: ContentChild, args: [Footer,] }],
154 templates: [{ type: ContentChildren, args: [PrimeTemplate,] }]
155};
156class PanelModule {
157}
158PanelModule.decorators = [
159 { type: NgModule, args: [{
160 imports: [CommonModule, SharedModule, RippleModule],
161 exports: [Panel, SharedModule],
162 declarations: [Panel]
163 },] }
164];
165
166/**
167 * Generated bundle index. Do not edit.
168 */
169
170export { Panel, PanelModule };
171//# sourceMappingURL=primeng-panel.js.map