UNPKG

@geogirafe/lib-geoportal

Version:

GeoGirafe is a flexible application to build online geoportals.

96 lines (95 loc) • 3.9 kB
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;