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
3.7 KiB

  1. const tabs = require('modulekit-tabs')
  2. const async = require('async')
  3. const FileSaver = require('file-saver')
  4. const chunkSplit = require('./chunkSplit')
  5. const types = {
  6. GeoJSON: require('./ExportGeoJSON'),
  7. OSMXML: require('./ExportOSMXML'),
  8. OSMJSON: require('./ExportOSMJSON')
  9. }
  10. let tab
  11. let formExport
  12. function prepareDownload (callback) {
  13. let conf = formExport.get_data()
  14. call_hooks('prepareDownload', conf)
  15. global.baseCategory.allMapFeatures((err, data) => {
  16. if (err) {
  17. return callback(err)
  18. }
  19. createDownload(conf, data, callback)
  20. })
  21. }
  22. function createDownload (conf, data, callback) {
  23. let type = types[conf.type]
  24. let exportFun = new type(conf)
  25. let chunks = chunkSplit(data, 1000)
  26. let parentNode
  27. async.mapLimit(
  28. chunks,
  29. 1,
  30. (chunk, done) => {
  31. async.map(chunk,
  32. (ob, done) => exportFun.each(ob, done),
  33. (err, result) => {
  34. global.setTimeout(() => done(err, result), 0)
  35. }
  36. )
  37. },
  38. (err, data) => {
  39. if (err) {
  40. return callback(err)
  41. }
  42. if (data.length !== 0) {
  43. data = data.reduce((all, chunk) => all.concat(chunk))
  44. }
  45. let result = exportFun.finish(data)
  46. var blob = new Blob([ result.content ], { type: result.fileType + ';charset=utf-8' })
  47. FileSaver.saveAs(blob, 'openstreetbrowser.' + result.extension)
  48. call_hooks('finishDownload', conf)
  49. callback()
  50. }
  51. )
  52. }
  53. function formDef () {
  54. let values = {}
  55. Object.keys(types).forEach(type =>
  56. values[type] = lang('export:' + type)
  57. )
  58. return {
  59. type: {
  60. name: 'Type',
  61. type: 'radio',
  62. values,
  63. default: Object.keys(types)[0]
  64. }
  65. }
  66. }
  67. register_hook('init', function () {
  68. tab = new tabs.Tab({
  69. id: 'export',
  70. weight: 10
  71. })
  72. global.tabs.add(tab)
  73. tab.header.innerHTML = '<i class="fa fa-download" aria-hidden="true"></i>'
  74. tab.header.title = lang('export-all')
  75. tab.content.innerHTML = '<h3>' + lang('export-all') + '</h3>'
  76. formExport = new form('export', formDef())
  77. let domForm = document.createElement('form')
  78. tab.content.appendChild(domForm)
  79. formExport.show(domForm)
  80. let submit = document.createElement('input')
  81. submit.type = 'submit'
  82. submit.value = lang('export-prepare')
  83. submit.onclick = () => {
  84. let progressIndicator = document.createElement('div')
  85. progressIndicator.innerHTML = '<i class="fa fa-spinner fa-pulse fa-fw"></i> ' + lang('loading')
  86. tab.content.appendChild(progressIndicator)
  87. submit.style.display = 'none'
  88. prepareDownload((err) => {
  89. if (err) {
  90. alert(err)
  91. }
  92. submit.style.display = 'block'
  93. tab.content.removeChild(progressIndicator)
  94. tab.unselect()
  95. })
  96. }
  97. tab.content.appendChild(submit)
  98. tab.on('select', () => {
  99. formExport.resize()
  100. })
  101. })
  102. module.exports = (data) => {
  103. const div = document.createElement('div')
  104. let formExport = new form('exportOne', formDef())
  105. let domForm = document.createElement('form')
  106. div.appendChild(domForm)
  107. formExport.show(domForm)
  108. let submit = document.createElement('input')
  109. submit.type = 'submit'
  110. submit.value = lang('export-prepare')
  111. submit.onclick = () => {
  112. let progressIndicator = document.createElement('div')
  113. progressIndicator.innerHTML = '<i class="fa fa-spinner fa-pulse fa-fw"></i> ' + lang('loading')
  114. div.appendChild(progressIndicator)
  115. submit.style.display = 'none'
  116. let conf = formExport.get_data()
  117. conf.singleFeature = true
  118. createDownload(conf, [ data ], (err) => {
  119. if (err) {
  120. alert(err)
  121. }
  122. submit.style.display = 'block'
  123. div.removeChild(progressIndicator)
  124. })
  125. }
  126. div.appendChild(submit)
  127. global.setTimeout(() => formExport.resize(), 0)
  128. return div
  129. }