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 () {