Sort global search results

This commit is contained in:
FinnStutzenstein 2019-07-10 07:51:23 +02:00
parent 3f6fe28f35
commit fa22d651dd

View File

@ -1,4 +1,7 @@
import { Injectable } from '@angular/core'; import { Injectable } from '@angular/core';
import { TranslateService } from '@ngx-translate/core';
import { Searchable } from '../../site/base/searchable'; import { Searchable } from '../../site/base/searchable';
import { BaseViewModel } from 'app/site/base/base-view-model'; import { BaseViewModel } from 'app/site/base/base-view-model';
import { BaseRepository } from '../repositories/base-repository'; import { BaseRepository } from '../repositories/base-repository';
@ -55,7 +58,7 @@ export interface SearchResult {
openInNewTab: boolean; openInNewTab: boolean;
/** /**
* All matched models. * All matched models sorted by their title.
*/ */
models: (BaseViewModel & Searchable)[]; models: (BaseViewModel & Searchable)[];
} }
@ -78,10 +81,20 @@ export class SearchService {
openInNewTab: boolean; openInNewTab: boolean;
}[] = []; }[] = [];
/**
* For sorting the results.
*/
private languageCollator: Intl.Collator;
/** /**
* @param viewModelStore The store to search in. * @param viewModelStore The store to search in.
*/ */
public constructor(private viewModelStore: ViewModelStoreService) {} public constructor(private viewModelStore: ViewModelStoreService, private translate: TranslateService) {
this.languageCollator = new Intl.Collator(this.translate.currentLang);
this.translate.onLangChange.subscribe(params => {
this.languageCollator = new Intl.Collator(params.lang);
});
}
/** /**
* Registers a model by the given attributes. * Registers a model by the given attributes.
@ -96,7 +109,6 @@ export class SearchService {
displayOrder: number, displayOrder: number,
openInNewTab: boolean = false openInNewTab: boolean = false
): void { ): void {
// const instance = new ctor();
this.searchModels.push({ this.searchModels.push({
collectionString: collectionString, collectionString: collectionString,
verboseNameSingular: repo.getVerboseName(), verboseNameSingular: repo.getVerboseName(),
@ -124,7 +136,7 @@ export class SearchService {
* *
* @param query The search query * @param query The search query
* @param inCollectionStrings All connection strings which should be used for searching. * @param inCollectionStrings All connection strings which should be used for searching.
* @returns All search results. * @returns All search results sorted by the model's title (via `getTItle()`).
*/ */
public search(query: string, inCollectionStrings: string[]): SearchResult[] { public search(query: string, inCollectionStrings: string[]): SearchResult[] {
query = query.toLowerCase(); query = query.toLowerCase();
@ -134,7 +146,10 @@ export class SearchService {
const results = this.viewModelStore const results = this.viewModelStore
.getAll(searchModel.collectionString) .getAll(searchModel.collectionString)
.map(x => x as (BaseViewModel & Searchable)) .map(x => x as (BaseViewModel & Searchable))
.filter(model => model.formatForSearch().some(text => text.toLowerCase().includes(query))); .filter(model => model.formatForSearch().some(text => text.toLowerCase().includes(query)))
.sort((a, b) => {
return this.languageCollator.compare(a.getTitle(), b.getTitle());
});
return { return {
collectionString: searchModel.collectionString, collectionString: searchModel.collectionString,
verboseName: results.length === 1 ? searchModel.verboseNameSingular : searchModel.verboseNamePlural, verboseName: results.length === 1 ? searchModel.verboseNameSingular : searchModel.verboseNamePlural,