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.

170 lines
4.7 KiB

  1. const OverpassLayer = require('overpass-layer')
  2. const tabs = require('modulekit-tabs')
  3. const state = require('./state')
  4. const Filter = require('overpass-frontend').Filter
  5. const getPathFromJSON = require('./getPathFromJSON')
  6. class CategoryOverpassFilter {
  7. constructor (master) {
  8. this.master = master
  9. this.data = this.master.data.filter
  10. this.tabFilter = new tabs.Tab({
  11. id: 'filter'
  12. })
  13. this.master.tools.add(this.tabFilter)
  14. this.tabFilter.header.innerHTML = '<i class="fa fa-filter" aria-hidden="true"></i>'
  15. this.tabFilter.header.title = lang('filter')
  16. this.domFilter = document.createElement('form')
  17. this.tabFilter.content.appendChild(this.domFilter)
  18. this.tabFilter.on('select', () => this.formFilter.resize())
  19. for (var k in this.data) {
  20. let f = this.data[k]
  21. if ('name' in f && typeof f.name === 'string') {
  22. global.currentCategory = this.master
  23. let t = OverpassLayer.twig.twig({ data: f.name, autoescape: true })
  24. f.name = t.render({}).toString()
  25. } else if (!('name' in f)) {
  26. f.name = lang('tag:' + k)
  27. }
  28. if ('values' in f) {
  29. let template = OverpassLayer.twig.twig({ data: f.valueName || '{{ value }}', autoescape: true })
  30. if (typeof f.values === 'string') {
  31. f.values = getPathFromJSON(f.values, this.master.data)
  32. }
  33. if (Array.isArray(f.values) && f.valueName) {
  34. let newValues = {}
  35. f.values.forEach(value => {
  36. newValues[value] = template.render({ value }).toString()
  37. })
  38. f.values = newValues
  39. } else if (typeof f.values === 'object') {
  40. for (var k1 in f.values) {
  41. if (typeof f.values[k1] === 'string') {
  42. let t = OverpassLayer.twig.twig({ data: f.values[k1], autoescape: true })
  43. f.values[k1] = t.render({}).toString()
  44. } else if (typeof f.values[k1] === 'object') {
  45. if (!('name' in f.values[k1])) {
  46. f.values[k1].name = template.render({ value: k1 }).toString()
  47. } else if (f.values[k1].name) {
  48. let t = OverpassLayer.twig.twig({ data: f.values[k1].name, autoescape: true })
  49. f.values[k1].name = t.render({}).toString()
  50. }
  51. }
  52. }
  53. }
  54. }
  55. }
  56. let masterOptions = {}
  57. if (Object.keys(this.data).length > 1) {
  58. masterOptions = {
  59. 'type': 'form_chooser',
  60. 'button:add_element': '-- ' + lang('choose_filter') + ' --',
  61. 'order': false
  62. }
  63. }
  64. this.formFilter = new form('filter-' + this.master.id, this.data, masterOptions)
  65. this.formFilter.show(this.domFilter)
  66. this.formFilter.onchange = function () {
  67. let param = JSON.parse(JSON.stringify(this.formFilter.get_data()))
  68. this.applyParam(param)
  69. this.master.layer.check_update_map()
  70. state.update()
  71. }.bind(this)
  72. this.master.on('setParam', this.setParam.bind(this))
  73. this.master.on('applyParam', this.applyParam.bind(this))
  74. this.master.on('open', this.openCategory.bind(this))
  75. this.master.on('stateGet', this.stateGet.bind(this))
  76. }
  77. setParam (param) {
  78. this.formFilter.set_data(param)
  79. }
  80. applyParam (param) {
  81. this.additionalFilter = []
  82. let kvFilter = []
  83. for (var k in param) {
  84. if (param[k] === null) {
  85. continue
  86. }
  87. var d = this.data[k]
  88. if ('values' in d && param[k] in d.values && typeof d.values[param[k]] === 'object' && 'query' in d.values[param[k]]) {
  89. let f = new Filter(d.values[param[k]].query)
  90. this.additionalFilter.push(f.def)
  91. continue
  92. }
  93. var v = {
  94. key: 'key' in d ? d.key : k,
  95. value: param[k],
  96. op: '='
  97. }
  98. if ('op' in d) {
  99. if (d.op === 'has_key_value') {
  100. v = {
  101. key: param[k],
  102. op: 'has_key'
  103. }
  104. } else {
  105. v.op = d.op
  106. }
  107. }
  108. kvFilter.push(v)
  109. }
  110. if (kvFilter.length) {
  111. this.additionalFilter.push(kvFilter)
  112. }
  113. if (this.additionalFilter.length === 0) {
  114. this.additionalFilter = []
  115. } else if (this.additionalFilter.length === 1) {
  116. this.additionalFilter = this.additionalFilter[0]
  117. } else {
  118. this.additionalFilter = { and: this.additionalFilter }
  119. }
  120. this.master.layer.options.queryOptions.filter = this.additionalFilter
  121. this.tabFilter.select()
  122. }
  123. openCategory () {
  124. this.formFilter.resize()
  125. }
  126. stateGet (param) {
  127. let data = this.formFilter.get_data()
  128. for (var k in data) {
  129. if (data[k]) {
  130. param[k] = data[k]
  131. }
  132. }
  133. }
  134. }
  135. register_hook('category-overpass-init', (category) => {
  136. if (category.data.filter) {
  137. new CategoryOverpassFilter(category)
  138. }
  139. })