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

149 lines
4.0 KiB
TypeScript
Raw Normal View History

2018-05-04 07:17:08 +08:00
import {Component, OnDestroy} from '@angular/core';
2018-03-31 03:30:30 +08:00
import {AutoCompleteService} from './autocomplete.service';
import {AutoCompleteItem, SearchTypes} from '../../../../common/entities/AutoCompleteItem';
import {ActivatedRoute, Params, RouterLink} from '@angular/router';
import {GalleryService} from '../gallery.service';
2018-11-29 06:49:33 +08:00
import {Subscription} from 'rxjs';
2018-03-31 03:30:30 +08:00
import {Config} from '../../../../common/config/public/Config';
@Component({
2018-05-04 07:17:08 +08:00
selector: 'app-gallery-search',
templateUrl: './search.gallery.component.html',
styleUrls: ['./search.gallery.component.css'],
providers: [AutoCompleteService, RouterLink]
})
2018-05-04 07:17:08 +08:00
export class GallerySearchComponent implements OnDestroy {
2016-05-09 23:04:56 +08:00
2018-11-29 06:49:33 +08:00
autoCompleteItems: AutoCompleteRenderItem[] = [];
2018-05-04 07:17:08 +08:00
public searchText = '';
private cache = {
2018-03-31 03:30:30 +08:00
lastAutocomplete: '',
lastInstantSearch: ''
};
2018-05-04 07:17:08 +08:00
mouseOverAutoComplete = false;
2018-11-29 06:49:33 +08:00
readonly SearchTypes: typeof SearchTypes;
private readonly subscription: Subscription = null;
2017-07-04 01:17:49 +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
2017-07-04 01:17:49 +08:00
this.subscription = this._route.params.subscribe((params: Params) => {
2018-05-04 07:17:08 +08:00
const searchText = params['searchText'];
if (searchText && searchText !== '') {
2017-07-04 01:17:49 +08:00
this.searchText = searchText;
}
});
}
2017-07-04 01:17:49 +08:00
ngOnDestroy() {
if (this.subscription !== null) {
2018-03-31 03:30:30 +08:00
this.subscription.unsubscribe();
2017-07-04 01:17:49 +08:00
}
}
onSearchChange(event: KeyboardEvent) {
2016-05-10 03:43:52 +08:00
2018-05-04 07:17:08 +08:00
const searchText = (<HTMLInputElement>event.target).value.trim();
2018-05-04 07:17:08 +08:00
if (Config.Client.Search.autocompleteEnabled && this.cache.lastAutocomplete !== searchText) {
this.cache.lastAutocomplete = searchText;
this.autocomplete(searchText);
}
2018-05-04 07:17:08 +08:00
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() {
2017-07-14 05:39:09 +08:00
if (Config.Client.Search.enabled) {
this._galleryService.search(this.searchText);
}
}
public search(item: AutoCompleteItem) {
this.searchText = item.text;
this.onSearch();
}
2016-05-09 23:04:56 +08:00
public setMouseOverAutoComplete(value: boolean) {
this.mouseOverAutoComplete = value;
}
public onFocusLost() {
2018-05-04 07:17:08 +08:00
if (this.mouseOverAutoComplete === false) {
this.autoCompleteItems = [];
}
}
public onFocus() {
this.autocomplete(this.searchText);
}
private emptyAutoComplete() {
this.autoCompleteItems = [];
}
2017-07-04 01:17:49 +08:00
private async autocomplete(searchText: string) {
if (!Config.Client.Search.autocompleteEnabled) {
2018-03-31 03:30:30 +08:00
return;
}
2018-05-04 07:17:08 +08:00
if (searchText.trim() === '.') {
2017-07-08 06:18:24 +08:00
return;
}
2017-07-04 01:17:49 +08:00
if (searchText.trim().length > 0) {
2017-07-04 01:17:49 +08:00
try {
const items = await this._autoCompleteService.autoComplete(searchText);
this.showSuggestions(items, searchText);
} catch (error) {
console.error(error);
}
} else {
this.emptyAutoComplete();
}
}
private showSuggestions(suggestions: Array<AutoCompleteItem>, searchText: string) {
this.emptyAutoComplete();
suggestions.forEach((item: AutoCompleteItem) => {
2018-05-04 07:17:08 +08:00
const renderItem = new AutoCompleteRenderItem(item.text, searchText, item.type);
this.autoCompleteItems.push(renderItem);
});
}
public setSearchText(searchText: string) {
this.searchText = searchText;
}
2016-05-16 17:03:11 +08:00
}
2016-05-09 23:04:56 +08:00
class AutoCompleteRenderItem {
2018-05-04 07:17:08 +08:00
public preText = '';
public highLightText = '';
public postText = '';
public type: SearchTypes;
constructor(public text: string, searchText: string, type: SearchTypes) {
2018-05-04 07:17:08 +08:00
const 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;
}
this.type = type;
}
}