'use strict'; const api = require('../api.js'); const pools = require('../pools.js'); const misc = require('../util/misc.js'); const uri = require('../util/uri.js'); const Pool = require('../models/pool.js'); const settings = require('../models/settings.js'); const events = require('../events.js'); const views = require('../util/views.js'); const PoolAutoCompleteControl = require('./pool_auto_complete_control.js'); const KEY_SPACE = 32; const KEY_RETURN = 13; const SOURCE_INIT = 'init'; const SOURCE_IMPLICATION = 'implication'; const SOURCE_USER_INPUT = 'user-input'; const SOURCE_CLIPBOARD = 'clipboard'; const template = views.getTemplate('pool-input'); function _fadeOutListItemNodeStatus(listItemNode) { if (listItemNode.classList.length) { if (listItemNode.fadeTimeout) { window.clearTimeout(listItemNode.fadeTimeout); } listItemNode.fadeTimeout = window.setTimeout(() => { while (listItemNode.classList.length) { listItemNode.classList.remove( listItemNode.classList.item(0)); } listItemNode.fadeTimeout = null; }, 2500); } } class PoolInputControl extends events.EventTarget { constructor(hostNode, poolList) { super(); this.pools = poolList; this._hostNode = hostNode; this._poolToListItemNode = new Map(); // dom const editAreaNode = template(); this._editAreaNode = editAreaNode; this._poolInputNode = editAreaNode.querySelector('input'); this._poolListNode = editAreaNode.querySelector('ul.compact-pools'); this._autoCompleteControl = new PoolAutoCompleteControl( this._poolInputNode, { getTextToFind: () => { return this._poolInputNode.value; }, confirm: pool => { this._poolInputNode.value = ''; this.addPool(pool, SOURCE_USER_INPUT); }, delete: pool => { this._poolInputNode.value = ''; this.deletePool(pool); }, verticalShift: -2 }); // show this._hostNode.style.display = 'none'; this._hostNode.parentNode.insertBefore( this._editAreaNode, hostNode.nextSibling); // add existing pools for (let pool of [...this.pools]) { const listItemNode = this._createListItemNode(pool); this._poolListNode.appendChild(listItemNode); } } addPool(pool, source) { if (source !== SOURCE_INIT && this.pools.hasPoolId(pool.id)) { return Promise.resolve(); } this.pools.add(pool, false) const listItemNode = this._createListItemNode(pool); if (!pool.category) { listItemNode.classList.add('new'); } this._poolListNode.prependChild(listItemNode); _fadeOutListItemNodeStatus(listItemNode); this.dispatchEvent(new CustomEvent('add', { detail: {pool: pool, source: source}, })); this.dispatchEvent(new CustomEvent('change')); return Promise.resolve(); } deletePool(pool) { if (!this.pools.hasPoolId(pool.id)) { return; } this.pools.removeById(pool.id); this._hideAutoComplete(); this._deleteListItemNode(pool); this.dispatchEvent(new CustomEvent('remove', { detail: {pool: pool}, })); this.dispatchEvent(new CustomEvent('change')); } _createListItemNode(pool) { const className = pool.category ? misc.makeCssName(pool.category, 'pool') : null; const poolLinkNode = document.createElement('a'); if (className) { poolLinkNode.classList.add(className); } poolLinkNode.setAttribute( 'href', uri.formatClientLink('pool', pool.names[0])); const poolIconNode = document.createElement('i'); poolIconNode.classList.add('fa'); poolIconNode.classList.add('fa-pool'); poolLinkNode.appendChild(poolIconNode); const searchLinkNode = document.createElement('a'); if (className) { searchLinkNode.classList.add(className); } searchLinkNode.setAttribute( 'href', uri.formatClientLink( 'posts', {query: "pool:" + pool.id})); searchLinkNode.textContent = pool.names[0] + ' '; const usagesNode = document.createElement('span'); usagesNode.classList.add('pool-usages'); usagesNode.setAttribute('data-pseudo-content', pool.postCount); const removalLinkNode = document.createElement('a'); removalLinkNode.classList.add('remove-pool'); removalLinkNode.setAttribute('href', ''); removalLinkNode.setAttribute('data-pseudo-content', '×'); removalLinkNode.addEventListener('click', e => { e.preventDefault(); this.deletePool(pool); }); const listItemNode = document.createElement('li'); listItemNode.appendChild(removalLinkNode); listItemNode.appendChild(poolLinkNode); listItemNode.appendChild(searchLinkNode); listItemNode.appendChild(usagesNode); for (let name of pool.names) { this._poolToListItemNode.set(name, listItemNode); } return listItemNode; } _deleteListItemNode(pool) { const listItemNode = this._getListItemNode(pool); if (listItemNode) { listItemNode.parentNode.removeChild(listItemNode); } for (let name of pool.names) { this._poolToListItemNode.delete(name); } } _getListItemNode(pool) { return this._poolToListItemNode.get(pool.names[0]); } _hideAutoComplete() { this._autoCompleteControl.hide(); } } module.exports = PoolInputControl;