File

src/utility/eposLeaflet/components/featureDisplay/htmlFeatureIdentifier.ts

Implements

FeatureDisplayItemGenerator

Index

Properties
Methods

Constructor

constructor(layer: MapLayer, urlCreator: (layer: MapLayer,clickEvent: L.LeafletMouseEvent) => void)
Parameters :
Name Type Optional
layer MapLayer No
urlCreator function No

Properties

Protected featureServiceCaller
Default value : this.defaultFeatureServiceCaller.bind(this) as ( http: HttpClient, layer: MapLayer, clickEvent: L.LeafletMouseEvent, ) => Promise<string>
Protected itemDisplayGenerator
Default value : this.defaultDisplayElementGenerator.bind(this) as ( content: string, layer: MapLayer, ) => HTMLElement
Protected urlCreator
Type : function

Methods

Protected defaultDisplayElementGenerator
defaultDisplayElementGenerator(content: string, layer: MapLayer)
Parameters :
Name Type Optional
content string No
layer MapLayer No
Returns : HTMLElement
Protected defaultFeatureServiceCaller
defaultFeatureServiceCaller(http: HttpClient, layer: MapLayer, clickEvent: L.LeafletMouseEvent)
Parameters :
Name Type Optional
http HttpClient No
layer MapLayer No
clickEvent L.LeafletMouseEvent No
Returns : Promise<null | string | undefined>
Public getFeatureDisplayItems
getFeatureDisplayItems(clickEvent: L.LeafletMouseEvent, http: HttpClient)

Called by the map component to get feature display element generation functions

Parameters :
Name Type Optional Description
clickEvent L.LeafletMouseEvent No

Map click mouse event

http HttpClient No

http client for use if required

Public setFeatureServiceCaller
setFeatureServiceCaller(featureServiceCaller: (http: HttpClient,layer: MapLayer,clickEvent: L.LeafletMouseEvent) => void)

set this function to define how a service is called

Parameters :
Name Type Optional Description
featureServiceCaller function No

Function that will return a function that returns feature details

Public setItemDisplayGenerator
setItemDisplayGenerator(itemDisplayGenerator: (content: string,layer: MapLayer) => void)

are displayed

Parameters :
Name Type Optional Description
itemDisplayGenerator function No

function that defines how the required feature attributes are displayed

Public setUrlCreator
setUrlCreator(urlCreator: (layer: MapLayer,clickEvent: L.LeafletMouseEvent) => void)

the default featureServiceCaller method

Parameters :
Name Type Optional Description
urlCreator function No

Function that defines how the the url is generated for the default featureServiceCaller method

import { HttpClient } from '@angular/common/http';
import * as L from 'leaflet';
import { FeatureDisplayItemGenerator } from './featureDisplayItemGenerator';
import { FeatureDisplayItem } from './featureDisplayItem';
import { MapLayer } from '../layers/mapLayer.abstract';

export class HtmlFeatureIdentifier implements FeatureDisplayItemGenerator {
  // used to call service for feature data
  protected featureServiceCaller = this.defaultFeatureServiceCaller.bind(this) as (
    http: HttpClient,
    layer: MapLayer,
    clickEvent: L.LeafletMouseEvent,
  ) => Promise<string>;
  // used (by the default feature service caller) to generate a url to get the feature details
  protected urlCreator: (layer: MapLayer, clickEvent: L.LeafletMouseEvent) => string;

  protected itemDisplayGenerator = this.defaultDisplayElementGenerator.bind(this) as (
    content: string,
    layer: MapLayer,
  ) => HTMLElement;

  constructor(protected layer: MapLayer, urlCreator: (layer: MapLayer, clickEvent: L.LeafletMouseEvent) => string) {
    this.urlCreator = urlCreator;
  }

  /**
   * Called by the map component to get feature display element generation functions
   * @param http http client for use if required
   * @param mapState current MapState object
   * @param clickEvent Map click mouse event
   */
  public getFeatureDisplayItems(clickEvent: L.LeafletMouseEvent, http: HttpClient): Promise<Array<FeatureDisplayItem>> {
    return this.featureServiceCaller(http, this.layer, clickEvent)
      .then((body: string) => {
        const features = new Array<FeatureDisplayItem>();
        if (0 !== body.trim().length) {
          features.push(
            new FeatureDisplayItem(null, () => {
              return this.itemDisplayGenerator(body, this.layer);
            }),
          );
        }
        return features;
      })
      .catch(() => {
        console.warn(`ERROR processing feature identify info for layer: ${this.layer.name}`);
        return Promise.resolve(new Array<FeatureDisplayItem>());
      });
  }

  /**
   * set this function to define how a service is called
   * @param featureServiceCaller Function that will return a function that returns feature details
   */
  public setFeatureServiceCaller(
    featureServiceCaller: (http: HttpClient, layer: MapLayer, clickEvent: L.LeafletMouseEvent) => Promise<string>,
  ): this {
    this.featureServiceCaller = featureServiceCaller;
    return this;
  }

  /**
   * @param urlCreator Function that defines how the the url is generated for
   * the default featureServiceCaller method
   */
  public setUrlCreator(urlCreator: (layer: MapLayer, clickEvent: L.LeafletMouseEvent) => string): this {
    this.urlCreator = urlCreator;
    return this;
  }

  /**
   * @param itemDisplayGenerator function that defines how the required feature attributes
   * are displayed
   */
  public setItemDisplayGenerator(itemDisplayGenerator: (content: string, layer: MapLayer) => HTMLElement): this {
    this.itemDisplayGenerator = itemDisplayGenerator;
    return this;
  }

  // default featureServiceCaller
  // uses the set urlCreator function
  protected defaultFeatureServiceCaller(
    http: HttpClient,
    layer: MapLayer,
    clickEvent: L.LeafletMouseEvent,
  ): Promise<null | string | undefined> {
    const url = this.urlCreator(layer, clickEvent);
    return Promise.resolve<null | string | undefined>(
      (null == url)
        ? null
        : http
          .get(url, { responseType: 'text' })
          .toPromise()
          .catch(() => {
            console.warn(`ERROR retrieving feature identify info for layer: ${layer.name}`);
            return null;
          }),
    );
  }

  // default itemDisplayGenerator
  // displays feature details in a table
  protected defaultDisplayElementGenerator(content: string, layer: MapLayer): HTMLElement {
    const titleElement = document.createElement('h5');
    titleElement.classList.add('popup-title');
    titleElement.innerHTML = layer.name;

    const displayElement = document.createElement('div');
    displayElement.classList.add('html-feature-wrapper');
    displayElement.innerHTML = content;
    displayElement.append();

    const featureWrapper = document.createElement('div');
    featureWrapper.appendChild(titleElement);
    featureWrapper.appendChild(displayElement);

    return featureWrapper;
  }
}

results matching ""

    No results matching ""