You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
129 lines
3.1 KiB
129 lines
3.1 KiB
/* global alert */
|
|
var async = require('async')
|
|
var OpenStreetBrowserLoader = require('./OpenStreetBrowserLoader')
|
|
var CategoryBase = require('./CategoryBase')
|
|
|
|
CategoryIndex.prototype = Object.create(CategoryBase.prototype)
|
|
CategoryIndex.prototype.constructor = CategoryIndex
|
|
function CategoryIndex (options, data, repository) {
|
|
CategoryBase.call(this, options, data, repository)
|
|
|
|
this.childrenDoms = {}
|
|
this.childrenCategories = null
|
|
|
|
this._loadChildrenCategories(function (err) {
|
|
if (err) {
|
|
console.log('error loading child categories:', err)
|
|
}
|
|
})
|
|
}
|
|
|
|
CategoryIndex.prototype.open = function () {
|
|
if (this.isOpen) {
|
|
return
|
|
}
|
|
|
|
CategoryBase.prototype.open.call(this)
|
|
|
|
if (this.childrenCategories !== null) {
|
|
this.isOpen = true
|
|
}
|
|
}
|
|
|
|
CategoryIndex.prototype.recalc = function () {
|
|
for (var k in this.childrenCategories) {
|
|
if (this.childrenCategories[k]) {
|
|
this.childrenCategories[k].recalc()
|
|
}
|
|
}
|
|
}
|
|
|
|
CategoryIndex.prototype._loadChildrenCategories = function (callback) {
|
|
this.childrenCategories = {}
|
|
|
|
async.forEach(this.data.subCategories,
|
|
function (data, callback) {
|
|
var childDom = document.createElement('div')
|
|
childDom.className = 'categoryWrapper'
|
|
this.domContent.appendChild(childDom)
|
|
this.childrenDoms[data.id] = childDom
|
|
|
|
this.childrenCategories[data.id] = null
|
|
|
|
if ('type' in data) {
|
|
OpenStreetBrowserLoader.getCategoryFromData(data.id, this.options, data, this._loadChildCategory.bind(this, data.id, callback))
|
|
} else {
|
|
OpenStreetBrowserLoader.getCategory(data.id, this.options, this._loadChildCategory.bind(this, data.id, callback))
|
|
}
|
|
}.bind(this),
|
|
function (err) {
|
|
if (callback) {
|
|
callback(err)
|
|
}
|
|
}
|
|
)
|
|
}
|
|
|
|
CategoryIndex.prototype._loadChildCategory = function (id, callback, err, category) {
|
|
if (err) {
|
|
return callback(err)
|
|
}
|
|
|
|
this.childrenCategories[id] = category
|
|
|
|
category.setParent(this)
|
|
category.setParentDom(this.childrenDoms[id])
|
|
|
|
callback(err, category)
|
|
}
|
|
|
|
CategoryIndex.prototype.close = function () {
|
|
if (!this.isOpen) {
|
|
return
|
|
}
|
|
|
|
CategoryBase.prototype.close.call(this)
|
|
|
|
for (var k in this.childrenCategories) {
|
|
if (this.childrenCategories[k]) {
|
|
this.childrenCategories[k].close()
|
|
}
|
|
}
|
|
}
|
|
|
|
CategoryIndex.prototype.toggleCategory = function (id) {
|
|
OpenStreetBrowserLoader.getCategory(id, function (err, category) {
|
|
if (err) {
|
|
alert(err)
|
|
return
|
|
}
|
|
|
|
category.setParent(this)
|
|
category.setParentDom(this.childrenDoms[id])
|
|
this.childrenCategories[id] = category
|
|
|
|
category.toggle()
|
|
}.bind(this))
|
|
}
|
|
|
|
CategoryIndex.prototype.allMapFeatures = function (callback) {
|
|
let result = []
|
|
|
|
async.each(this.childrenCategories,
|
|
(category, done) => category.allMapFeatures(
|
|
(err, data) => {
|
|
if (err) {
|
|
return done(err)
|
|
}
|
|
|
|
result = result.concat(data)
|
|
|
|
global.setTimeout(done, 0)
|
|
}
|
|
),
|
|
(err) => callback(err, result)
|
|
)
|
|
}
|
|
|
|
OpenStreetBrowserLoader.registerType('index', CategoryIndex)
|
|
module.exports = CategoryIndex
|