diff --git a/src/backend/model/database/SearchManager.ts b/src/backend/model/database/SearchManager.ts index 5ea8953d..b4e87388 100644 --- a/src/backend/model/database/SearchManager.ts +++ b/src/backend/model/database/SearchManager.ts @@ -85,7 +85,7 @@ export class SearchManager { .where('photo.metadata.keywords LIKE :text COLLATE ' + SQL_COLLATE, { text: '%' + text + '%', }) - .limit(Config.Search.AutoComplete.targetItemsPerCategory * 2) + .limit(Config.Search.AutoComplete.ItemsPerCategory.keyword*2) .getRawMany() ) .map( @@ -120,7 +120,7 @@ export class SearchManager { text: '%' + text + '%', }) .limit( - Config.Search.AutoComplete.targetItemsPerCategory * 2 + Config.Search.AutoComplete.ItemsPerCategory.person*2 ) .orderBy('person.count', 'DESC') .getRawMany() @@ -161,7 +161,7 @@ export class SearchManager { .groupBy( 'photo.metadata.positionData.country, photo.metadata.positionData.state, photo.metadata.positionData.city' ) - .limit(Config.Search.AutoComplete.targetItemsPerCategory * 2) + .limit(Config.Search.AutoComplete.ItemsPerCategory.position*2) .getRawMany() ) .filter((pm): boolean => !!pm) @@ -199,7 +199,7 @@ export class SearchManager { text: '%' + text + '%', }) .limit( - Config.Search.AutoComplete.targetItemsPerCategory * 2 + Config.Search.AutoComplete.ItemsPerCategory.file_name*2 ) .getRawMany() ).map((r) => r.name), @@ -223,7 +223,7 @@ export class SearchManager { {text: '%' + text + '%'} ) .limit( - Config.Search.AutoComplete.targetItemsPerCategory * 2 + Config.Search.AutoComplete.ItemsPerCategory.caption*2 ) .getRawMany() ).map((r) => r.caption), @@ -246,7 +246,7 @@ export class SearchManager { text: '%' + text + '%', }) .limit( - Config.Search.AutoComplete.targetItemsPerCategory * 2 + Config.Search.AutoComplete.ItemsPerCategory.directory*2 ) .getRawMany() ).map((r) => r.name), @@ -260,13 +260,13 @@ export class SearchManager { // if not enough items are available, load more from one category if ( [].concat(...partialResult).length < - Config.Search.AutoComplete.maxItems + Config.Search.AutoComplete.ItemsPerCategory.maxItems ) { result = [].concat(...partialResult); } else { result = [].concat( ...partialResult.map((l) => - l.slice(0, Config.Search.AutoComplete.targetItemsPerCategory) + l.slice(0, (Config.Search.AutoComplete.ItemsPerCategory as any)[SearchQueryTypes[l[0].type]]) ) ); } diff --git a/src/common/config/public/ClientConfig.ts b/src/common/config/public/ClientConfig.ts index cedade6f..f44dd7c2 100644 --- a/src/common/config/public/ClientConfig.ts +++ b/src/common/config/public/ClientConfig.ts @@ -58,6 +58,86 @@ export type TAGS = { } }; +@SubConfigClass({tags: {client: true}, softReadonly: true}) +export class AutoCompleteItemsPerCategoryConfig { + @ConfigProperty({ + type: 'unsignedInt', + tags: + { + name: $localize`Maximum items`, + priority: ConfigPriority.underTheHood + }, + description: $localize`Maximum number autocomplete items shown at once. If there is not enough items to reach this value, it takes upto double of the individual items.` + }) + maxItems: number = 30; + + @ConfigProperty({ + type: 'unsignedInt', + tags: + { + name: $localize`Max photo items`, + priority: ConfigPriority.underTheHood + }, + description: $localize`Maximum number autocomplete items shown per photo category.` + }) + file_name: number = 2; + + @ConfigProperty({ + type: 'unsignedInt', + tags: + { + name: $localize`Max directory items`, + priority: ConfigPriority.underTheHood + }, + description: $localize`Maximum number autocomplete items shown per directory category.` + }) + directory: number = 2; + + @ConfigProperty({ + type: 'unsignedInt', + tags: + { + name: $localize`Max caption items`, + priority: ConfigPriority.underTheHood + }, + description: $localize`Maximum number autocomplete items shown per caption category.` + }) + caption: number = 3; + + @ConfigProperty({ + type: 'unsignedInt', + tags: + { + name: $localize`Max position items`, + priority: ConfigPriority.underTheHood + }, + description: $localize`Maximum number autocomplete items shown per position category.` + }) + position: number = 3; + + @ConfigProperty({ + type: 'unsignedInt', + tags: + { + name: $localize`Max faces items`, + priority: ConfigPriority.underTheHood + }, + description: $localize`Maximum number autocomplete items shown per faces category.` + }) + person: number = 5; + + @ConfigProperty({ + type: 'unsignedInt', + tags: + { + name: $localize`Max keyword items`, + priority: ConfigPriority.underTheHood + }, + description: $localize`Maximum number autocomplete items shown per keyword category.` + }) + keyword: number = 5; +} + @SubConfigClass({tags: {client: true}, softReadonly: true}) export class AutoCompleteConfig { @ConfigProperty({ @@ -69,8 +149,8 @@ export class AutoCompleteConfig { description: $localize`Show hints while typing search query.` }) enabled: boolean = true; + @ConfigProperty({ - type: 'unsignedInt', tags: { name: $localize`Max items per category`, @@ -78,17 +158,8 @@ export class AutoCompleteConfig { }, description: $localize`Maximum number autocomplete items shown per category.` }) - targetItemsPerCategory: number = 5; - @ConfigProperty({ - type: 'unsignedInt', - tags: - { - name: $localize`Maximum items`, - priority: ConfigPriority.underTheHood - }, - description: $localize`Maximum number autocomplete items shown at once.` - }) - maxItems: number = 30; + ItemsPerCategory: AutoCompleteItemsPerCategoryConfig = new AutoCompleteItemsPerCategoryConfig(); + @ConfigProperty({ type: 'unsignedInt', tags: @@ -690,7 +761,7 @@ export class ClientGalleryConfig { name: $localize`Themes`, priority: ConfigPriority.advanced, } as TAGS, - description:$localize`Pigallery2 uses Bootstrap 5.3 (https://getbootstrap.com/docs/5.3) for design (css, layout). In dark mode it sets 'data-bs-theme="dark"' to the to take advantage bootstrap's color modes. For theming, read more at: https://getbootstrap.com/docs/5.3/customize/color-modes/` + description: $localize`Pigallery2 uses Bootstrap 5.3 (https://getbootstrap.com/docs/5.3) for design (css, layout). In dark mode it sets 'data-bs-theme="dark"' to the to take advantage bootstrap's color modes. For theming, read more at: https://getbootstrap.com/docs/5.3/customize/color-modes/` }) Themes: ThemesConfig = new ThemesConfig(); }