github.com/hernad/nomad@v1.6.112/ui/app/components/list-accordion.js (about)

     1  /**
     2   * Copyright (c) HashiCorp, Inc.
     3   * SPDX-License-Identifier: MPL-2.0
     4   */
     5  
     6  import Component from '@ember/component';
     7  import { computed, get } from '@ember/object';
     8  import { computed as overridable } from 'ember-overridable-computed';
     9  import { classNames } from '@ember-decorators/component';
    10  import classic from 'ember-classic-decorator';
    11  
    12  @classic
    13  @classNames('accordion')
    14  export default class ListAccordion extends Component {
    15    key = 'id';
    16    @overridable(() => []) source;
    17  
    18    onToggle /* item, isOpen */() {}
    19    startExpanded = false;
    20  
    21    @computed('key', 'source.[]', 'startExpanded', 'stateCache')
    22    get decoratedSource() {
    23      const stateCache = this.stateCache;
    24      const key = this.key;
    25      const deepKey = `item.${key}`;
    26      const startExpanded = this.startExpanded;
    27  
    28      const decoratedSource = this.source.map((item) => {
    29        const cacheItem = stateCache.findBy(deepKey, get(item, key));
    30        return {
    31          item,
    32          isOpen: cacheItem ? !!cacheItem.isOpen : startExpanded,
    33        };
    34      });
    35  
    36      // eslint-disable-next-line ember/no-side-effects
    37      this.set('stateCache', decoratedSource);
    38      return decoratedSource;
    39    }
    40  
    41    // When source updates come in, the state cache is used to preserve
    42    // open/close state.
    43    @overridable(() => []) stateCache;
    44  }