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 }