initial version of the query autocompletion

Missing features at this point:
1. No suggestions when the input gets the focus.
2. Suggestions are not shown after selecting a suggestion.
This commit is contained in:
2019-10-13 10:35:38 +02:00
parent 47d8387fec
commit a3099d4981
9 changed files with 132 additions and 8 deletions

View File

@@ -2,7 +2,7 @@ import { BrowserModule } from '@angular/platform-browser';
import { BrowserAnimationsModule } from '@angular/platform-browser/animations';
import { NgModule, enableProdMode } from '@angular/core';
import { HttpClientModule } from '@angular/common/http';
import { ReactiveFormsModule } from '@angular/forms';
import { FormsModule, ReactiveFormsModule } from '@angular/forms';
import { AppRoutingModule } from './app-routing.module';
import { AppComponent } from './app.component';
@@ -12,8 +12,10 @@ import { UploadPageComponent } from './upload-page/upload-page.component';
import { VisualizationPageComponent } from './visualization-page/visualization-page.component';
import {MatSelectModule} from '@angular/material/select';
import {MatAutocompleteModule} from '@angular/material/autocomplete';
import {MatFormFieldModule, MatInputModule} from '@angular/material';
import { YAxisRangeComponent } from './y-axis-range/y-axis-range.component';
import { QueryAutocompleteComponent } from './query-autocomplete/query-autocomplete.component';
@NgModule({
declarations: [
@@ -23,12 +25,15 @@ import { YAxisRangeComponent } from './y-axis-range/y-axis-range.component';
UploadPageComponent,
VisualizationPageComponent,
YAxisRangeComponent,
QueryAutocompleteComponent,
],
imports: [
BrowserModule,
AppRoutingModule,
FormsModule,
ReactiveFormsModule,
MatSelectModule,MatFormFieldModule, MatInputModule,
MatAutocompleteModule,
BrowserAnimationsModule,
HttpClientModule
],

View File

@@ -1,5 +1,5 @@
import { Injectable, OnInit } from '@angular/core';
import { HttpClient } from '@angular/common/http';
import { HttpClient, HttpParams } from '@angular/common/http';
import { Observable } from 'rxjs/Observable';
@@ -55,6 +55,16 @@ export class PlotService {
});
return this.tagFields;
}
autocomplete(query: string, caretIndex: number): Observable<AutocompleteResult>
{
const options = {
params: new HttpParams()
.set('caretIndex', ""+caretIndex)
.set('query', query)
};
return this.http.get<AutocompleteResult>('//'+window.location.hostname+':8080/autocomplete', options);
}
}
@@ -111,3 +121,17 @@ export enum DataType {
Other
}
export class Suggestion {
value: string;
newQuery: string;
newCaretPosition: number;
}
export class AutocompleteResult{
proposals: Array<Suggestion>;
}

View File

@@ -0,0 +1,16 @@
<input matInput
type="text"
id="query-autocomplete-input"
placeholder="Query"
[formControl]="query"
[matAutocomplete]="auto"
(keyup)="onKey($event)"/>
<mat-autocomplete
#auto="matAutocomplete"
[displayWith]="displaySuggestion"
>
<mat-option *ngFor="let suggestion of filteredSuggestions | async"
[value]="suggestion">
{{suggestion.value}}
</mat-option>
</mat-autocomplete>

View File

@@ -0,0 +1,25 @@
import { async, ComponentFixture, TestBed } from '@angular/core/testing';
import { QueryAutocompleteComponent } from './query-autocomplete.component';
describe('QueryAutocompleteComponent', () => {
let component: QueryAutocompleteComponent;
let fixture: ComponentFixture<QueryAutocompleteComponent>;
beforeEach(async(() => {
TestBed.configureTestingModule({
declarations: [ QueryAutocompleteComponent ]
})
.compileComponents();
}));
beforeEach(() => {
fixture = TestBed.createComponent(QueryAutocompleteComponent);
component = fixture.componentInstance;
fixture.detectChanges();
});
it('should create', () => {
expect(component).toBeTruthy();
});
});

View File

@@ -0,0 +1,55 @@
import { Component, OnInit, Input } from '@angular/core';
import {FormControl} from '@angular/forms';
import {Observable} from 'rxjs';
import {startWith, map} from 'rxjs/operators';
import { PlotService, PlotType, AutocompleteResult, Suggestion } from '../plot.service';
@Component({
selector: 'pdb-query-autocomplete',
templateUrl: './query-autocomplete.component.html',
styleUrls: ['./query-autocomplete.component.scss']
})
export class QueryAutocompleteComponent implements OnInit {
@Input() query = new FormControl();
suggestions = new FormControl();
filteredSuggestions: Observable<Suggestion[]>;
constructor(private plotService: PlotService) {}
ngOnInit() {
this.filteredSuggestions = this.suggestions.valueChanges.pipe(
map(value => value)
);
}
onKey(event: any) {
const that = this;
console.log(event);
if (event.key == "ArrowDown" || event.key == "ArrowUp"){
return;
}
const query = typeof this.query.value == "string"
? this.query.value
: this.query.value.newQuery;
const caretIndex = event.srcElement.selectionStart +1;
this.plotService
.autocomplete(query, caretIndex)
.subscribe(
(data: AutocompleteResult) => {// success path
console.log(JSON.stringify(data.proposals));
that.suggestions.setValue(data.proposals);
},
error => console.log(error)
);
}
displaySuggestion(suggestion?: Suggestion): string | undefined {
//console.log("suggestion: "+JSON.stringify(suggestion));
return suggestion ? suggestion.newQuery : undefined;
}
}

View File

@@ -5,8 +5,8 @@
<div id="visualization">
<div id="query-box">
<input matInput placeholder="Query" value="{{query}}" />
<pdb-query-autocomplete></pdb-query-autocomplete>
<!-- [query]="query"-->
<pdb-query-autocomplete ></pdb-query-autocomplete>
</div>
<div id="filters">
<mat-form-field class="mat-field-full-width">

View File

@@ -39,7 +39,7 @@
#filters {
grid-area: filters;
background-color: #eee;
background-color: #fafafa;
padding: 1em;
}

View File

@@ -1,6 +1,5 @@
import { Component, OnInit } from '@angular/core';
import { PlotService, PlotType } from '../plot.service';
import { HttpClient } from '@angular/common/http';
import { Observable } from 'rxjs/Observable';
import { FormControl } from '@angular/forms';
@@ -30,7 +29,7 @@ export class VisualizationPageComponent implements OnInit {
query: string;
constructor(private plotService: PlotService, private http: HttpClient) {
constructor(private plotService: PlotService) {
}
ngOnInit() {