1 import {Component} from "./component";
3 export class QueryManager extends Component {
4 protected input!: HTMLTextAreaElement;
5 protected generatedLoading!: HTMLElement;
6 protected generatedDisplay!: HTMLElement;
7 protected contentLoading!: HTMLElement;
8 protected contentDisplay!: HTMLElement;
9 protected form!: HTMLFormElement;
10 protected fieldset!: HTMLFieldSetElement;
13 this.input = this.$refs.input as HTMLTextAreaElement;
14 this.form = this.$refs.form as HTMLFormElement;
15 this.fieldset = this.$refs.fieldset as HTMLFieldSetElement;
16 this.generatedLoading = this.$refs.generatedLoading;
17 this.generatedDisplay = this.$refs.generatedDisplay;
18 this.contentLoading = this.$refs.contentLoading;
19 this.contentDisplay = this.$refs.contentDisplay;
21 this.setupListeners();
23 // Start lookup if a query is set
24 if (this.input.value.trim() !== '') {
29 protected setupListeners(): void {
30 // Handle form submission
31 this.form.addEventListener('submit', event => {
32 event.preventDefault();
36 // Allow Ctrl+Enter to run a query
37 this.input.addEventListener('keydown', event => {
38 if (event.key === 'Enter' && event.ctrlKey && this.input.value.trim() !== '') {
44 protected async runQuery(): Promise<void> {
45 this.contentLoading.hidden = false;
46 this.generatedLoading.hidden = false;
47 this.contentDisplay.innerHTML = '';
48 this.generatedDisplay.innerHTML = '';
49 this.fieldset.disabled = true;
51 const query = this.input.value.trim();
52 const url = new URL(window.location.href);
53 url.searchParams.set('ask', query);
54 window.history.pushState({}, '', url.toString());
56 const es = window.$http.eventSource('/query', 'POST', {query});
59 for await (const {data, event, id} of es) {
61 if (messageCount === 1) {
63 this.contentDisplay.innerHTML = JSON.parse(data).view;
64 this.contentLoading.hidden = true;
65 } else if (messageCount === 2) {
67 this.generatedDisplay.innerText = JSON.parse(data).result;
68 this.generatedLoading.hidden = true;
75 this.fieldset.disabled = false;