@kushki/ng-suka
Version:
<p align="center"> <h1 align="center">Suka Components Angular</h1> <p align="center"> An Angular implementation of the Suka Design System </p> </p>
242 lines (240 loc) • 16.2 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
import { Component, Input, HostBinding, Output, EventEmitter, Host, TemplateRef } from '@angular/core';
import { Accordion } from './accordion.component';
import { takeWhile } from 'rxjs/operators';
export class AccordionItem {
/**
* @param {?} accordion
*/
constructor(accordion) {
this.accordion = accordion;
/**
* Sets the accordion title. Can be a `string` or a `TemplateRef`. Defaults to Title plus the current accordion item count.
*/
this.title = `Title ${AccordionItem.accordionItemCount}`;
/**
* Used to set a custom id to the element. Defaults to a counter
*/
this.id = `accordion-item-${AccordionItem.accordionItemCount}`;
/**
* Skeleton state. Set to `true` to display a skeleton accordion.
*/
this.skeleton = false;
/**
* Emits an event when the accordion item is opened.
*/
this.opened = new EventEmitter();
/**
* Emits an event when the accordion item is closed.
*/
this.closed = new EventEmitter();
this.itemClass = true;
/**
* Sets if the item is expanded.
*/
this.expanded = false;
this.itemType = 'list-item';
this.role = 'heading';
this.ariaLevel = 3;
this.alive = true;
AccordionItem.accordionItemCount++;
}
/**
* Toggles the accordion opened state.
* @return {?}
*/
toggle() {
if (!this.skeleton) {
if (!this.expanded) {
if (!this.accordion.multi) {
this.accordion.openCloseItems.next(true);
}
this.open();
}
else {
this.close();
}
}
}
/**
* @protected
* @return {?}
*/
open() {
if (!this.expanded) {
this.opened.emit({ id: this.id });
}
this.expanded = true;
}
/**
* @protected
* @return {?}
*/
close() {
if (this.expanded) {
this.closed.emit({ id: this.id });
}
this.expanded = false;
}
/**
* @return {?}
*/
ngOnInit() {
this.openSubscription = this.accordion.openCloseItems
.pipe(takeWhile((/**
* @return {?}
*/
() => this.alive)))
.subscribe((/**
* @param {?} collapsed
* @return {?}
*/
collapsed => {
if (!this.skeleton) {
collapsed ? this.close() : this.open();
}
}));
this.skeletonSubscription = this.accordion.skeletons
.pipe(takeWhile((/**
* @return {?}
*/
() => this.alive)))
.subscribe((/**
* @param {?} skeletonValue
* @return {?}
*/
skeletonValue => this.skeleton = skeletonValue));
this.skeleton = this.accordion.skeleton;
}
/**
* @return {?}
*/
ngOnDestroy() {
this.alive = false;
this.openSubscription.unsubscribe();
this.skeletonSubscription.unsubscribe();
}
/**
* @param {?} value
* @return {?}
*/
isTemplate(value) {
return value instanceof TemplateRef;
}
}
AccordionItem.accordionItemCount = 0;
AccordionItem.decorators = [
{ type: Component, args: [{
selector: 'suka-accordion-item',
template: `
<button
[attr.aria-expanded]="expanded"
[attr.aria-controls]="id"
(click)="toggle()"
class="accordion__heading">
<suka-icon icon="chevron-down" class="accordion__arrow"></suka-icon>
<div *ngIf="isTemplate(title) && !skeleton" class="accordion__title-content">
<ng-template [ngTemplateOutlet]="title"></ng-template>
</div>
<p
*ngIf="!isTemplate(title)"
class="accordion__title"
[ngClass]="{
'skeleton__text': skeleton
}">
{{!skeleton ? title : null}}
</p>
</button>
<div [id]="id" class="accordion__content">
<ng-content *ngIf="!skeleton; else skeletonTemplate"></ng-content>
<ng-template #skeletonTemplate>
<p class="skeleton__text" style="width: 90%"></p>
<p class="skeleton__text" style="width: 80%"></p>
<p class="skeleton__text" style="width: 95%"></p>
</ng-template>
</div>
`
}] }
];
/** @nocollapse */
AccordionItem.ctorParameters = () => [
{ type: Accordion, decorators: [{ type: Host }] }
];
AccordionItem.propDecorators = {
title: [{ type: Input }],
id: [{ type: Input }],
skeleton: [{ type: Input }],
opened: [{ type: Output }],
closed: [{ type: Output }],
itemClass: [{ type: HostBinding, args: ['class.accordion__item',] }],
expanded: [{ type: HostBinding, args: ['class.accordion__item--active',] }, { type: Input }],
itemType: [{ type: HostBinding, args: ['style.display',] }],
role: [{ type: HostBinding, args: ['attr.role',] }],
ariaLevel: [{ type: HostBinding, args: ['attr.aria-level',] }, { type: Input }]
};
if (false) {
/** @type {?} */
AccordionItem.accordionItemCount;
/**
* Sets the accordion title. Can be a `string` or a `TemplateRef`. Defaults to Title plus the current accordion item count.
* @type {?}
*/
AccordionItem.prototype.title;
/**
* Used to set a custom id to the element. Defaults to a counter
* @type {?}
*/
AccordionItem.prototype.id;
/**
* Skeleton state. Set to `true` to display a skeleton accordion.
* @type {?}
*/
AccordionItem.prototype.skeleton;
/**
* Emits an event when the accordion item is opened.
* @type {?}
*/
AccordionItem.prototype.opened;
/**
* Emits an event when the accordion item is closed.
* @type {?}
*/
AccordionItem.prototype.closed;
/** @type {?} */
AccordionItem.prototype.itemClass;
/**
* Sets if the item is expanded.
* @type {?}
*/
AccordionItem.prototype.expanded;
/** @type {?} */
AccordionItem.prototype.itemType;
/** @type {?} */
AccordionItem.prototype.role;
/** @type {?} */
AccordionItem.prototype.ariaLevel;
/**
* @type {?}
* @private
*/
AccordionItem.prototype.alive;
/**
* @type {?}
* @private
*/
AccordionItem.prototype.skeletonSubscription;
/**
* @type {?}
* @private
*/
AccordionItem.prototype.openSubscription;
/**
* @type {?}
* @private
*/
AccordionItem.prototype.accordion;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWNjb3JkaW9uLWl0ZW0uY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6Im5nOi8vQGt1c2hraS9uZy1zdWthLyIsInNvdXJjZXMiOlsibGliL2FjY29yZGlvbi9hY2NvcmRpb24taXRlbS5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7OztBQUFBLE9BQU8sRUFDTCxTQUFTLEVBQ1QsS0FBSyxFQUNMLFdBQVcsRUFDWCxNQUFNLEVBQ04sWUFBWSxFQUNaLElBQUksRUFHSixXQUFXLEVBQ1osTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQ2xELE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQW9DM0MsTUFBTSxPQUFPLGFBQWE7Ozs7SUEwQ3hCLFlBQTRCLFNBQW9CO1FBQXBCLGNBQVMsR0FBVCxTQUFTLENBQVc7Ozs7UUFwQ3ZDLFVBQUssR0FBOEIsU0FBUyxhQUFhLENBQUMsa0JBQWtCLEVBQUUsQ0FBQzs7OztRQUsvRSxPQUFFLEdBQUcsa0JBQWtCLGFBQWEsQ0FBQyxrQkFBa0IsRUFBRSxDQUFDOzs7O1FBSzFELGFBQVEsR0FBRyxLQUFLLENBQUM7Ozs7UUFLaEIsV0FBTSxHQUFHLElBQUksWUFBWSxFQUFFLENBQUM7Ozs7UUFLNUIsV0FBTSxHQUFHLElBQUksWUFBWSxFQUFFLENBQUM7UUFFQSxjQUFTLEdBQUcsSUFBSSxDQUFDOzs7O1FBS0EsYUFBUSxHQUFHLEtBQUssQ0FBQztRQUMxQyxhQUFRLEdBQUcsV0FBVyxDQUFDO1FBQzNCLFNBQUksR0FBRyxTQUFTLENBQUM7UUFDRixjQUFTLEdBQUcsQ0FBQyxDQUFDO1FBRS9DLFVBQUssR0FBRyxJQUFJLENBQUM7UUFLbkIsYUFBYSxDQUFDLGtCQUFrQixFQUFFLENBQUM7SUFDckMsQ0FBQzs7Ozs7SUFNTSxNQUFNO1FBQ1gsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUU7WUFDbEIsSUFBSSxD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SzFCLCtCQUFzQzs7Ozs7SUFLdEMsK0JBQXNDOztJQUV0QyxrQ0FBdUQ7Ozs7O0lBS3ZELGlDQUF3RTs7SUFDeEUsaUNBQXFEOztJQUNyRCw2QkFBMkM7O0lBQzNDLGtDQUF1RDs7Ozs7SUFFdkQsOEJBQXFCOzs7OztJQUNyQiw2Q0FBMkM7Ozs7O0lBQzNDLHlDQUF1Qzs7Ozs7SUFFM0Isa0NBQW9DIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQ29tcG9uZW50LFxuICBJbnB1dCxcbiAgSG9zdEJpbmRpbmcsXG4gIE91dHB1dCxcbiAgRXZlbnRFbWl0dGVyLFxuICBIb3N0LFxuICBPbkluaXQsXG4gIE9uRGVzdHJveSxcbiAgVGVtcGxhdGVSZWZcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBBY2NvcmRpb24gfSBmcm9tICcuL2FjY29yZGlvbi5jb21wb25lbnQnO1xuaW1wb3J0IHsgdGFrZVdoaWxlIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHsgU3Vic2NyaXB0aW9uIH0gZnJvbSAncnhqcyc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ3N1a2EtYWNjb3JkaW9uLWl0ZW0nLFxuICB0ZW1wbGF0ZTogYFxuICAgIDxidXR0b25cbiAgICAgIFthdHRyLmFyaWEtZXhwYW5kZWRdPVwiZXhwYW5kZWRcIlxuICAgICAgW2F0dHIuYXJpYS1jb250cm9sc109XCJpZFwiXG4gICAgICAoY2xpY2spPVwidG9nZ2xlKClcIlxuICAgICAgY2xhc3M9XCJhY2NvcmRpb25fX2hlYWRpbmdcIj5cbiAgICAgIDxzdWthLWljb24gaWNvbj1cImNoZXZyb24tZG93blwiIGNsYXNzPVwiYWNjb3JkaW9uX19hcnJvd1wiPjwvc3VrYS1pY29uPlxuXG4gICAgICA8ZGl2ICpuZ0lmPVwiaXNUZW1wbGF0ZSh0aXRsZSkgJiYgIXNrZWxldG9uXCIgY2xhc3M9XCJhY2NvcmRpb25fX3RpdGxlLWNvbnRlbnRcIj5cbiAgICAgICAgPG5nLXRlbXBsYXRlIFtuZ1RlbXBsYXRlT3V0bGV0XT1cInRpdGxlXCI+PC9uZy10ZW1wbGF0ZT5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8cFxuICAgICAgICAqbmdJZj1cIiFpc1RlbXBsYXRlKHRpdGxlKVwiXG4gICAgICAgIGNsYXNzPVwiYWNjb3JkaW9uX190aXRsZVwiXG4gICAgICAgIFtuZ0NsYXNzXT1cIntcbiAgICAgICAgICAnc2tlbGV0b25fX3RleHQnOiBza2VsZXRvblxuICAgICAgICB9XCI+XG4gICAgICAgIHt7IXNrZWxldG9uID8gdGl0bGUgOiBudWxsfX1cbiAgICAgIDwvcD5cbiAgICA8L2J1dHRvbj5cbiAgICA8ZGl2IFtpZF09XCJpZFwiIGNsYXNzPVwiYWNjb3JkaW9uX19jb250ZW50XCI+XG4gICAgICA8bmctY29udGVudCAqbmdJZj1cIiFza2VsZXRvbjsgZWxzZSBza2VsZXRvblRlbXBsYXRlXCI+PC9uZy1jb250ZW50PlxuICAgICAgPG5nLXRlbXBsYXRlICNza2VsZXRvblRlbXBsYXRlPlxuICAgICAgICA8cCBjbGFzcz1cInNrZWxldG9uX190ZXh0XCIgc3R5bGU9XCJ3aWR0aDogOTAlXCI+PC9wPlxuICAgICAgICA8cCBjbGFzcz1cInNrZWxldG9uX190ZXh0XCIgc3R5bGU9XCJ3aWR0aDogODAlXCI+PC9wPlxuICAgICAgICA8cCBjbGFzcz1cInNrZWxldG9uX190ZXh0XCIgc3R5bGU9XCJ3aWR0aDogOTUlXCI+PC9wPlxuICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICA8L2Rpdj5cbiAgYCxcbn0pXG5leHBvcnQgY2xhc3MgQWNjb3JkaW9uSXRlbSBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95IHtcbiAgc3RhdGljIGFjY29yZGlvbkl0ZW1Db3VudCA9IDA7XG5cbiAgLyoqXG4gICAqIFNldHMgdGhlIGFjY29yZGlvbiB0aXRsZS4gQ2FuIGJlIGEgYHN0cmluZ2Agb3IgYSBgVGVtcGxhdGVSZWZgLiBEZWZhdWx0cyB0byBUaXRsZSBwbHVzIHRoZSBjdXJyZW50IGFjY29yZGlvbiBpdGVtIGNvdW50LlxuICAgKi9cbiAgQElucHV0KCkgdGl0bGU6IHN0cmluZyB8IFRlbXBsYXRlUmVmPGFueT4gPSBgVGl0bGUgJHtBY2NvcmRpb25JdGVtLmFjY29yZGlvbkl0ZW1Db3VudH1gO1xuXG4gIC8qKlxuICAgKiBVc2VkIHRvIHNldCBhIGN1c3RvbSBpZCB0byB0aGUgZWxlbWVudC4gRGVmYXVsdHMgdG8gYSBjb3VudGVyXG4gICAqL1xuICBASW5wdXQoKSBpZCA9IGBhY2NvcmRpb24taXRlbS0ke0FjY29yZGlvbkl0ZW0uYWNjb3JkaW9uSXRlbUNvdW50fWA7XG5cbiAgLyoqXG4gICAqIFNrZWxldG9uIHN0YXRlLiBTZXQgdG8gYHRydWVgIHRvIGRpc3BsYXkgYSBza2VsZXRvbiBhY2NvcmRpb24uXG4gICAqL1xuICBASW5wdXQoKSBza2VsZXRvbiA9IGZhbHNlO1xuXG4gIC8qKlxuICAgKiBFbWl0cyBhbiBldmVudCB3aGVuIHRoZSBhY2NvcmRpb24gaXRlbSBpcyBvcGVuZWQuXG4gICAqL1xuICBAT3V0cHV0KCkgb3BlbmVkID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuXG4gIC8qKlxuICAgKiBFbWl0cyBhbiBldmVudCB3aGVuIHRoZSBhY2NvcmRpb24gaXRlbSBpcyBjbG9zZWQuXG4gICAqL1xuICBAT3V0cHV0KCkgY2xvc2VkID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuXG4gIEBIb3N0QmluZGluZygnY2xhc3MuYWNjb3JkaW9uX19pdGVtJykgaXRlbUNsYXNzID0gdHJ1ZTtcblxuICAvKipcbiAgICogU2V0cyBpZiB0aGUgaXRlbSBpcyBleHBhbmRlZC5cbiAgICovXG4gIEBIb3N0QmluZGluZygnY2xhc3MuYWNjb3JkaW9uX19pdGVtLS1hY3RpdmUnKSBASW5wdXQoKSBleHBhbmRlZCA9IGZhbHNlO1xuICBASG9zdEJpbmRpbmcoJ3N0eWxlLmRpc3BsYXknKSBpdGVtVHlwZSA9ICdsaXN0LWl0ZW0nO1xuICBASG9zdEJpbmRpbmcoJ2F0dHIucm9sZScpIHJvbGUgPSAnaGVhZGluZyc7XG4gIEBIb3N0QmluZGluZygnYXR0ci5hcmlhLWxldmVsJykgQElucHV0KCkgYXJpYUxldmVsID0gMztcblxuICBwcml2YXRlIGFsaXZlID0gdHJ1ZTtcbiAgcHJpdmF0ZSBza2VsZXRvblN1YnNjcmlwdGlvbjogU3Vic2NyaXB0aW9uO1xuICBwcml2YXRlIG9wZW5TdWJzY3JpcHRpb246IFN1YnNjcmlwdGlvbjtcblxuICBjb25zdHJ1Y3RvcihASG9zdCgpIHByaXZhdGUgYWNjb3JkaW9uOiBBY2NvcmRpb24pIHtcbiAgICBBY2NvcmRpb25JdGVtLmFjY29yZGlvbkl0ZW1Db3VudCsrO1xuICB9XG5cblxuICAvKipcbiAgICogVG9nZ2xlcyB0aGUgYWNjb3JkaW9uIG9wZW5lZCBzdGF0ZS5cbiAgICovXG4gIHB1YmxpYyB0b2dnbGUoKSB7XG4gICAgaWYgKCF0aGlzLnNrZWxldG9uKSB7XG4gICAgICBpZiAoIXRoaXMuZXhwYW5kZWQpIHtcbiAgICAgICAgaWYgKCF0aGlzLmFjY29yZGlvbi5tdWx0aSkge1xuICAgICAgICAgIHRoaXMuYWNjb3JkaW9uLm9wZW5DbG9zZUl0ZW1zLm5leHQodHJ1ZSk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLm9wZW4oKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuY2xvc2UoKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgb3BlbigpIHtcbiAgICBpZiAoIXRoaXMuZXhwYW5kZWQpIHtcbiAgICAgIHRoaXMub3BlbmVkLmVtaXQoeyBpZDogdGhpcy5pZCB9KTtcbiAgICB9XG5cbiAgICB0aGlzLmV4cGFuZGVkID0gdHJ1ZTtcbiAgfVxuXG4gIHByb3RlY3RlZCBjbG9zZSgpIHtcbiAgICBpZiAodGhpcy5leHBhbmRlZCkge1xuICAgICAgdGhpcy5jbG9zZWQuZW1pdCh7IGlkOiB0aGlzLmlkIH0pO1xuICAgIH1cblxuICAgIHRoaXMuZXhwYW5kZWQgPSBmYWxzZTtcbiAgfVxuXG4gIG5nT25Jbml0KCkge1xuICAgIHRoaXMub3BlblN1YnNjcmlwdGlvbiA9IHRoaXMuYWNjb3JkaW9uLm9wZW5DbG9zZUl0ZW1zXG4gICAgICAucGlwZSh0YWtlV2hpbGUoKCkgPT4gdGhpcy5hbGl2ZSkpXG4gICAgICAuc3Vic2NyaWJlKGNvbGxhcHNlZCA9PiB7XG4gICAgICAgIGlmICghdGhpcy5za2VsZXRvbikge1xuICAgICAgICAgIGNvbGxhcHNlZCA/IHRoaXMuY2xvc2UoKSA6IHRoaXMub3BlbigpO1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgIHRoaXMuc2tlbGV0b25TdWJzY3JpcHRpb24gPSB0aGlzLmFjY29yZGlvbi5za2VsZXRvbnNcbiAgICAgIC5waXBlKHRha2VXaGlsZSgoKSA9PiB0aGlzLmFsaXZlKSlcbiAgICAgIC5zdWJzY3JpYmUoc2tlbGV0b25WYWx1ZSA9PiB0aGlzLnNrZWxldG9uID0gc2tlbGV0b25WYWx1ZSk7XG5cbiAgICB0aGlzLnNrZWxldG9uID0gdGhpcy5hY2NvcmRpb24uc2tlbGV0b247XG4gIH1cblxuICBuZ09uRGVzdHJveSgpIHtcbiAgICB0aGlzLmFsaXZlID0gZmFsc2U7XG4gICAgdGhpcy5vcGVuU3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XG4gICAgdGhpcy5za2VsZXRvblN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xuICB9XG5cbiAgcHVibGljIGlzVGVtcGxhdGUodmFsdWUpIHtcbiAgICByZXR1cm4gdmFsdWUgaW5zdGFuY2VvZiBUZW1wbGF0ZVJlZjtcbiAgfVxufVxuIl19