Source: tooltips/mapviewer-tooltips.js

import Overlay from 'ol/Overlay'

const libNamespace = 'tooltips'

/**
 * Service de gestion des tooltips
 */
class Tooltips {
  constructor (viewer, options) {
    const divPopUp = document.createElement('div')
    viewer.TOOLTIPS_LOADED = true
    this.ctx = viewer
    this.tooltipsList = []
    Object.assign(this, options)

    divPopUp.id = 'MapViewerTooltip'

    this.currentTooltip_ = new Overlay({
      element: divPopUp,
      positioning: 'bottom-center',
      offset: [0, -10],
      ...options,
    })

    this.tooltipActive_ = true
  }

  /**
     * Permet de créer un tooltip à partir de HTML
     *
     * @param  {string}        content    Contenu HTML du tooltip
     * @param  {Array<number>} coordinate Cooronées sur la carte
     * @return {boolean}                  False si erreur
     */
  createTooltip (content, coordinate) {
    if (!this.tooltipActive_) {
      return false
    }

    this.currentTooltip_.getElement().innerHTML = content
    if (coordinate) {
      this.showTooltip(coordinate)
    }
  }

  /**
   * Permet de créer un tooltip à partir d'un élément du DOM
   * @param {Object} arguments Arguments
   * @param {HTMLElement} arguments.node Element HTML à utiliser
   * @param {Array<Number>} arguments.coordinate Coordonnées du tooltip
   */
  createTooltipWithNode ({ node, coordinate }) {
    if (!this.tooltipActive_ || !node) {
      return false
    }

    this.currentTooltip_.getElement().innerHTML = ''
    const popupCluser = document.createElement('a')
    popupCluser.id = 'popupCloser'
    this.currentTooltip_.getElement().appendChild(popupCluser)
    this.currentTooltip_.getElement().appendChild(node)
    const _this = this
    popupCluser.onclick = function () {
      _this.hideTooltip()
    }
    if (coordinate) {
      this.showTooltip(coordinate)
    }
  }

  /**
   * Permet d'afficher/déplacer un tooltip sans changer son contenu
   *
   * @param {Array<Number>} coordinate Coordonnées du tooltip
   */
  showTooltip (coordinate) {
    this.hideTooltip()
    this.ctx.Map.addOverlay(this.currentTooltip_)
    if (coordinate) {
      this.currentTooltip_.setPosition(coordinate)
    }
  }

  /**
   * Permet de masquer un tooltip sans vider son contenu
   */
  hideTooltip () {
    this.ctx.Map.removeOverlay(this.currentTooltip_)
  }

  /**
   * Permet de masquer un tooltip et de supprimer son contenu
   */
  deleteTooltip () {
    this.hideTooltip()
    this.currentTooltip_.getElement().innerHTML = ''
  }

  /**
     * Permet de désactiver les tooltips
     */
  disabledTooltip () {
    this.deleteTooltip()
    this.tooltipActive_ = false
  }

  /**
     * Permet d'activer les tooltips
     */
  enabledTooltip () {
    this.tooltipActive_ = true
  }
}

// Permet d'etendre le module
export default function extendCoreLib (options) {
  return function patch (viewer) {
    let functions = { }
    const obj = new Tooltips(viewer, options)

    if (libNamespace === '') {
      functions = obj
    } else {
      functions[libNamespace] = obj
    }
    return Object.assign(viewer, functions)
  }
}