Source: BasemapHelper.js

/**
 * @module nyc/BasemapHelper
 */

import $ from 'jquery'

/**
 * @desc A helper object for creating and manipulating the NYC basemap
 * @public
 * @mixin
 */
const BasemapHelper = {
  /**
   * @desc Hook up events
   * @public
   * @method
   * @param {Element} node The DOM node for the map
   */
  hookupEvents(node) {
    $(node).on('drop', $.proxy(this.loadLayer, this))
    $(node).on('dragover', (event) => {
      event.preventDefault()
    })
  },
  /**
   * @desc Loads a layer from a file
   * @public
   * @method
   * @param {jQuery.Event} event Event object
   */
  loadLayer(event) {
    const transfer = event.originalEvent.dataTransfer
    event.preventDefault()
    event.stopPropagation()
    if (transfer && transfer.files.length) {
      const files = transfer.files
      const ext = files[0].name.split('.').pop().toLowerCase()
      if (ext === 'json') {
        this.storage.loadGeoJsonFile(this, null, files[0])
      } else {
        this.storage.loadShapeFile(this, null, files)
      }
    }
  },
  /**
   * @desc Returns the photo layers ordered by year
   * @public
   * @method
   * @return {Array<ol.layer.Base|L.Layer>} Array of photo layers
   */
  sortedPhotos() {
    const sorted = []
    Object.keys(this.photos).forEach(photo => {
      sorted.push(this.photos[photo])
    })
    /* sort descending on the first 4 digits - puts 2001-2 in the proper place */
    return sorted.sort((a, b) => {
      const aName = a.name || a.get('name')
      const bName = b.name || b.get('name')
      return bName.substr(0, 4) - aName.substr(0, 4)
    })
  },
  /**
   * @desc Enumerator for label types
   * @public
   * @enum {string}
   */
  LabelType: {
    /**
     * @desc Label type for base layer
     */
    BASE: 'base',
    /**
     * @desc Label type for photo layer
     */
    PHOTO: 'photo'
  }
}

/**
 * @desc Object type to hold base layers
 * @public
 * @typedef {Object}
 * @property {Object} base The base layer
 * @property {Object<string, ol.layer.Base|L.Layer>} labels The label layers
 * @property {Object<string, ol.layer.Base|L.Layer>} photos The photo layers
 */
BasemapHelper.BaseLayers

export default BasemapHelper