1
0
mirror of https://github.com/xuthus83/pigallery2.git synced 2024-11-03 21:04:03 +08:00
pigallery2/frontend/app/gallery/search/search.gallery.component.ts

141 lines
4.3 KiB
TypeScript
Raw Normal View History

2016-05-04 23:20:21 +08:00
import {Component} from "@angular/core";
import {AutoCompleteService} from "./autocomplete.service";
2016-05-16 17:03:11 +08:00
import {AutoCompleteItem, SearchTypes} from "../../../../common/entities/AutoCompleteItem";
2016-12-27 06:36:38 +08:00
import {RouterLink, ActivatedRoute, Params} from "@angular/router";
2016-05-05 00:34:54 +08:00
import {Message} from "../../../../common/entities/Message";
2016-05-10 03:43:52 +08:00
import {GalleryService} from "../gallery.service";
import {Config} from "../../config/Config";
@Component({
selector: 'gallery-search',
templateUrl: 'app/gallery/search/search.gallery.component.html',
styleUrls: ['app/gallery/search/search.gallery.component.css'],
2016-12-27 06:36:38 +08:00
providers: [AutoCompleteService, RouterLink]
})
export class GallerySearchComponent {
2016-05-09 23:04:56 +08:00
2016-12-27 06:36:38 +08:00
autoCompleteItems: Array<AutoCompleteRenderItem> = [];
private searchText: string = "";
private cache = {
lastAutocomplete: "",
lastInstantSearch: ""
};
2016-05-09 23:04:56 +08:00
2016-12-27 06:36:38 +08:00
SearchTypes: any = [];
2016-05-16 17:03:11 +08:00
2016-12-27 06:36:38 +08:00
constructor(private _autoCompleteService: AutoCompleteService,
private _galleryService: GalleryService,
private _route: ActivatedRoute) {
2016-05-16 17:03:11 +08:00
this.SearchTypes = SearchTypes;
2016-12-27 06:36:38 +08:00
this._route.params
.subscribe((params: Params) => {
let searchText = params['searchText'];
if (searchText && searchText != "") {
this.searchText = searchText;
}
});
}
2016-12-27 06:36:38 +08:00
onSearchChange(event: KeyboardEvent) {
let searchText = (<HTMLInputElement>event.target).value.trim();
2016-05-10 03:43:52 +08:00
if (Config.Client.Search.autocompleteEnabled && this.cache.lastAutocomplete != searchText) {
this.cache.lastAutocomplete = searchText;
this.autocomplete(searchText);
}
if (Config.Client.Search.instantSearchEnabled && this.cache.lastInstantSearch != searchText) {
this.cache.lastInstantSearch = searchText;
this._galleryService.instantSearch(searchText);
}
}
2016-05-10 03:43:52 +08:00
public onSearch() {
if (Config.Client.Search.searchEnabled) {
this._galleryService.search(this.searchText);
}
2016-05-10 03:43:52 +08:00
}
2016-12-27 06:36:38 +08:00
public search(item: AutoCompleteItem) {
console.log("clicked");
this.searchText = item.text;
this.onSearch();
}
2016-12-27 06:36:38 +08:00
mouseOverAutoComplete: boolean = false;
2016-05-09 23:04:56 +08:00
2016-12-27 06:36:38 +08:00
public setMouseOverAutoComplete(value: boolean) {
2016-05-16 17:03:11 +08:00
this.mouseOverAutoComplete = value;
}
2016-12-27 06:36:38 +08:00
public onFocusLost() {
2016-05-16 17:03:11 +08:00
if (this.mouseOverAutoComplete == false) {
this.autoCompleteItems = [];
}
2016-05-05 00:57:31 +08:00
}
2016-12-27 06:36:38 +08:00
public onFocus() {
this.autocomplete(this.searchText);
}
2016-05-09 23:04:56 +08:00
private emptyAutoComplete() {
this.autoCompleteItems = [];
}
2016-12-27 06:36:38 +08:00
private autocomplete(searchText: string) {
if (!Config.Client.Search.autocompleteEnabled) {
return
}
if (searchText.trim().length > 0) {
2016-12-27 06:36:38 +08:00
this._autoCompleteService.autoComplete(searchText).then((message: Message<Array<AutoCompleteItem>>) => {
if (message.error) {
//TODO: implement
console.error(message.error);
return;
}
this.showSuggestions(message.result, searchText);
});
} else {
this.emptyAutoComplete();
}
}
2016-12-27 06:36:38 +08:00
private showSuggestions(suggestions: Array<AutoCompleteItem>, searchText: string) {
this.emptyAutoComplete();
2016-12-27 06:36:38 +08:00
suggestions.forEach((item: AutoCompleteItem) => {
2016-05-16 01:46:25 +08:00
let renderItem = new AutoCompleteRenderItem(item.text, searchText, item.type);
this.autoCompleteItems.push(renderItem);
});
}
2016-12-27 06:36:38 +08:00
public setSearchText(searchText: string) {
2016-05-16 17:03:11 +08:00
this.searchText = searchText;
}
}
2016-05-09 23:04:56 +08:00
class AutoCompleteRenderItem {
2016-12-27 06:36:38 +08:00
public preText: string = "";
public highLightText: string = "";
public postText: string = "";
public type: SearchTypes;
2016-05-09 23:04:56 +08:00
2016-12-27 06:36:38 +08:00
constructor(public text: string, searchText: string, type: SearchTypes) {
let preIndex = text.toLowerCase().indexOf(searchText.toLowerCase());
if (preIndex > -1) {
this.preText = text.substring(0, preIndex);
this.highLightText = text.substring(preIndex, preIndex + searchText.length);
this.postText = text.substring(preIndex + searchText.length);
} else {
this.postText = text;
}
2016-05-16 01:46:25 +08:00
this.type = type;
}
}