| /** |
| * @module modules/query-count-sk |
| * @description <h2><code>query-count-sk</code></h2> |
| * |
| * Reports the number of matches for a given query. |
| * |
| * @attr {string} current_query - The current query to count against. |
| * |
| * @attr {string} url - The URL to POST the query to. |
| * |
| * @evt paramset-changed - An event with the updated paramset in e.detail |
| * from the fetch response. |
| * |
| */ |
| import { define } from 'elements-sk/define' |
| import { html, render } from 'lit-html' |
| import { ElementSk } from '../../../infra-sk/modules/ElementSk' |
| import { errorMessage } from 'elements-sk/errorMessage' |
| import { jsonOrThrow } from 'common-sk/modules/jsonOrThrow' |
| import 'elements-sk/spinner-sk' |
| |
| const template = (ele) => html` |
| <div> |
| <span>${ele._count}</span> |
| <spinner-sk ?active=${ele._requestInProgress}></spinner-sk> |
| </div> |
| `; |
| |
| define('query-count-sk', class extends ElementSk { |
| constructor() { |
| super(template); |
| this._last_query = ''; |
| this._count = ''; |
| this._requestInProgress = false; |
| } |
| |
| connectedCallback() { |
| super.connectedCallback(); |
| this._render(); |
| this._fetch(); |
| } |
| |
| static get observedAttributes() { |
| return ['current_query', 'url']; |
| } |
| |
| _fetch() { |
| if (!this._connected) { |
| return; |
| } |
| if (!this.url) { |
| return; |
| } |
| if (this._requestInProgress) { |
| return; |
| } |
| this._requestInProgress = true; |
| this._last_query = this.current_query; |
| let now = Math.floor(Date.now()/1000); |
| let body = { |
| q: this.current_query, |
| end: now, |
| begin: now - 24*60*60, |
| }; |
| this._render(); |
| fetch(this.url, { |
| method: 'POST', |
| body: JSON.stringify(body), |
| headers:{ |
| 'Content-Type': 'application/json' |
| } |
| }).then(jsonOrThrow).then((json) => { |
| this._count = '' + json.count; |
| this._requestInProgress = false; |
| this._render(); |
| if (this._last_query != this.current_query) { |
| this._fetch(); |
| } |
| this.dispatchEvent(new CustomEvent('paramset-changed', {detail: json.paramset, bubbles: true })); |
| }).catch((msg) => { |
| this._requestInProgress = false; |
| this._render(); |
| errorMessage(msg); |
| }); |
| } |
| |
| attributeChangedCallback(name, oldValue, newValue) { |
| this._fetch(); |
| } |
| |
| /** @prop url {string} */ |
| get url() { return this.getAttribute('url'); } |
| set url(val) { this.setAttribute('url', val); } |
| |
| /** @prop current_query {string} */ |
| get current_query() { return this.getAttribute('current_query'); } |
| set current_query(val) { this.setAttribute('current_query', val); } |
| |
| }); |