umap-project 3.4.0b1__py3-none-any.whl → 3.4.2__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (202) hide show
  1. umap/__init__.py +1 -1
  2. umap/context_processors.py +1 -1
  3. umap/locale/da/LC_MESSAGES/django.mo +0 -0
  4. umap/locale/da/LC_MESSAGES/django.po +20 -16
  5. umap/locale/en/LC_MESSAGES/django.po +18 -14
  6. umap/locale/es/LC_MESSAGES/django.mo +0 -0
  7. umap/locale/es/LC_MESSAGES/django.po +20 -16
  8. umap/locale/fr/LC_MESSAGES/django.mo +0 -0
  9. umap/locale/fr/LC_MESSAGES/django.po +18 -14
  10. umap/locale/pl/LC_MESSAGES/django.mo +0 -0
  11. umap/locale/pl/LC_MESSAGES/django.po +72 -71
  12. umap/migrations/0018_datalayer_uuid.py +1 -1
  13. umap/models.py +7 -3
  14. umap/settings/local.py.sample +1 -1
  15. umap/static/umap/content.css +0 -3
  16. umap/static/umap/css/bar.css +9 -6
  17. umap/static/umap/css/form.css +27 -11
  18. umap/static/umap/css/popup.css +1 -0
  19. umap/static/umap/js/components/base.js +1 -1
  20. umap/static/umap/js/components/copiable.js +47 -0
  21. umap/static/umap/js/modules/autocomplete.js +31 -58
  22. umap/static/umap/js/modules/browser.js +8 -8
  23. umap/static/umap/js/modules/data/features.js +33 -36
  24. umap/static/umap/js/modules/data/fields.js +446 -0
  25. umap/static/umap/js/modules/data/layer.js +76 -93
  26. umap/static/umap/js/modules/domutils.js +24 -4
  27. umap/static/umap/js/modules/filters.js +20 -47
  28. umap/static/umap/js/modules/form/fields.js +4 -4
  29. umap/static/umap/js/modules/formatter.js +9 -1
  30. umap/static/umap/js/modules/help.js +13 -14
  31. umap/static/umap/js/modules/i18n.js +1 -1
  32. umap/static/umap/js/modules/importer.js +18 -27
  33. umap/static/umap/js/modules/importers/banfr.js +0 -1
  34. umap/static/umap/js/modules/importers/cadastrefr.js +19 -19
  35. umap/static/umap/js/modules/importers/communesfr.js +7 -8
  36. umap/static/umap/js/modules/importers/datasets.js +14 -14
  37. umap/static/umap/js/modules/importers/geodatamine.js +20 -22
  38. umap/static/umap/js/modules/importers/opendata.js +10 -0
  39. umap/static/umap/js/modules/importers/overpass.js +19 -18
  40. umap/static/umap/js/modules/managers.js +1 -265
  41. umap/static/umap/js/modules/permissions.js +5 -3
  42. umap/static/umap/js/modules/rendering/controls.js +6 -4
  43. umap/static/umap/js/modules/rendering/icon.js +5 -9
  44. umap/static/umap/js/modules/rendering/layers/base.js +1 -1
  45. umap/static/umap/js/modules/rendering/layers/classified.js +16 -11
  46. umap/static/umap/js/modules/rendering/layers/heat.js +27 -21
  47. umap/static/umap/js/modules/rendering/map.js +22 -22
  48. umap/static/umap/js/modules/rendering/popup.js +6 -3
  49. umap/static/umap/js/modules/rendering/template.js +31 -37
  50. umap/static/umap/js/modules/rendering/ui.js +1 -2
  51. umap/static/umap/js/modules/rules.js +34 -41
  52. umap/static/umap/js/modules/schema.js +0 -7
  53. umap/static/umap/js/modules/share.js +36 -69
  54. umap/static/umap/js/modules/slideshow.js +3 -3
  55. umap/static/umap/js/modules/tableeditor.js +0 -1
  56. umap/static/umap/js/modules/ui/bar.js +51 -32
  57. umap/static/umap/js/modules/ui/dialog.js +10 -1
  58. umap/static/umap/js/modules/ui/panel.js +28 -23
  59. umap/static/umap/js/modules/ui/tooltip.js +1 -1
  60. umap/static/umap/js/modules/umap.js +84 -84
  61. umap/static/umap/js/modules/utils.js +13 -4
  62. umap/static/umap/js/umap.controls.js +33 -14
  63. umap/static/umap/locale/am_ET.js +19 -8
  64. umap/static/umap/locale/am_ET.json +19 -8
  65. umap/static/umap/locale/ar.js +19 -8
  66. umap/static/umap/locale/ar.json +19 -8
  67. umap/static/umap/locale/ast.js +19 -8
  68. umap/static/umap/locale/ast.json +19 -8
  69. umap/static/umap/locale/bg.js +19 -8
  70. umap/static/umap/locale/bg.json +19 -8
  71. umap/static/umap/locale/br.js +20 -9
  72. umap/static/umap/locale/br.json +20 -9
  73. umap/static/umap/locale/ca.js +19 -8
  74. umap/static/umap/locale/ca.json +19 -8
  75. umap/static/umap/locale/cs_CZ.js +20 -9
  76. umap/static/umap/locale/cs_CZ.json +20 -9
  77. umap/static/umap/locale/da.js +54 -43
  78. umap/static/umap/locale/da.json +54 -43
  79. umap/static/umap/locale/de.js +44 -33
  80. umap/static/umap/locale/de.json +44 -33
  81. umap/static/umap/locale/el.js +20 -9
  82. umap/static/umap/locale/el.json +20 -9
  83. umap/static/umap/locale/en.js +20 -9
  84. umap/static/umap/locale/en.json +20 -9
  85. umap/static/umap/locale/en_US.json +19 -8
  86. umap/static/umap/locale/es.js +55 -44
  87. umap/static/umap/locale/es.json +55 -44
  88. umap/static/umap/locale/et.js +20 -9
  89. umap/static/umap/locale/et.json +20 -9
  90. umap/static/umap/locale/eu.js +25 -14
  91. umap/static/umap/locale/eu.json +25 -14
  92. umap/static/umap/locale/fa_IR.js +20 -9
  93. umap/static/umap/locale/fa_IR.json +20 -9
  94. umap/static/umap/locale/fi.js +19 -8
  95. umap/static/umap/locale/fi.json +19 -8
  96. umap/static/umap/locale/fr.js +21 -10
  97. umap/static/umap/locale/fr.json +21 -10
  98. umap/static/umap/locale/gl.js +147 -136
  99. umap/static/umap/locale/gl.json +147 -136
  100. umap/static/umap/locale/he.js +19 -8
  101. umap/static/umap/locale/he.json +19 -8
  102. umap/static/umap/locale/hr.js +19 -8
  103. umap/static/umap/locale/hr.json +19 -8
  104. umap/static/umap/locale/hu.js +62 -51
  105. umap/static/umap/locale/hu.json +62 -51
  106. umap/static/umap/locale/id.js +19 -8
  107. umap/static/umap/locale/id.json +19 -8
  108. umap/static/umap/locale/is.js +20 -9
  109. umap/static/umap/locale/is.json +20 -9
  110. umap/static/umap/locale/it.js +20 -9
  111. umap/static/umap/locale/it.json +20 -9
  112. umap/static/umap/locale/ja.js +19 -8
  113. umap/static/umap/locale/ja.json +19 -8
  114. umap/static/umap/locale/ko.js +19 -8
  115. umap/static/umap/locale/ko.json +19 -8
  116. umap/static/umap/locale/lt.js +19 -8
  117. umap/static/umap/locale/lt.json +19 -8
  118. umap/static/umap/locale/ms.js +20 -9
  119. umap/static/umap/locale/ms.json +20 -9
  120. umap/static/umap/locale/nl.js +20 -9
  121. umap/static/umap/locale/nl.json +20 -9
  122. umap/static/umap/locale/no.js +19 -8
  123. umap/static/umap/locale/no.json +19 -8
  124. umap/static/umap/locale/pl.js +56 -45
  125. umap/static/umap/locale/pl.json +56 -45
  126. umap/static/umap/locale/pl_PL.json +19 -8
  127. umap/static/umap/locale/pt.js +20 -9
  128. umap/static/umap/locale/pt.json +20 -9
  129. umap/static/umap/locale/pt_BR.js +19 -8
  130. umap/static/umap/locale/pt_BR.json +19 -8
  131. umap/static/umap/locale/pt_PT.js +19 -8
  132. umap/static/umap/locale/pt_PT.json +19 -8
  133. umap/static/umap/locale/ro.js +19 -8
  134. umap/static/umap/locale/ro.json +19 -8
  135. umap/static/umap/locale/ru.js +19 -8
  136. umap/static/umap/locale/ru.json +19 -8
  137. umap/static/umap/locale/si.js +1 -1
  138. umap/static/umap/locale/si.json +1 -1
  139. umap/static/umap/locale/sk_SK.js +19 -8
  140. umap/static/umap/locale/sk_SK.json +19 -8
  141. umap/static/umap/locale/sl.js +19 -8
  142. umap/static/umap/locale/sl.json +19 -8
  143. umap/static/umap/locale/sr.js +19 -8
  144. umap/static/umap/locale/sr.json +19 -8
  145. umap/static/umap/locale/sv.js +19 -8
  146. umap/static/umap/locale/sv.json +19 -8
  147. umap/static/umap/locale/th_TH.js +19 -8
  148. umap/static/umap/locale/th_TH.json +19 -8
  149. umap/static/umap/locale/tr.js +19 -8
  150. umap/static/umap/locale/tr.json +19 -8
  151. umap/static/umap/locale/uk_UA.js +19 -8
  152. umap/static/umap/locale/uk_UA.json +19 -8
  153. umap/static/umap/locale/vi.js +19 -8
  154. umap/static/umap/locale/vi.json +19 -8
  155. umap/static/umap/locale/vi_VN.json +19 -8
  156. umap/static/umap/locale/zh.js +19 -8
  157. umap/static/umap/locale/zh.json +19 -8
  158. umap/static/umap/locale/zh_CN.json +19 -8
  159. umap/static/umap/locale/zh_TW.Big5.json +19 -8
  160. umap/static/umap/locale/zh_TW.js +53 -42
  161. umap/static/umap/locale/zh_TW.json +53 -42
  162. umap/static/umap/map.css +8 -7
  163. umap/static/umap/unittests/utils.js +7 -7
  164. umap/templates/umap/content_footer.html +1 -0
  165. umap/templates/umap/css.html +0 -2
  166. umap/templates/umap/js.html +1 -3
  167. umap/templates/umap/login_popup_end.html +2 -2
  168. umap/tests/integration/conftest.py +11 -2
  169. umap/tests/integration/test_anonymous_owned_map.py +2 -2
  170. umap/tests/integration/test_conditional_rules.py +107 -52
  171. umap/tests/integration/test_draw_polygon.py +4 -0
  172. umap/tests/integration/test_draw_polyline.py +11 -0
  173. umap/tests/integration/test_edit_datalayer.py +1 -1
  174. umap/tests/integration/test_fields.py +19 -0
  175. umap/tests/integration/test_filters.py +6 -7
  176. umap/tests/integration/test_iframe.py +1 -1
  177. umap/tests/integration/test_import.py +23 -0
  178. umap/tests/integration/test_map.py +2 -2
  179. umap/tests/integration/test_map_preview.py +1 -1
  180. umap/tests/integration/test_owned_map.py +2 -2
  181. umap/tests/integration/test_picto.py +1 -1
  182. umap/tests/integration/test_popup.py +31 -0
  183. umap/tests/integration/test_remote_data.py +4 -4
  184. umap/tests/integration/test_save.py +1 -1
  185. umap/tests/integration/test_search.py +41 -0
  186. umap/tests/integration/test_share.py +2 -2
  187. umap/tests/integration/test_team.py +1 -1
  188. umap/tests/integration/test_websocket_sync.py +69 -20
  189. umap/tests/test_dashboard.py +1 -1
  190. umap/tests/test_statics.py +2 -2
  191. umap/tests/test_utils.py +4 -1
  192. umap/tests/test_views.py +1 -1
  193. umap/utils.py +3 -2
  194. {umap_project-3.4.0b1.dist-info → umap_project-3.4.2.dist-info}/METADATA +17 -17
  195. {umap_project-3.4.0b1.dist-info → umap_project-3.4.2.dist-info}/RECORD +198 -199
  196. umap/static/umap/js/umap.core.js +0 -93
  197. umap/static/umap/vendors/editinosm/Leaflet.EditInOSM.css +0 -46
  198. umap/static/umap/vendors/editinosm/Leaflet.EditInOSM.js +0 -240
  199. umap/static/umap/vendors/editinosm/edit-in-osm.png +0 -0
  200. {umap_project-3.4.0b1.dist-info → umap_project-3.4.2.dist-info}/WHEEL +0 -0
  201. {umap_project-3.4.0b1.dist-info → umap_project-3.4.2.dist-info}/entry_points.txt +0 -0
  202. {umap_project-3.4.0b1.dist-info → umap_project-3.4.2.dist-info}/licenses/LICENSE +0 -0
@@ -1,4 +1,3 @@
1
- import { DomUtil } from '../../vendors/leaflet/leaflet-src.esm.js'
2
1
  import { MutatingForm } from './form/builder.js'
3
2
  import { EXPORT_FORMATS } from './formatter.js'
4
3
  import { translate } from './i18n.js'
@@ -11,39 +10,35 @@ export default class Share {
11
10
  }
12
11
 
13
12
  build() {
14
- this.container = DomUtil.create('div', '')
15
- this.title = DomUtil.createTitle(
16
- this.container,
17
- translate('Share and download'),
18
- 'icon-share'
19
- )
20
-
21
- DOMUtils.copiableInput(
22
- this.container,
23
- translate('Link to view the map'),
24
- window.location.protocol + Utils.getBaseUrl()
25
- )
26
-
13
+ const downloadUrl = this._umap.urls.get('map_download', {
14
+ map_id: this._umap.id,
15
+ })
16
+ const [container, { shortUrl, list, customLink, textarea, iframeOptionsWrapper }] =
17
+ DOMUtils.loadTemplateWithRefs(`
18
+ <div>
19
+ <h3><i class="icon icon-16 icon-share"></i> ${translate('Share and download')}</h3>
20
+ <h4>${translate('Share')}</h4>
21
+ <copiable-input data-label="${translate('Link to view the map')}" data-value="${window.location.protocol + Utils.getBaseUrl()}"></copiable-input>
22
+ <copiable-input data-label="${translate('Short link')}" data-value="${this._umap.properties.shortUrl}" data-ref="shortUrl" hidden></copiable-input>
23
+ <copiable-textarea data-label="${translate('Customized link')}" data-ref="customLink"></copiable-textarea>
24
+ <copiable-textarea data-label="${translate('Iframe')}" data-ref="textarea"></copiable-textarea>
25
+ <div data-ref="iframeOptionsWrapper"></div>
26
+ <hr>
27
+ <h4>${translate('Download')}</h4>
28
+ <h5>${translate("Only visible layers' data")}</h5>
29
+ <ul data-ref="list" class="downloads"></ul>
30
+ <h5>${translate('All data and settings of the map')}</h5>
31
+ <p>
32
+ <a href="${downloadUrl}" download="backup.umap">
33
+ <i class="icon icon-16 icon-backup"></i>${translate('full backup')}
34
+ </a>
35
+ </p>
36
+ </div>
37
+ `)
38
+ this.container = container
27
39
  if (this._umap.properties.shortUrl) {
28
- DOMUtils.copiableInput(
29
- this.container,
30
- translate('Short link'),
31
- this._umap.properties.shortUrl
32
- )
40
+ shortUrl.hidden = false
33
41
  }
34
-
35
- DomUtil.create('hr', '', this.container)
36
-
37
- DomUtil.add('h4', '', this.container, translate('Download'))
38
- DomUtil.add(
39
- 'small',
40
- 'label',
41
- this.container,
42
- translate("Only visible layers' data")
43
- )
44
- const list = document.createElement('ul')
45
- list.classList.add('downloads')
46
- this.container.appendChild(list)
47
42
  for (const format of Object.keys(EXPORT_FORMATS).concat('jpg', 'png')) {
48
43
  const button = Utils.loadTemplate(`
49
44
  <li>
@@ -55,38 +50,7 @@ export default class Share {
55
50
  button.addEventListener('click', () => this.download(format))
56
51
  list.appendChild(button)
57
52
  }
58
- DomUtil.create('div', 'vspace', this.container)
59
- DomUtil.add(
60
- 'small',
61
- 'label',
62
- this.container,
63
- translate('All data and settings of the map')
64
- )
65
- const downloadUrl = this._umap.urls.get('map_download', {
66
- map_id: this._umap.id,
67
- })
68
- const link = Utils.loadTemplate(`
69
- <div>
70
- <a href="${downloadUrl}">
71
- <i class="icon icon-16 icon-backup"></i>${translate('full backup')}
72
- </a>
73
- </div>
74
- `)
75
- this.container.appendChild(link)
76
- // File will be named by back-office
77
- link.setAttribute('download', 'backup.umap')
78
- DomUtil.create('hr', '', this.container)
79
53
 
80
- const embedTitle = DomUtil.add('h4', '', this.container, translate('Embed the map'))
81
- const iframe = DomUtil.create('textarea', 'umap-share-iframe', this.container)
82
- const urlTitle = DomUtil.add('h4', '', this.container, translate('Direct link'))
83
- const exportUrl = DOMUtils.copiableInput(
84
- this.container,
85
- translate('Share this link to open a customized map view'),
86
- ''
87
- )
88
-
89
- exportUrl.type = 'text'
90
54
  const UIFields = [
91
55
  ['dimensions.width', { handler: 'Input', label: translate('width') }],
92
56
  ['dimensions.height', { handler: 'Input', label: translate('height') }],
@@ -123,14 +87,17 @@ export default class Share {
123
87
  }
124
88
  const iframeExporter = new IframeExporter(this._umap)
125
89
  const buildIframeCode = () => {
126
- iframe.textContent = iframeExporter.build()
127
- exportUrl.value = window.location.protocol + iframeExporter.buildUrl()
90
+ textarea.setAttribute('value', iframeExporter.build())
91
+ customLink.setAttribute(
92
+ 'value',
93
+ window.location.protocol + iframeExporter.buildUrl()
94
+ )
128
95
  }
129
96
  buildIframeCode()
130
97
  const builder = new MutatingForm(iframeExporter, UIFields)
131
98
  builder.on('set', buildIframeCode)
132
- const iframeOptions = DomUtil.createFieldset(
133
- this.container,
99
+ const iframeOptions = DOMUtils.createFieldset(
100
+ iframeOptionsWrapper,
134
101
  translate('Embed and link options')
135
102
  )
136
103
  iframeOptions.appendChild(builder.build())
@@ -222,13 +189,13 @@ class IframeExporter {
222
189
  delete this.queryString.datalayers
223
190
  }
224
191
  const currentView = this.options.currentView ? window.location.hash : ''
225
- const queryString = L.extend({}, this.queryString, options)
192
+ const queryString = Object.assign({}, this.queryString, options)
226
193
  return `${this.baseUrl}?${Utils.buildQueryString(queryString)}${currentView}`
227
194
  }
228
195
 
229
196
  build() {
230
197
  const iframeUrl = this.buildUrl()
231
- let code = `<iframe width="${this.dimensions.width}" height="${this.dimensions.height}" frameborder="0" allowfullscreen allow="geolocation" src="${iframeUrl}"></iframe>`
198
+ let code = `<iframe style="width: ${this.dimensions.width}; height: ${this.dimensions.height}; border: 0;" allowfullscreen allow="geolocation" src="${iframeUrl}"></iframe>`
232
199
  if (this.options.includeFullScreenLink) {
233
200
  const fullUrl = this.buildUrl({ scrollWheelZoom: true })
234
201
  code += `<p><a href="${fullUrl}">${translate('See full screen')}</a></p>`
@@ -89,8 +89,8 @@ export default class Slideshow extends WithTemplate {
89
89
  play() {
90
90
  if (this._id) return
91
91
  if (this._umap.editEnabled || !this.isEnabled()) return
92
- L.DomUtil.addClass(document.body, this.CLASSNAME)
93
- this._id = window.setInterval(L.bind(this.loop, this), this.properties.delay)
92
+ document.body.classList.add(this.CLASSNAME)
93
+ this._id = window.setInterval(() => this.loop(), this.properties.delay)
94
94
  this.startSpinner()
95
95
  this.loop()
96
96
  }
@@ -103,7 +103,7 @@ export default class Slideshow extends WithTemplate {
103
103
  pause() {
104
104
  if (this._id) {
105
105
  this.stopSpinner()
106
- L.DomUtil.removeClass(document.body, this.CLASSNAME)
106
+ document.body.classList.remove(this.CLASSNAME)
107
107
  window.clearInterval(this._id)
108
108
  this._id = null
109
109
  }
@@ -1,4 +1,3 @@
1
- import { DomEvent, DomUtil } from '../../vendors/leaflet/leaflet-src.esm.js'
2
1
  import { MutatingForm } from './form/builder.js'
3
2
  import { translate } from './i18n.js'
4
3
  import ContextMenu from './ui/contextmenu.js'
@@ -236,12 +236,18 @@ export class BottomBar extends WithTemplate {
236
236
  this.elements.layers.addEventListener('change', () => {
237
237
  const select = this.elements.layers
238
238
  const selected = select.options[select.selectedIndex].value
239
- if (!selected) return
240
- this._umap.datalayers.active().map((datalayer) => {
239
+ for (const datalayer of this._umap.datalayers.active()) {
241
240
  if (datalayer.properties.inCaption !== false) {
242
- datalayer.toggle(datalayer.id === selected)
241
+ if (!selected) {
242
+ datalayer.autoVisibility = true
243
+ if (datalayer.showAtZoom() && !datalayer.isVisible()) {
244
+ datalayer.show()
245
+ }
246
+ } else {
247
+ datalayer.toggle(datalayer.id === selected)
248
+ }
243
249
  }
244
- })
250
+ }
245
251
  })
246
252
  }
247
253
 
@@ -263,7 +269,9 @@ export class BottomBar extends WithTemplate {
263
269
  if (datalayers.length < 2) {
264
270
  this.elements.layers.hidden = true
265
271
  } else {
266
- this.elements.layers.appendChild(Utils.loadTemplate(`<option value=""></option>`))
272
+ this.elements.layers.appendChild(
273
+ Utils.loadTemplate(`<option value="">${translate('All layers')}</option>`)
274
+ )
267
275
  this.elements.layers.hidden = !this._umap.getProperty('layerSwitcher')
268
276
  const visible = datalayers.filter((datalayer) => datalayer.isVisible())
269
277
  for (const datalayer of datalayers) {
@@ -279,27 +287,30 @@ export class BottomBar extends WithTemplate {
279
287
  }
280
288
 
281
289
  const EDIT_BAR_TEMPLATE = `
282
- <ul class="umap-edit-bar dark with-transition">
283
- <li data-ref="marker"><button type="button" data-getstarted><i class="icon icon-24 icon-marker"></i></button></li>
284
- <li data-ref="polyline"><button type="button" data-getstarted><i class="icon icon-24 icon-polyline"></i></button></li>
285
- <li data-ref="multiline" hidden>
286
- <button type="button" title="${translate('Add a line to the current multi')}"><i class="icon icon-24 icon-multiline"></i></button>
287
- </li>
288
- <li data-ref="polygon"><button type="button" data-getstarted><i class="icon icon-24 icon-polygon"></i></button></li>
289
- <li data-ref="multipolygon" hidden>
290
- <button type="button" title="${translate('Add a polygon to the current multi')}"><i class="icon icon-24 icon-multipolygon"></i></button>
291
- </li>
292
- <li data-ref="route" hidden><button type="button" data-getstarted title="${translate('Draw along routes')}"><i class="icon icon-24 icon-route"></i></button></li>
293
- <hr>
294
- <li data-ref="caption" hidden><button data-getstarted type="button" title="${translate('Edit map name and caption')}"><i class="icon icon-24 icon-info"></i></button></li>
295
- <li data-ref="import" hidden><button type="button"><i class="icon icon-24 icon-upload"></i></button></li>
296
- <li data-ref="templates" hidden><button type="button" title="${translate('Load template')}" data-getstarted><i class="icon icon-24 icon-template"></i></button></li>
297
- <li data-ref="layers" hidden><button type="button" title="${translate('Manage layers')}"><i class="icon icon-24 icon-layers"></i></button></li>
298
- <li data-ref="tilelayers" hidden><button type="button" title="${translate('Change tilelayers')}"><i class="icon icon-24 icon-tilelayer"></i></button></li>
299
- <li data-ref="center" hidden><button type="button"><i class="icon icon-24 icon-center"></i></button></li>
300
- <li data-ref="permissions" hidden><button type="button" title="${translate('Update permissions and editors')}"><i class="icon icon-24 icon-key"></i></button></li>
301
- <li data-ref="settings" hidden><button data-getstarted type="button" title="${translate('Map advanced properties')}"><i class="icon icon-24 icon-settings"></i></button></li>
302
- </ul>
290
+ <div class="umap-edit-bar dark with-transition">
291
+ <ul>
292
+ <li data-ref="marker"><button class="drawing-tool" type="button" data-getstarted><i class="icon icon-24 icon-marker"></i></button></li>
293
+ <li data-ref="polyline"><button class="drawing-tool" type="button" data-getstarted><i class="icon icon-24 icon-polyline"></i></button></li>
294
+ <li data-ref="multiline" hidden>
295
+ <button class="drawing-tool" type="button" title="${translate('Add a line to the current multi')}"><i class="icon icon-24 icon-multiline"></i></button>
296
+ </li>
297
+ <li data-ref="polygon"><button class="drawing-tool" type="button" data-getstarted><i class="icon icon-24 icon-polygon"></i></button></li>
298
+ <li data-ref="multipolygon" hidden>
299
+ <button class="drawing-tool" type="button" title="${translate('Add a polygon to the current multi')}"><i class="icon icon-24 icon-multipolygon"></i></button>
300
+ </li>
301
+ <li data-ref="route" hidden><button class="drawing-tool" type="button" data-getstarted title="${translate('Draw along routes')}"><i class="icon icon-24 icon-route"></i></button></li>
302
+ </ul>
303
+ <ul>
304
+ <li data-ref="caption" hidden><button data-getstarted type="button" title="${translate('Edit map name and caption')}"><i class="icon icon-24 icon-info"></i></button></li>
305
+ <li data-ref="import" hidden><button type="button"><i class="icon icon-24 icon-upload"></i></button></li>
306
+ <li data-ref="templates" hidden><button type="button" title="${translate('Load template')}" data-getstarted><i class="icon icon-24 icon-template"></i></button></li>
307
+ <li data-ref="layers" hidden><button type="button" title="${translate('Manage layers')}"><i class="icon icon-24 icon-layers"></i></button></li>
308
+ <li data-ref="tilelayers" hidden><button type="button" title="${translate('Change tilelayers')}"><i class="icon icon-24 icon-tilelayer"></i></button></li>
309
+ <li data-ref="center" hidden><button type="button"><i class="icon icon-24 icon-center"></i></button></li>
310
+ <li data-ref="permissions" hidden><button type="button" title="${translate('Update permissions and editors')}"><i class="icon icon-24 icon-key"></i></button></li>
311
+ <li data-ref="settings" hidden><button data-getstarted type="button" title="${translate('Map advanced properties')}"><i class="icon icon-24 icon-settings"></i></button></li>
312
+ </ul>
313
+ </div>
303
314
  `
304
315
 
305
316
  export class EditBar extends WithTemplate {
@@ -315,12 +326,12 @@ export class EditBar extends WithTemplate {
315
326
  setup() {
316
327
  this.parent.appendChild(this.element)
317
328
  DomEvent.disableClickPropagation(this.element)
318
- this._onClick('marker', () => this._leafletMap.editTools.startMarker())
319
- this._onClick('polyline', () => this._leafletMap.editTools.startPolyline())
320
- this._onClick('multiline', () => this._umap.editedFeature.ui.editor.newShape())
321
- this._onClick('polygon', () => this._leafletMap.editTools.startPolygon())
322
- this._onClick('multipolygon', () => this._umap.editedFeature.ui.editor.newShape())
323
- this._onClick('route', () => this._leafletMap.editTools.startRoute())
329
+ this._onDrawing('marker', () => this._leafletMap.editTools.startMarker())
330
+ this._onDrawing('polyline', () => this._leafletMap.editTools.startPolyline())
331
+ this._onDrawing('multiline', () => this._umap.editedFeature.ui.editor.newShape())
332
+ this._onDrawing('polygon', () => this._leafletMap.editTools.startPolygon())
333
+ this._onDrawing('multipolygon', () => this._umap.editedFeature.ui.editor.newShape())
334
+ this._onDrawing('route', () => this._leafletMap.editTools.startRoute())
324
335
  this._onClick('caption', () => this._umap.editCaption())
325
336
  this._onClick('import', () => this._umap.importer.open())
326
337
  this._onClick('templates', () => this.templateIimporter.open())
@@ -359,6 +370,14 @@ export class EditBar extends WithTemplate {
359
370
  )
360
371
  }
361
372
 
373
+ _onDrawing(ref, realAction) {
374
+ const action = (event) => {
375
+ event.target.closest('button').classList.add('on')
376
+ realAction(event)
377
+ }
378
+ this._onClick(ref, action)
379
+ }
380
+
362
381
  _onClick(ref, action) {
363
382
  // Put the click on the button, not on the li, but keep the data-ref on the li
364
383
  // so to hide/show it when needed.
@@ -161,7 +161,16 @@ export default class Dialog extends WithTemplate {
161
161
 
162
162
  accept() {
163
163
  this.dialog.returnValue = 'accept'
164
- this.close()
164
+ return new Promise((resolve) => {
165
+ this.dialog.addEventListener(
166
+ 'close',
167
+ () => {
168
+ resolve()
169
+ },
170
+ { once: true }
171
+ )
172
+ this.close()
173
+ })
165
174
  }
166
175
 
167
176
  waitForUser() {
@@ -1,13 +1,15 @@
1
- import { DomEvent, DomUtil } from '../../../vendors/leaflet/leaflet-src.esm.js'
1
+ import { DomEvent } from '../../../vendors/leaflet/leaflet-src.esm.js'
2
2
  import { translate } from '../i18n.js'
3
+ import * as DOMUtils from '../domutils.js'
3
4
 
4
5
  export class Panel {
5
6
  constructor(umap, leafletMap) {
6
7
  this.parent = leafletMap._controlContainer
7
8
  this._umap = umap
8
9
  this._leafletMap = leafletMap
9
- this.container = DomUtil.create('div', '', this.parent)
10
- // This will be set once according to the panel configurated at load
10
+ this.container = document.createElement('div')
11
+ this.parent.appendChild(this.container)
12
+ // This will be set once according to the panel configured at load
11
13
  // or by using panels as popups
12
14
  this.mode = null
13
15
  this.className = 'left'
@@ -37,44 +39,46 @@ export class Panel {
37
39
  }
38
40
  document.body.classList.add(`panel-${this.className.split(' ')[0]}-on`)
39
41
  this.container.innerHTML = ''
40
- const actionsContainer = DomUtil.create('ul', 'buttons', this.container)
41
- const body = DomUtil.create('div', 'body', this.container)
42
+ const template = `
43
+ <div>
44
+ <ul class="buttons" data-ref="buttons">
45
+ <li><button class="icon icon-16 icon-close" data-ref="close" title="${translate('Close')}"></button></li>
46
+ <li><button class="icon icon-16 icon-resize" data-ref="resize" title="${translate('Toggle size')}"></button></li>
47
+ </ul>
48
+ <div class="body" data-ref="body">
49
+ </div>
50
+ </div>
51
+ `
52
+ const [root, { close, resize, body, buttons }] =
53
+ DOMUtils.loadTemplateWithRefs(template)
42
54
  body.appendChild(content)
43
- const closeButton = DomUtil.createButtonIcon(
44
- DomUtil.create('li', '', actionsContainer),
45
- 'icon-close',
46
- translate('Close')
47
- )
48
- const resizeButton = DomUtil.createButtonIcon(
49
- DomUtil.create('li', '', actionsContainer),
50
- 'icon-resize',
51
- translate('Toggle size')
52
- )
55
+ this.container.appendChild(root)
53
56
  for (const action of actions) {
54
- const element = DomUtil.element({ tagName: 'li', parent: actionsContainer })
55
- element.appendChild(action)
57
+ const li = document.createElement('li')
58
+ li.appendChild(action)
59
+ buttons.appendChild(li)
56
60
  }
57
- if (className) DomUtil.addClass(body, className)
61
+ if (className) body.classList.add(className)
58
62
  const promise = new Promise((resolve, reject) => {
59
63
  if (isOpen) {
60
64
  resolve(this)
61
65
  } else {
66
+ this.container.classList.add('on')
62
67
  Promise.all(
63
- this.container.getAnimations().map((animation) => animation.finished)
68
+ this.container.getAnimations?.().map((animation) => animation.finished)
64
69
  )
65
70
  .then(() => {
66
71
  resolve(this)
67
72
  })
68
73
  .catch(() => {
69
74
  // Panel has been removed, so the DOM has changed, so the animations
70
- // were cancelled, we want the new panel callabck to be called anyway.
75
+ // were cancelled, we want the new panel callback to be called anyway.
71
76
  resolve(this)
72
77
  })
73
- this.container.classList.add('on')
74
78
  }
75
79
  })
76
- DomEvent.on(closeButton, 'click', this.close, this)
77
- DomEvent.on(resizeButton, 'click', this.resize, this)
80
+ close.addEventListener('click', () => this.close())
81
+ resize.addEventListener('click', () => this.resize())
78
82
  return promise
79
83
  }
80
84
 
@@ -102,6 +106,7 @@ export class Panel {
102
106
  this._leafletMap.invalidateSize({ pan: false })
103
107
  }
104
108
  }
109
+
105
110
  scrollTo(selector) {
106
111
  const fieldset = this.container.querySelector(selector)
107
112
  if (!fieldset) return
@@ -27,7 +27,7 @@ export default class Tooltip extends Positioned {
27
27
  this.parent.appendChild(this.container)
28
28
  this.openAt(opts)
29
29
  }
30
- this.TOOLTIP_ID = window.setTimeout(L.bind(showIt, this), opts.delay || 0)
30
+ this.TOOLTIP_ID = window.setTimeout(() => showIt(), opts.delay || 0)
31
31
  const id = this.TOOLTIP_ID
32
32
  const closeIt = () => {
33
33
  this.close(id)