/**
* @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