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 }