File

libs/ui/expansion-panel/src/lib/accordion/accordion.component.ts

Description

Component to allow multiple TsExpansionPanelComponent's to function as an accordion.

Extends

CdkAccordion

Implements

TsAccordionBase AfterContentInit OnDestroy

Example

<ts-accordion
   [multi]="true"
   [hideToggle]="true"
   (destroyed)="accordionDestroyed()"
>
   <ts-expansion-panel>
     ...
   </ts-expansion-panel>

   <ts-expansion-panel>
     ...
   </ts-expansion-panel>
</ts-accordion>

<example-url>https://getterminus.github.io/ui-demos-release/components/expansion-panel</example-url>

Metadata

changeDetection ChangeDetectionStrategy.OnPush
encapsulation ViewEncapsulation.None
exportAs tsAccordion
host {
}
providers { provide: TS_ACCORDION, useExisting: TsAccordionComponent, }
selector ts-accordion
template
<ng-content></ng-content>

Index

Properties
Methods
Inputs
Outputs
Accessors

Inputs

hideToggle
Type : boolean

Determine if the toggle indicator should be hidden

Outputs

destroyed
Type : EventEmitter<void>

The event emitted as the accordion is destroyed

Methods

Public handleTriggerFocus
handleTriggerFocus(trigger: TsExpansionPanelTriggerComponent)

Handle focus events for the trigger

Parameters :
Name Type Optional Description
trigger TsExpansionPanelTriggerComponent No
  • The trigger component that is receiving focus
Returns : void
Public handleTriggerKeydown
handleTriggerKeydown(event: KeyboardEvent)

Handle keyboard events coming in from the panel triggers

Parameters :
Name Type Optional
event KeyboardEvent No
Returns : void

Properties

Public triggers
Type : QueryList<TsExpansionPanelTriggerComponent>
Decorators :
@ContentChildren(TsExpansionPanelTriggerComponent, {descendants: true})

Collect a list of all triggers

Accessors

hideToggle
gethideToggle()
sethideToggle(value: boolean)

Determine if the toggle indicator should be hidden

Parameters :
Name Type Optional
value boolean No
Returns : void
import { FocusKeyManager } from '@angular/cdk/a11y';
import { CdkAccordion } from '@angular/cdk/accordion';
import {
  AfterContentInit,
  ChangeDetectionStrategy,
  Component,
  ContentChildren,
  EventEmitter,
  Input,
  OnDestroy,
  Output,
  QueryList,
  ViewEncapsulation,
} from '@angular/core';

import { KEYS } from '@terminus/fe-utilities';

import { TsExpansionPanelTriggerComponent } from '../trigger/expansion-panel-trigger.component';
import {
  TS_ACCORDION,
  TsAccordionBase,
} from './accordion-base';


/**
 * Component to allow multiple {@link TsExpansionPanelComponent}'s to function as an accordion.
 *
 * @example
 * <ts-accordion
 *               [multi]="true"
 *               [hideToggle]="true"
 *               (destroyed)="accordionDestroyed()"
 * >
 *               <ts-expansion-panel>
 *                 ...
 *               </ts-expansion-panel>
 *
 *               <ts-expansion-panel>
 *                 ...
 *               </ts-expansion-panel>
 * </ts-accordion>
 *
 * <example-url>https://getterminus.github.io/ui-demos-release/components/expansion-panel</example-url>
 */
@Component({
  selector: 'ts-accordion',
  template: `<ng-content></ng-content>`,
  // NOTE: @Inputs are defined here rather than using decorators since we are extending the @Inputs of the base class
  // eslint-disable-next-line @angular-eslint/no-inputs-metadata-property
  inputs: ['multi'],
  providers: [
    {
      provide: TS_ACCORDION,
      useExisting: TsAccordionComponent,
    },
  ],
  host: { class: 'ts-accordion' },
  changeDetection: ChangeDetectionStrategy.OnPush,
  encapsulation: ViewEncapsulation.None,
  exportAs: 'tsAccordion',
})
export class TsAccordionComponent extends CdkAccordion implements TsAccordionBase, AfterContentInit, OnDestroy {
  /**
   * Store a reference to the key manager
   */
  private keyManager!: FocusKeyManager<TsExpansionPanelTriggerComponent>;

  /**
   * Collect a list of all triggers
   */
  @ContentChildren(TsExpansionPanelTriggerComponent, { descendants: true })
  public triggers!: QueryList<TsExpansionPanelTriggerComponent>;

  /**
   * Determine if the toggle indicator should be hidden
   *
   * @param value
   */
  @Input()
  public set hideToggle(value: boolean) {
    this._hideToggle = value;
  }
  public get hideToggle(): boolean {
    return this._hideToggle;
  }
  private _hideToggle = false;

  /**
   * The event emitted as the accordion is destroyed
   */
  @Output()
  public readonly destroyed: EventEmitter<void> = new EventEmitter();


  /**
   * Initialize the key manager
   */
  public ngAfterContentInit(): void {
    this.keyManager = new FocusKeyManager(this.triggers).withWrap();
  }

  /**
   * Alert consumers when the accordion is destroyed
   */
  public ngOnDestroy(): void {
    this.destroyed.emit();
  }

  /**
   * Handle keyboard events coming in from the panel triggers
   *
   * @param event
   */
  public handleTriggerKeydown(event: KeyboardEvent): void {
    const { code } = event;
    const manager = this.keyManager;

    if (code === KEYS.HOME.code) {
      manager.setFirstItemActive();
      event.preventDefault();
    } else if (code === KEYS.END.code) {
      manager.setLastItemActive();
      event.preventDefault();
    } else {
      this.keyManager.onKeydown(event);
    }
  }

  /**
   * Handle focus events for the trigger
   *
   * @param trigger - The trigger component that is receiving focus
   */
  public handleTriggerFocus(trigger: TsExpansionPanelTriggerComponent): void {
    this.keyManager.updateActiveItem(trigger);
  }
}

result-matching ""

    No results matching ""