diff --git a/package.json b/package.json
index 0992b57a..a2e8b41e 100644
--- a/package.json
+++ b/package.json
@@ -11,13 +11,14 @@
"@mapbox/maki": "^5.0.0",
"async": "^2.5.0",
"async-foreach": "^0.1.3",
- "babelify": "^8.0.0",
"babel-cli": "^6.26.0",
"babel-core": "^6.26.0",
"babel-preset-env": "^1.6.1",
+ "babelify": "^8.0.0",
"color-interpolate": "^1.0.2",
"event-emitter": "^0.3.5",
"file-saver": "^2.0.0",
+ "font-awesome": "^4.7.0",
"i18next-client": "^1.11.4",
"ip-location": "^1.0.1",
"json-multiline-strings": "^0.1.0",
diff --git a/src/CategoryOverpass.js b/src/CategoryOverpass.js
index f7660924..03695e1a 100644
--- a/src/CategoryOverpass.js
+++ b/src/CategoryOverpass.js
@@ -110,65 +110,8 @@ function CategoryOverpass (options, data) {
this.layer.on('remove', (ob, data) => this.emit('remove', ob, data))
this.layer.on('zoomChange', (ob, data) => this.emit('remove', ob, data))
- if (this.data.filter) {
- this.tabFilter = new tabs.Tab({
- id: 'filter'
- })
- this.tools.add(this.tabFilter)
-
- this.tabFilter.header.innerHTML = ''
- this.tabFilter.header.title = lang('filter')
-
- this.domFilter = document.createElement('form')
- this.tabFilter.content.appendChild(this.domFilter)
-
- this.tabFilter.on('select', () => this.formFilter.resize())
-
- for (var k in this.data.filter) {
- let f = this.data.filter[k]
- if ('name' in f && typeof f.name === 'string') {
- let t = OverpassLayer.twig.twig({ data: f.name, autoescape: true })
- f.name = t.render({}).toString()
- } else if (!('name' in f)) {
- f.name = lang('tag:' + k)
- }
-
- if ('values' in f) {
- if (Array.isArray(f.values) && f.valueName) {
- let template = OverpassLayer.twig.twig({ data: f.valueName, autoescape: true })
- let newValues = {}
- f.values.forEach(value => {
- newValues[value] = template.render({ value }).toString()
- })
- f.values = newValues
- } else if (typeof f.values === 'object') {
- for (var k1 in f.values) {
- if (typeof f.values[k1] === 'string') {
- let t = OverpassLayer.twig.twig({ data: f.values[k1], autoescape: true })
- f.values[k1] = t.render({}).toString()
- }
- }
- }
- }
- }
- this.formFilter = new form(this.id, this.data.filter,
- {
- 'type': 'form_chooser',
- 'button:add_element': '-- ' + lang('filter_results') + ' --',
- 'order': false
- }
- )
- this.formFilter.show(this.domFilter)
- this.formFilter.onchange = function () {
- let param = JSON.parse(JSON.stringify(this.formFilter.get_data()))
-
- this._applyParam(param)
-
- this.layer.check_update_map()
- state.update()
- }.bind(this)
- }
+ call_hooks('category-overpass-init', this)
var p = document.createElement('div')
p.className = 'loadingIndicator'
@@ -199,18 +142,17 @@ function CategoryOverpass (options, data) {
let id = this.id
- if (this.formFilter) {
- let param = JSON.parse(JSON.stringify(this.formFilter.get_data()))
+ let param = {}
+ this.emit('stateGet', param)
- for (var k in param) {
- if (!param[k]) {
- delete param[k]
- }
+ for (var k in param) {
+ if (!param[k]) {
+ delete param[k]
}
+ }
- if (param && Object.keys(param).length) {
- id += '[' + queryString.stringify(param) + ']'
- }
+ if (param && Object.keys(param).length) {
+ id += '[' + queryString.stringify(param) + ']'
}
state.categories += id
@@ -241,42 +183,12 @@ function CategoryOverpass (options, data) {
}
CategoryOverpass.prototype.setParam = function (param) {
- this.formFilter.set_data(param)
+ this.emit('setParam', param)
this._applyParam(param)
}
CategoryOverpass.prototype._applyParam = function (param) {
- this.additionalFilter = []
- for (var k in param) {
- if (param[k] === null) {
- continue
- }
-
- var d = this.data.filter[k]
-
- var v = {
- key: k,
- value: param[k],
- op: '='
- }
-
- if ('op' in d) {
- if (d.op === 'has_key_value') {
- v = {
- key: param[k],
- op: 'has_key'
- }
- } else {
- v.op = d.op
- }
- }
-
- this.additionalFilter.push(v)
- }
-
- this.layer.options.queryOptions.filter = this.additionalFilter
-
- this.tabFilter.select()
+ this.emit('applyParam', param)
}
CategoryOverpass.prototype.updateAssets = function (div) {
@@ -475,9 +387,7 @@ CategoryOverpass.prototype.open = function () {
this.updateInfo()
}
- if (this.formFilter) {
- this.formFilter.resize()
- }
+ this.emit('open')
}
CategoryOverpass.prototype.updateInfo = function () {
diff --git a/src/CategoryOverpassFilter.js b/src/CategoryOverpassFilter.js
new file mode 100644
index 00000000..1b46dc44
--- /dev/null
+++ b/src/CategoryOverpassFilter.js
@@ -0,0 +1,128 @@
+const OverpassLayer = require('overpass-layer')
+const tabs = require('modulekit-tabs')
+
+const state = require('./state')
+
+class CategoryOverpassFilter {
+ constructor (master) {
+ this.master = master
+ this.data = this.master.data.filter
+
+ this.tabFilter = new tabs.Tab({
+ id: 'filter'
+ })
+ this.master.tools.add(this.tabFilter)
+
+ this.tabFilter.header.innerHTML = ''
+ this.tabFilter.header.title = lang('filter')
+
+ this.domFilter = document.createElement('form')
+ this.tabFilter.content.appendChild(this.domFilter)
+
+ this.tabFilter.on('select', () => this.formFilter.resize())
+
+ for (var k in this.data) {
+ let f = this.data[k]
+ if ('name' in f && typeof f.name === 'string') {
+ let t = OverpassLayer.twig.twig({ data: f.name, autoescape: true })
+ f.name = t.render({}).toString()
+ } else if (!('name' in f)) {
+ f.name = lang('tag:' + k)
+ }
+
+ if ('values' in f) {
+ if (Array.isArray(f.values) && f.valueName) {
+ let template = OverpassLayer.twig.twig({ data: f.valueName, autoescape: true })
+ let newValues = {}
+ f.values.forEach(value => {
+ newValues[value] = template.render({ value }).toString()
+ })
+ f.values = newValues
+ } else if (typeof f.values === 'object') {
+ for (var k1 in f.values) {
+ if (typeof f.values[k1] === 'string') {
+ let t = OverpassLayer.twig.twig({ data: f.values[k1], autoescape: true })
+ f.values[k1] = t.render({}).toString()
+ }
+ }
+ }
+ }
+ }
+
+ this.formFilter = new form('filter-' + this.master.id, this.data,
+ {
+ 'type': 'form_chooser',
+ 'button:add_element': '-- ' + lang('filter_results') + ' --',
+ 'order': false
+ }
+ )
+ this.formFilter.show(this.domFilter)
+ this.formFilter.onchange = function () {
+ let param = JSON.parse(JSON.stringify(this.formFilter.get_data()))
+
+ this.applyParam(param)
+
+ this.master.layer.check_update_map()
+ state.update()
+ }.bind(this)
+
+ this.master.on('setParam', param => this.formFilter.set_data(param))
+ this.master.on('applyParam', param => this.applyParam(param))
+ this.master.on('open', () => this.openCategory())
+ this.master.on('stateGet', param => this.stateGet(param))
+ }
+
+ applyParam (param) {
+ this.additionalFilter = []
+ for (var k in param) {
+ if (param[k] === null) {
+ continue
+ }
+
+ var d = this.data[k]
+
+ var v = {
+ key: k,
+ value: param[k],
+ op: '='
+ }
+
+ if ('op' in d) {
+ if (d.op === 'has_key_value') {
+ v = {
+ key: param[k],
+ op: 'has_key'
+ }
+ } else {
+ v.op = d.op
+ }
+ }
+
+ this.additionalFilter.push(v)
+ }
+
+ this.master.layer.options.queryOptions.filter = this.additionalFilter
+
+ this.tabFilter.select()
+ }
+
+ openCategory () {
+ this.formFilter.resize()
+ }
+
+ stateGet (param) {
+ let data = this.formFilter.get_data()
+
+ for (var k in data) {
+ if (data[k]) {
+ param[k] = data[k]
+ }
+ }
+ }
+}
+
+register_hook('category-overpass-init', (category) => {
+ if (category.data.filter) {
+ new CategoryOverpassFilter(category)
+ }
+})
diff --git a/src/index.js b/src/index.js
index 65350567..26d9c093 100644
--- a/src/index.js
+++ b/src/index.js
@@ -35,6 +35,7 @@ require('./wikipedia')
require('./image')
require('./addCategories')
require('./permalink')
+require('./CategoryOverpassFilter')
let exportAll = require('./exportAll')
window.onload = function () {