github.com/anth0d/nomad@v0.0.0-20221214183521-ae3a0a2cad06/ui/app/components/list-accordion.js (about)

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