@engie-group/fluid-design-system-angular
Version:
Fluid Design System Angular
89 lines (80 loc) • 2.55 kB
text/typescript
import {
booleanAttribute,
ChangeDetectionStrategy,
Component,
ContentChildren,
Input,
QueryList,
ViewEncapsulation
} from '@angular/core';
import { EngieTemplateDirective } from '../../directives/engie-template.directive';
import { AccordionActionsComponent } from '../accordion-actions/accordion-actions.component';
import { AccordionActionDirective } from '../accordion-actions/directive/accordion-action.directive';
import { AccordionItemComponent } from '../accordion-item/accordion-item.component';
import { ButtonComponent } from '../button/button.component';
import { IconComponent } from '../icon/icon.component';
({
selector: 'nj-accordion',
templateUrl: './accordion.component.html',
standalone: true,
changeDetection: ChangeDetectionStrategy.OnPush,
encapsulation: ViewEncapsulation.None,
imports: [
AccordionItemComponent,
IconComponent,
EngieTemplateDirective,
AccordionActionsComponent,
ButtonComponent,
AccordionActionDirective
],
host: {
'[class]': 'classes'
}
})
export class AccordionComponent {
({ transform: booleanAttribute }) noBorder: boolean;
({ transform: booleanAttribute }) separated: boolean;
(AccordionItemComponent) private accordions?: QueryList<AccordionItemComponent>;
protected get classes() {
const classes = ['nj-accordion'];
if (this.noBorder) {
classes.push('nj-accordion--no-border');
}
if (this.separated) {
classes.push('nj-accordion--separated');
}
return classes;
}
/**
* Expand all children items programmatically
*/
expandAllItems() {
const openedGroup = new Set<string>();
this.accordions.forEach((accordion) => {
// Firefox doesn't currently support grouping accordion items with `name` property.
// So we replicate the behavior here to have it on all browsers.
//
// As explained in the MDN documentation, when the `name` property is set, only the first details
// element with the `open` property should be opened.
if (!accordion.name || !openedGroup.has(accordion.name)) {
accordion.expand();
} else {
accordion.collapse();
}
if (accordion.name) {
openedGroup.add(accordion.name);
}
});
}
/**
* Collapse all children items programmatically
*/
collapseAllItems(name?: string) {
this.accordions.forEach((accordion) => {
if (name && accordion.name !== name) {
return;
}
accordion.collapse();
});
}
}