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.

164 lines
4.7 KiB

  1. const exportAll = require('./exportAll')
  2. const tagsDisplay = require('./tagsDisplay').display
  3. const displayBlock = require('./displayBlock')
  4. const editLink = require('./editLink')
  5. module.exports = class ObjectDisplay {
  6. constructor ({feature, category, dom, displayId, fallbackIds}, callback) {
  7. this.category = category
  8. this.displayId = displayId
  9. if (!fallbackIds) {
  10. fallbackIds = []
  11. }
  12. var div, h, dt, dd, li, a
  13. var k
  14. dom.innerHTML = ''
  15. dom.classList.add('objectDisplay')
  16. dom.classList.add('objectDisplay-' + displayId)
  17. let header = document.createElement('div')
  18. header.className = 'header'
  19. header.setAttribute('data-order', -1000)
  20. dom.appendChild(header)
  21. div = document.createElement('div')
  22. div.className = 'description'
  23. div.innerHTML = getProperty(feature.data, 'description', this.displayId, fallbackIds)
  24. header.appendChild(div)
  25. feature.sublayer.updateAssets(div, feature)
  26. div = document.createElement('div')
  27. div.className = 'title'
  28. div.innerHTML = getProperty(feature.data, 'title', this.displayId, fallbackIds)
  29. header.appendChild(div)
  30. feature.sublayer.updateAssets(div, feature)
  31. let body = document.createElement('div')
  32. body.className = 'body'
  33. let bodyCategory = document.createElement('div')
  34. body.appendChild(bodyCategory)
  35. let bodyTemplate = document.createElement('div')
  36. body.appendChild(bodyTemplate)
  37. let bodyBlock = displayBlock({
  38. dom,
  39. content: body,
  40. order: 0
  41. })
  42. this.updateListener = () => {
  43. bodyCategory.innerHTML = getProperty(feature.data, 'body', this.displayId, fallbackIds)
  44. feature.sublayer.updateAssets(bodyCategory, feature)
  45. category.renderTemplate(feature, this.displayId + 'Body', (err, result) => {
  46. bodyTemplate.innerHTML = result
  47. feature.sublayer.updateAssets(bodyTemplate, feature)
  48. if (bodyTemplate.innerHTML.match(/^\s*(<ul>\s*<\/ul>|)\s*$/) && bodyCategory.innerHTML.match(/^\s*(<ul>\s*<\/ul>|)\s*$/)) {
  49. bodyBlock.classList.add('empty')
  50. } else {
  51. bodyBlock.classList.remove('empty')
  52. }
  53. })
  54. }
  55. category.on('update', this.updateListener)
  56. this.updateListener()
  57. if (['details'].includes(this.displayId)) {
  58. displayBlock({
  59. dom,
  60. content: exportAll(feature),
  61. title: lang('header:export'),
  62. order: 5
  63. })
  64. }
  65. if (['details'].includes(this.displayId)) {
  66. displayBlock({
  67. dom,
  68. content: tagsDisplay(feature.object.tags),
  69. title: lang('header:attributes'),
  70. order: 10
  71. })
  72. div = document.createElement('dl')
  73. div.className = 'meta'
  74. dt = document.createElement('dt')
  75. dt.appendChild(document.createTextNode('id'))
  76. div.appendChild(dt)
  77. dd = document.createElement('dd')
  78. a = document.createElement('a')
  79. a.appendChild(document.createTextNode(feature.object.type + '/' + feature.object.osm_id))
  80. a.href = config.urlOpenStreetMap + '/' + feature.object.type + '/' + feature.object.osm_id
  81. a.target = '_blank'
  82. dd.appendChild(a)
  83. div.appendChild(dd)
  84. for (k in feature.object.meta) {
  85. dt = document.createElement('dt')
  86. dt.appendChild(document.createTextNode(k))
  87. div.appendChild(dt)
  88. dd = document.createElement('dd')
  89. dd.appendChild(document.createTextNode(feature.object.meta[k]))
  90. div.appendChild(dd)
  91. }
  92. displayBlock({
  93. dom,
  94. content: div,
  95. title: lang('header:osm_meta'),
  96. order: 11
  97. })
  98. }
  99. if (['popup'].includes(this.displayId)) {
  100. let id_with_sublayer = (feature.sublayer_id === 'main' ? '' : feature.sublayer_id + ':') + feature.id
  101. let footerContent = '<li><a class="showDetails" href="#' + this.category.id + '/' + id_with_sublayer + '/details">' + lang('show details') + '</a></li>'
  102. footerContent += '<li>' + editLink(feature) + '</li>'
  103. displayBlock({
  104. dom,
  105. content: '<ul class="footer">' + footerContent + '</ul>',
  106. order: 1000
  107. })
  108. }
  109. call_hooks_callback('show-' + this.displayId, feature, category, dom, err => {
  110. if (err.length) {
  111. return callback(err.join(', '))
  112. }
  113. callback()
  114. })
  115. }
  116. close () {
  117. if (this.updateListener) {
  118. this.category.off('update', this.updateListener)
  119. }
  120. call_hooks('hide-' + this.displayId)
  121. }
  122. }
  123. function getProperty(data, id, displayId, fallbackIds) {
  124. const idCap = id[0].toUpperCase() + id.substr(1)
  125. let variants = [displayId + idCap]
  126. variants = variants.concat(fallbackIds.map(fid => fid + idCap))
  127. variants.push(id)
  128. variants = variants.filter(vid => vid in data)
  129. if (variants.length) {
  130. return data[variants[0]]
  131. }
  132. return ''
  133. }