'use strict'; const ICON_CLASS_OPENED = 'fa-chevron-down'; const ICON_CLASS_CLOSED = 'fa-chevron-up'; const views = require('../util/views.js'); const template = views.getTemplate('expander'); class ExpanderControl { constructor(title, nodes) { this._title = title; nodes = Array.from(nodes).filter(n => n); if (!nodes.length) { return; } const expanderNode = template({title: title}); const toggleLinkNode = expanderNode.querySelector('a'); const toggleIconNode = expanderNode.querySelector('i'); const expanderContentNode = expanderNode.querySelector('div'); toggleLinkNode.addEventListener('click', e => this._evtToggleClick(e)); nodes[0].parentNode.insertBefore(expanderNode, nodes[0]); for (let node of nodes) { expanderContentNode.appendChild(node); } this._expanderNode = expanderNode; this._toggleIconNode = toggleIconNode; expanderNode.classList.toggle( 'collapsed', this._allStates[this._title] === undefined ? false : !this._allStates[this._title]); this._syncIcon(); } get _isOpened() { return !this._expanderNode.classList.contains('collapsed'); } get _allStates() { try { return JSON.parse(localStorage.getItem('expander')) || {}; } catch (e) { return {}; } } _save() { const newStates = Object.assign({}, this._allStates); newStates[this._title] = this._isOpened; localStorage.setItem('expander', JSON.stringify(newStates)); } _evtToggleClick(e) { e.preventDefault(); this._expanderNode.classList.toggle('collapsed'); this._save(); this._syncIcon(); } _syncIcon() { if (this._isOpened) { this._toggleIconNode.classList.add(ICON_CLASS_OPENED); this._toggleIconNode.classList.remove(ICON_CLASS_CLOSED); } else { this._toggleIconNode.classList.add(ICON_CLASS_CLOSED); this._toggleIconNode.classList.remove(ICON_CLASS_OPENED); } } } module.exports = ExpanderControl;