@geogirafe/lib-geoportal
Version:
GeoGirafe is a flexible application to build online geoportals.
96 lines (95 loc) • 3.9 kB
JavaScript
import AbstractSearchClient from './abstractsearchclient.js';
/**
* A search provider for the GeoMapFish backend.
* Extends the AbstractSearchClient and provides methods tailored to processing GMF-specific search results.
*
* Configuration:
* - providerName: The name of the search provider, or geomapfish.
* - url: The URL of the GMF search service.
* - resultSrid: The spatial reference system (SRID) of the search results. Default same as map SRID.
*/
class GmfSearchClient extends AbstractSearchClient {
searchFilterQueryParameter = 'categories';
layerTreeCategory = 'category_layer_tree';
constructor(context, config) {
super(context, config);
}
/**
* Create the search capabilities URL by using the search URL and appending '/capabilities' to it.
*/
get searchCapabilitiesUrl() {
const capabilitiesUrl = new URL(this.url.toString().split('?')[0]);
capabilitiesUrl.pathname += '/capabilities';
// Reintroduce language and interface parameter
const interfaceParameter = this.url.searchParams.get('interface');
if (interfaceParameter) {
capabilitiesUrl.searchParams.set('interface', interfaceParameter);
}
if (this.searchLangQueryParameter && this.context.stateManager.state.language) {
capabilitiesUrl.searchParams.set(this.searchLangQueryParameter, this.context.stateManager.state.language);
}
return capabilitiesUrl;
}
/**
* Returns a list of categories that can be searched by
*/
async getSearchCategories() {
const response = await fetch(this.searchCapabilitiesUrl);
if (response.ok) {
try {
const content = (await response.json());
// Add a fixed category to search layers in the layer tree
const categories = content.categories;
categories.unshift(this.layerTreeCategory);
return categories;
}
catch (error) {
console.warn(`No search categories available: Search capabilities response malformed.\n${error}`);
}
}
else {
console.warn('No search categories available: Search capabilities endpoint not reachable.');
}
return [];
}
/**
* If the search request should filter results by layer tree elements, the URL needs to include an additional parameter
* `null_category` to include layer results.
*/
buildRequestUrl(term, filter) {
if (!filter.length) {
return super.buildRequestUrl(term, filter);
}
let includeLayerResults = 'false';
const modifiedFilter = [...filter];
if (modifiedFilter.includes(this.layerTreeCategory)) {
modifiedFilter.splice(modifiedFilter.indexOf(this.layerTreeCategory), 1);
includeLayerResults = 'true';
}
const url = super.buildRequestUrl(term, modifiedFilter);
url.searchParams.set('null_category', includeLayerResults);
return url;
}
groupedResults(results) {
const groupedResults = {};
for (const result of results) {
let group = 'Unknown layer type';
if (result.get('layer_name')) {
group = result.get('layer_name');
}
else if (result.get('actions')[0].action.startsWith('add_theme')) {
group = 'add_theme';
}
else if (result.get('actions')[0].action.startsWith('add_group')) {
group = 'add_group';
}
else if (result.get('actions')[0].action.startsWith('add_layer')) {
group = 'add_layer';
}
groupedResults[group] ??= [];
groupedResults[group].push(result);
}
return groupedResults;
}
}
export default GmfSearchClient;