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.

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