umap-project 3.4.0b3__py3-none-any.whl → 3.6.0__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 (222) hide show
  1. umap/__init__.py +1 -1
  2. umap/locale/br/LC_MESSAGES/django.mo +0 -0
  3. umap/locale/br/LC_MESSAGES/django.po +71 -57
  4. umap/locale/da/LC_MESSAGES/django.mo +0 -0
  5. umap/locale/da/LC_MESSAGES/django.po +18 -14
  6. umap/locale/de/LC_MESSAGES/django.mo +0 -0
  7. umap/locale/de/LC_MESSAGES/django.po +20 -16
  8. umap/locale/en/LC_MESSAGES/django.po +18 -14
  9. umap/locale/es/LC_MESSAGES/django.mo +0 -0
  10. umap/locale/es/LC_MESSAGES/django.po +20 -16
  11. umap/locale/fr/LC_MESSAGES/django.mo +0 -0
  12. umap/locale/fr/LC_MESSAGES/django.po +18 -14
  13. umap/locale/hu/LC_MESSAGES/django.mo +0 -0
  14. umap/locale/hu/LC_MESSAGES/django.po +20 -16
  15. umap/locale/pl/LC_MESSAGES/django.mo +0 -0
  16. umap/locale/pl/LC_MESSAGES/django.po +101 -95
  17. umap/locale/zh_TW/LC_MESSAGES/django.mo +0 -0
  18. umap/locale/zh_TW/LC_MESSAGES/django.po +20 -16
  19. umap/management/commands/clean_tilelayer.py +0 -1
  20. umap/management/commands/search_maps.py +95 -0
  21. umap/settings/__init__.py +9 -1
  22. umap/settings/base.py +7 -6
  23. umap/static/umap/content.css +0 -3
  24. umap/static/umap/css/bar.css +9 -6
  25. umap/static/umap/css/form.css +25 -9
  26. umap/static/umap/css/icon.css +8 -0
  27. umap/static/umap/css/popup.css +1 -0
  28. umap/static/umap/img/16-white.svg +5 -2
  29. umap/static/umap/img/16.svg +1 -1
  30. umap/static/umap/img/source/16-white.svg +7 -4
  31. umap/static/umap/img/source/16.svg +1 -1
  32. umap/static/umap/js/components/copiable.js +47 -0
  33. umap/static/umap/js/modules/autocomplete.js +32 -67
  34. umap/static/umap/js/modules/browser.js +31 -14
  35. umap/static/umap/js/modules/data/features.js +34 -36
  36. umap/static/umap/js/modules/data/fields.js +199 -23
  37. umap/static/umap/js/modules/data/layer.js +85 -96
  38. umap/static/umap/js/modules/domutils.js +25 -1
  39. umap/static/umap/js/modules/filters.js +24 -50
  40. umap/static/umap/js/modules/form/builder.js +17 -16
  41. umap/static/umap/js/modules/form/fields.js +20 -20
  42. umap/static/umap/js/modules/formatter.js +9 -1
  43. umap/static/umap/js/modules/help.js +12 -13
  44. umap/static/umap/js/modules/importer.js +17 -26
  45. umap/static/umap/js/modules/importers/banfr.js +0 -1
  46. umap/static/umap/js/modules/importers/cadastrefr.js +19 -19
  47. umap/static/umap/js/modules/importers/communesfr.js +7 -8
  48. umap/static/umap/js/modules/importers/datasets.js +14 -14
  49. umap/static/umap/js/modules/importers/geodatamine.js +20 -22
  50. umap/static/umap/js/modules/importers/opendata.js +10 -0
  51. umap/static/umap/js/modules/importers/overpass.js +19 -18
  52. umap/static/umap/js/modules/managers.js +1 -1
  53. umap/static/umap/js/modules/permissions.js +15 -5
  54. umap/static/umap/js/modules/rendering/controls.js +203 -10
  55. umap/static/umap/js/modules/rendering/icon.js +5 -9
  56. umap/static/umap/js/modules/rendering/layers/base.js +1 -1
  57. umap/static/umap/js/modules/rendering/layers/classified.js +16 -11
  58. umap/static/umap/js/modules/rendering/layers/heat.js +1 -0
  59. umap/static/umap/js/modules/rendering/map.js +67 -57
  60. umap/static/umap/js/modules/rendering/popup.js +6 -3
  61. umap/static/umap/js/modules/rendering/template.js +40 -40
  62. umap/static/umap/js/modules/rendering/ui.js +1 -2
  63. umap/static/umap/js/modules/rules.js +34 -41
  64. umap/static/umap/js/modules/schema.js +0 -7
  65. umap/static/umap/js/modules/share.js +36 -69
  66. umap/static/umap/js/modules/slideshow.js +3 -3
  67. umap/static/umap/js/modules/tableeditor.js +0 -1
  68. umap/static/umap/js/modules/ui/bar.js +53 -33
  69. umap/static/umap/js/modules/ui/hash.js +36 -0
  70. umap/static/umap/js/modules/ui/loader.js +26 -0
  71. umap/static/umap/js/modules/ui/panel.js +33 -21
  72. umap/static/umap/js/modules/ui/tooltip.js +1 -1
  73. umap/static/umap/js/modules/umap.js +81 -80
  74. umap/static/umap/js/modules/utils.js +13 -3
  75. umap/static/umap/js/umap.controls.js +16 -179
  76. umap/static/umap/locale/am_ET.js +7 -8
  77. umap/static/umap/locale/am_ET.json +7 -8
  78. umap/static/umap/locale/ar.js +7 -8
  79. umap/static/umap/locale/ar.json +7 -8
  80. umap/static/umap/locale/ast.js +7 -8
  81. umap/static/umap/locale/ast.json +7 -8
  82. umap/static/umap/locale/bg.js +7 -8
  83. umap/static/umap/locale/bg.json +7 -8
  84. umap/static/umap/locale/br.js +44 -36
  85. umap/static/umap/locale/br.json +44 -36
  86. umap/static/umap/locale/ca.js +7 -8
  87. umap/static/umap/locale/ca.json +7 -8
  88. umap/static/umap/locale/cs_CZ.js +7 -8
  89. umap/static/umap/locale/cs_CZ.json +7 -8
  90. umap/static/umap/locale/da.js +8 -9
  91. umap/static/umap/locale/da.json +8 -9
  92. umap/static/umap/locale/de.js +62 -63
  93. umap/static/umap/locale/de.json +62 -63
  94. umap/static/umap/locale/el.js +7 -8
  95. umap/static/umap/locale/el.json +7 -8
  96. umap/static/umap/locale/en.js +7 -8
  97. umap/static/umap/locale/en.json +7 -8
  98. umap/static/umap/locale/en_US.json +7 -8
  99. umap/static/umap/locale/es.js +19 -20
  100. umap/static/umap/locale/es.json +19 -20
  101. umap/static/umap/locale/et.js +7 -8
  102. umap/static/umap/locale/et.json +7 -8
  103. umap/static/umap/locale/eu.js +23 -24
  104. umap/static/umap/locale/eu.json +23 -24
  105. umap/static/umap/locale/fa_IR.js +7 -8
  106. umap/static/umap/locale/fa_IR.json +7 -8
  107. umap/static/umap/locale/fi.js +7 -8
  108. umap/static/umap/locale/fi.json +7 -8
  109. umap/static/umap/locale/fr.js +11 -12
  110. umap/static/umap/locale/fr.json +11 -12
  111. umap/static/umap/locale/gl.js +147 -148
  112. umap/static/umap/locale/gl.json +147 -148
  113. umap/static/umap/locale/he.js +7 -8
  114. umap/static/umap/locale/he.json +7 -8
  115. umap/static/umap/locale/hr.js +7 -8
  116. umap/static/umap/locale/hr.json +7 -8
  117. umap/static/umap/locale/hu.js +8 -9
  118. umap/static/umap/locale/hu.json +8 -9
  119. umap/static/umap/locale/id.js +7 -8
  120. umap/static/umap/locale/id.json +7 -8
  121. umap/static/umap/locale/is.js +7 -8
  122. umap/static/umap/locale/is.json +7 -8
  123. umap/static/umap/locale/it.js +7 -8
  124. umap/static/umap/locale/it.json +7 -8
  125. umap/static/umap/locale/ja.js +7 -8
  126. umap/static/umap/locale/ja.json +7 -8
  127. umap/static/umap/locale/ko.js +7 -8
  128. umap/static/umap/locale/ko.json +7 -8
  129. umap/static/umap/locale/lt.js +7 -8
  130. umap/static/umap/locale/lt.json +7 -8
  131. umap/static/umap/locale/ms.js +7 -8
  132. umap/static/umap/locale/ms.json +7 -8
  133. umap/static/umap/locale/nl.js +7 -8
  134. umap/static/umap/locale/nl.json +7 -8
  135. umap/static/umap/locale/no.js +7 -8
  136. umap/static/umap/locale/no.json +7 -8
  137. umap/static/umap/locale/pl.js +53 -54
  138. umap/static/umap/locale/pl.json +53 -54
  139. umap/static/umap/locale/pl_PL.json +7 -8
  140. umap/static/umap/locale/pt.js +7 -8
  141. umap/static/umap/locale/pt.json +7 -8
  142. umap/static/umap/locale/pt_BR.js +7 -8
  143. umap/static/umap/locale/pt_BR.json +7 -8
  144. umap/static/umap/locale/pt_PT.js +7 -8
  145. umap/static/umap/locale/pt_PT.json +7 -8
  146. umap/static/umap/locale/ro.js +7 -8
  147. umap/static/umap/locale/ro.json +7 -8
  148. umap/static/umap/locale/ru.js +7 -8
  149. umap/static/umap/locale/ru.json +7 -8
  150. umap/static/umap/locale/sk_SK.js +7 -8
  151. umap/static/umap/locale/sk_SK.json +7 -8
  152. umap/static/umap/locale/sl.js +7 -8
  153. umap/static/umap/locale/sl.json +7 -8
  154. umap/static/umap/locale/sr.js +7 -8
  155. umap/static/umap/locale/sr.json +7 -8
  156. umap/static/umap/locale/sv.js +7 -8
  157. umap/static/umap/locale/sv.json +7 -8
  158. umap/static/umap/locale/th_TH.js +7 -8
  159. umap/static/umap/locale/th_TH.json +7 -8
  160. umap/static/umap/locale/tr.js +7 -8
  161. umap/static/umap/locale/tr.json +7 -8
  162. umap/static/umap/locale/uk_UA.js +7 -8
  163. umap/static/umap/locale/uk_UA.json +7 -8
  164. umap/static/umap/locale/vi.js +7 -8
  165. umap/static/umap/locale/vi.json +7 -8
  166. umap/static/umap/locale/vi_VN.json +7 -8
  167. umap/static/umap/locale/zh.js +7 -8
  168. umap/static/umap/locale/zh.json +7 -8
  169. umap/static/umap/locale/zh_CN.json +7 -8
  170. umap/static/umap/locale/zh_TW.Big5.json +7 -8
  171. umap/static/umap/locale/zh_TW.js +20 -21
  172. umap/static/umap/locale/zh_TW.json +20 -21
  173. umap/static/umap/map.css +6 -21
  174. umap/static/umap/unittests/utils.js +7 -7
  175. umap/static/umap/vendors/locatecontrol/L.Control.Locate.esm.js +942 -0
  176. umap/static/umap/vendors/photon/leaflet.photon.esm.js +472 -0
  177. umap/sync/app.py +4 -1
  178. umap/templates/umap/content_footer.html +1 -0
  179. umap/templates/umap/css.html +0 -4
  180. umap/templates/umap/js.html +1 -8
  181. umap/templates/umap/team_form.html +2 -1
  182. umap/tests/integration/conftest.py +3 -2
  183. umap/tests/integration/test_anonymous_owned_map.py +1 -1
  184. umap/tests/integration/test_conditional_rules.py +106 -51
  185. umap/tests/integration/test_draw_polygon.py +4 -0
  186. umap/tests/integration/test_draw_polyline.py +11 -0
  187. umap/tests/integration/test_edit_datalayer.py +1 -1
  188. umap/tests/integration/test_edit_map.py +2 -0
  189. umap/tests/integration/test_fields.py +19 -0
  190. umap/tests/integration/test_filters.py +24 -0
  191. umap/tests/integration/test_iframe.py +1 -1
  192. umap/tests/integration/test_import.py +26 -0
  193. umap/tests/integration/test_map.py +3 -3
  194. umap/tests/integration/test_optimistic_merge.py +7 -1
  195. umap/tests/integration/test_owned_map.py +2 -2
  196. umap/tests/integration/test_popup.py +31 -0
  197. umap/tests/integration/test_remote_data.py +5 -5
  198. umap/tests/integration/test_search.py +41 -0
  199. umap/tests/integration/test_share.py +2 -2
  200. umap/tests/integration/test_team.py +1 -1
  201. umap/tests/integration/test_websocket_sync.py +6 -1
  202. umap/tests/test_search_maps_command.py +44 -0
  203. umap/tests/test_utils.py +4 -1
  204. umap/utils.py +10 -3
  205. umap/views.py +17 -4
  206. {umap_project-3.4.0b3.dist-info → umap_project-3.6.0.dist-info}/METADATA +29 -23
  207. {umap_project-3.4.0b3.dist-info → umap_project-3.6.0.dist-info}/RECORD +210 -214
  208. {umap_project-3.4.0b3.dist-info → umap_project-3.6.0.dist-info}/WHEEL +1 -1
  209. umap/static/umap/js/umap.core.js +0 -93
  210. umap/static/umap/vendors/editinosm/Leaflet.EditInOSM.css +0 -46
  211. umap/static/umap/vendors/editinosm/Leaflet.EditInOSM.js +0 -240
  212. umap/static/umap/vendors/editinosm/edit-in-osm.png +0 -0
  213. umap/static/umap/vendors/hash/leaflet-hash.js +0 -162
  214. umap/static/umap/vendors/loading/Control.Loading.css +0 -26
  215. umap/static/umap/vendors/loading/Control.Loading.js +0 -351
  216. umap/static/umap/vendors/locatecontrol/L.Control.Locate.min.css +0 -1
  217. umap/static/umap/vendors/locatecontrol/L.Control.Locate.min.css.map +0 -1
  218. umap/static/umap/vendors/locatecontrol/L.Control.Locate.min.js +0 -4
  219. umap/static/umap/vendors/locatecontrol/L.Control.Locate.min.js.map +0 -1
  220. umap/static/umap/vendors/photon/leaflet.photon.js +0 -487
  221. {umap_project-3.4.0b3.dist-info → umap_project-3.6.0.dist-info}/entry_points.txt +0 -0
  222. {umap_project-3.4.0b3.dist-info → umap_project-3.6.0.dist-info}/licenses/LICENSE +0 -0
@@ -0,0 +1,472 @@
1
+ import {
2
+ Control,
3
+ DomUtil,
4
+ DomEvent,
5
+ Evented,
6
+ latLng,
7
+ Util,
8
+ } from '../leaflet/leaflet-src.esm.js'
9
+
10
+ const PhotonBase = Evented.extend({
11
+ forEach: (els, callback) => {
12
+ Array.prototype.forEach.call(els, callback)
13
+ },
14
+
15
+ ajax: function () {
16
+ const url = this.options.url + this.buildQueryString(this.getParams())
17
+ this.fire('ajax:send')
18
+ return new Promise((resolve) => {
19
+ fetch(url).then(async (resp) => {
20
+ if (resp.ok) {
21
+ resolve(await resp.json())
22
+ }
23
+ this.fire('ajax:return')
24
+ })
25
+ })
26
+ },
27
+
28
+ buildQueryString: (params) => {
29
+ const queryString = []
30
+ for (const [key, param] of Object.entries(params)) {
31
+ if (param) {
32
+ queryString.push(`${encodeURIComponent(key)}=${encodeURIComponent(param)}`)
33
+ }
34
+ }
35
+ return queryString.join('&')
36
+ },
37
+
38
+ featureToPopupContent: (feature) => {
39
+ const container = DomUtil.create('div', 'leaflet-photon-popup')
40
+ const title = DomUtil.create('h3', '', container)
41
+ title.innerHTML = feature.properties.label
42
+ return container
43
+ },
44
+ })
45
+
46
+ const PhotonBaseSearch = PhotonBase.extend({
47
+ options: {
48
+ url: 'https://photon.komoot.io/api/?',
49
+ placeholder: 'Start typing...',
50
+ minChar: 3,
51
+ limit: 5,
52
+ submitDelay: 300,
53
+ includePosition: true,
54
+ bbox: null,
55
+ noResultLabel: 'No result',
56
+ feedbackEmail: 'photon@komoot.de', // Set to null to remove feedback box
57
+ feedbackLabel: 'Feedback',
58
+ },
59
+
60
+ CACHE: '',
61
+ RESULTS: [],
62
+ KEYS: {
63
+ LEFT: 37,
64
+ UP: 38,
65
+ RIGHT: 39,
66
+ DOWN: 40,
67
+ TAB: 9,
68
+ RETURN: 13,
69
+ ESC: 27,
70
+ APPLE: 91,
71
+ SHIFT: 16,
72
+ ALT: 17,
73
+ CTRL: 18,
74
+ },
75
+
76
+ initialize: function (input, options) {
77
+ this.input = input
78
+ Util.setOptions(this, options)
79
+ let CURRENT = null
80
+
81
+ Object.defineProperty(this, 'CURRENT', {
82
+ get: () => CURRENT,
83
+ set: function (index) {
84
+ if (typeof index === 'object') {
85
+ index = this.resultToIndex(index)
86
+ }
87
+ CURRENT = index
88
+ },
89
+ })
90
+
91
+ this.input.type = 'search'
92
+ this.input.placeholder = this.options.placeholder
93
+ this.input.autocomplete = 'off'
94
+ this.input.autocorrect = 'off'
95
+ DomEvent.disableClickPropagation(this.input)
96
+
97
+ DomEvent.on(this.input, 'keydown', this.onKeyDown, this)
98
+ DomEvent.on(this.input, 'input', this.onInput, this)
99
+ DomEvent.on(this.input, 'blur', this.onBlur, this)
100
+ DomEvent.on(this.input, 'focus', this.onFocus, this)
101
+ this.createResultsContainer()
102
+ },
103
+
104
+ createResultsContainer: function () {
105
+ this.resultsContainer =
106
+ this.options.resultsContainer ||
107
+ DomUtil.create('ul', 'photon-autocomplete', document.querySelector('body'))
108
+ },
109
+
110
+ resizeContainer: function () {
111
+ const l = this.getLeft(this.input)
112
+ const t = this.getTop(this.input) + this.input.offsetHeight
113
+ this.resultsContainer.style.left = `${l}px`
114
+ this.resultsContainer.style.top = `${t}px`
115
+ const width = this.options.width ? this.options.width : this.input.offsetWidth - 2
116
+ this.resultsContainer.style.width = `${width}px`
117
+ },
118
+
119
+ onKeyDown: function (e) {
120
+ switch (e.keyCode) {
121
+ case this.KEYS.TAB:
122
+ if (this.CURRENT !== null) {
123
+ this.setChoice()
124
+ }
125
+ DomEvent.stop(e)
126
+ break
127
+ case this.KEYS.RETURN:
128
+ DomEvent.stop(e)
129
+ this.setChoice()
130
+ break
131
+ case this.KEYS.ESC:
132
+ DomEvent.stop(e)
133
+ this.hide()
134
+ this.input.blur()
135
+ break
136
+ case this.KEYS.DOWN:
137
+ if (this.RESULTS.length > 0) {
138
+ if (this.CURRENT !== null && this.CURRENT < this.RESULTS.length - 1) {
139
+ // what if one resutl?
140
+ this.CURRENT++
141
+ this.highlight()
142
+ } else if (this.CURRENT === null) {
143
+ this.CURRENT = 0
144
+ this.highlight()
145
+ }
146
+ }
147
+ break
148
+ case this.KEYS.UP:
149
+ if (this.CURRENT !== null) {
150
+ DomEvent.stop(e)
151
+ }
152
+ if (this.RESULTS.length > 0) {
153
+ if (this.CURRENT > 0) {
154
+ this.CURRENT--
155
+ this.highlight()
156
+ } else if (this.CURRENT === 0) {
157
+ this.CURRENT = null
158
+ this.highlight()
159
+ }
160
+ }
161
+ break
162
+ }
163
+ },
164
+
165
+ onInput: function (_e) {
166
+ if (typeof this.submitDelay === 'number') {
167
+ window.clearTimeout(this.submitDelay)
168
+ delete this.submitDelay
169
+ }
170
+ this.submitDelay = window.setTimeout(
171
+ Util.bind(this.search, this),
172
+ this.options.submitDelay
173
+ )
174
+ },
175
+
176
+ onBlur: function (_e) {
177
+ this.fire('blur')
178
+ setTimeout(() => {
179
+ this.hide()
180
+ }, 100)
181
+ },
182
+
183
+ onFocus: function (_e) {
184
+ this.fire('focus')
185
+ this.input.select()
186
+ this.search() // In case we have a value from a previous search.
187
+ },
188
+
189
+ clear: function () {
190
+ this.RESULTS = []
191
+ this.CURRENT = null
192
+ this.CACHE = ''
193
+ this.resultsContainer.innerHTML = ''
194
+ },
195
+
196
+ hide: function () {
197
+ this.fire('hide')
198
+ this.clear()
199
+ this.resultsContainer.style.display = 'none'
200
+ },
201
+
202
+ setChoice: function (choice) {
203
+ choice = choice || this.RESULTS[this.CURRENT]
204
+ if (choice) {
205
+ this.hide()
206
+ this.fire('selected', { choice: choice.feature })
207
+ this.onSelected(choice.feature)
208
+ this.input.value = ''
209
+ }
210
+ },
211
+
212
+ search: function () {
213
+ const val = this.input.value
214
+ const minChar =
215
+ typeof this.options.minChar === 'function'
216
+ ? this.options.minChar(val)
217
+ : val.length >= this.options.minChar
218
+ if (!val || !minChar) return this.clear()
219
+ if (`${val}` === `${this.CACHE}`) return
220
+ this.CACHE = val
221
+ this._doSearch()
222
+ },
223
+
224
+ _doSearch: function () {
225
+ this.ajax().then((data) => this.handleResults(data))
226
+ },
227
+
228
+ _onSelected: (_feature) => {},
229
+
230
+ onSelected: function (choice) {
231
+ return (this.options.onSelected || this._onSelected).call(this, choice)
232
+ },
233
+
234
+ _formatResult: function (feature, el) {
235
+ const title = DomUtil.create('strong', '', el)
236
+ const detailsContainer = DomUtil.create('small', '', el)
237
+ const details = []
238
+ const type = this.formatType(feature)
239
+ if (feature.properties.name) {
240
+ title.innerHTML = feature.properties.name
241
+ } else if (feature.properties.housenumber) {
242
+ title.innerHTML = feature.properties.housenumber
243
+ if (feature.properties.street) {
244
+ title.innerHTML += ` ${feature.properties.street}`
245
+ }
246
+ }
247
+ if (type) details.push(type)
248
+ if (
249
+ feature.properties.city &&
250
+ feature.properties.city !== feature.properties.name
251
+ ) {
252
+ details.push(feature.properties.city)
253
+ }
254
+ if (
255
+ feature.properties.state &&
256
+ feature.properties.state !== feature.properties.name
257
+ ) {
258
+ details.push(feature.properties.state)
259
+ }
260
+ if (feature.properties.country) details.push(feature.properties.country)
261
+ detailsContainer.innerHTML = details.join(', ')
262
+ },
263
+
264
+ formatResult: function (feature, el) {
265
+ return (this.options.formatResult || this._formatResult).call(this, feature, el)
266
+ },
267
+
268
+ formatType: function (feature) {
269
+ return (this.options.formatType || this._formatType).call(this, feature)
270
+ },
271
+
272
+ _formatType: (feature) =>
273
+ feature.properties.osm_value === 'yes'
274
+ ? feature.properties.osm_key
275
+ : feature.properties.osm_value,
276
+
277
+ createResult: function (feature) {
278
+ const el = DomUtil.create('li', '', this.resultsContainer)
279
+ this.formatResult(feature, el)
280
+ const result = {
281
+ feature: feature,
282
+ el: el,
283
+ }
284
+ // Touch handling needed
285
+ DomEvent.on(
286
+ el,
287
+ 'mouseover',
288
+ function (_e) {
289
+ this.CURRENT = result
290
+ this.highlight()
291
+ },
292
+ this
293
+ )
294
+ DomEvent.on(
295
+ el,
296
+ 'mousedown',
297
+ function (_e) {
298
+ this.setChoice()
299
+ },
300
+ this
301
+ )
302
+ return result
303
+ },
304
+
305
+ resultToIndex: function (result) {
306
+ let out = null
307
+ this.forEach(this.RESULTS, (item, index) => {
308
+ if (item === result) {
309
+ out = index
310
+ return
311
+ }
312
+ })
313
+ return out
314
+ },
315
+
316
+ handleResults: function (geojson) {
317
+ this.clear()
318
+ this.resultsContainer.style.display = 'block'
319
+ this.resizeContainer()
320
+ this.forEach(geojson.features, (feature) => {
321
+ this.RESULTS.push(this.createResult(feature))
322
+ })
323
+ if (geojson.features.length === 0) {
324
+ const noresult = DomUtil.create('li', 'photon-no-result', this.resultsContainer)
325
+ noresult.innerHTML = this.options.noResultLabel
326
+ }
327
+ if (this.options.feedbackEmail) {
328
+ const feedback = DomUtil.create('a', 'photon-feedback', this.resultsContainer)
329
+ feedback.href = `mailto:${this.options.feedbackEmail}`
330
+ feedback.innerHTML = this.options.feedbackLabel
331
+ }
332
+ this.CURRENT = 0
333
+ this.highlight()
334
+ if (this.options.resultsHandler) {
335
+ this.options.resultsHandler(geojson)
336
+ }
337
+ },
338
+
339
+ highlight: function () {
340
+ this.forEach(this.RESULTS, (item, index) => {
341
+ if (index === this.CURRENT) {
342
+ DomUtil.addClass(item.el, 'on')
343
+ } else {
344
+ DomUtil.removeClass(item.el, 'on')
345
+ }
346
+ })
347
+ },
348
+
349
+ getLeft: (el) => {
350
+ let tmp = el.offsetLeft
351
+ el = el.offsetParent
352
+ while (el) {
353
+ tmp += el.offsetLeft
354
+ el = el.offsetParent
355
+ }
356
+ return tmp
357
+ },
358
+
359
+ getTop: (el) => {
360
+ let tmp = el.offsetTop
361
+ el = el.offsetParent
362
+ while (el) {
363
+ tmp += el.offsetTop
364
+ el = el.offsetParent
365
+ }
366
+ return tmp
367
+ },
368
+
369
+ getParams: function () {
370
+ return {
371
+ q: this.CACHE,
372
+ lang: this.options.lang,
373
+ limit: this.options.limit,
374
+ osm_tag: this.options.osm_tag,
375
+ }
376
+ },
377
+ })
378
+
379
+ export const PhotonSearch = PhotonBaseSearch.extend({
380
+ initialize: function (map, input, options) {
381
+ this.map = map
382
+ PhotonBaseSearch.prototype.initialize.call(this, input, options)
383
+ },
384
+
385
+ _onSelected: function (feature) {
386
+ this.map.setView(
387
+ [feature.geometry.coordinates[1], feature.geometry.coordinates[0]],
388
+ 16
389
+ )
390
+ },
391
+
392
+ getParams: function () {
393
+ const params = PhotonBaseSearch.prototype.getParams.call(this)
394
+ if (this.options.includePosition) {
395
+ params.lat = this.map.getCenter().lat
396
+ params.lon = this.map.getCenter().lng
397
+ if (this.options.location_bias_scale) {
398
+ params.location_bias_scale = this.options.location_bias_scale
399
+ }
400
+ }
401
+ if (this.options.bbox && this.options.bbox.length === 4) {
402
+ params.bbox = this.options.bbox.join(',')
403
+ }
404
+ return params
405
+ },
406
+ })
407
+
408
+ Control.Photon = Control.extend({
409
+ includes: Evented.prototype,
410
+
411
+ onAdd: function (map, options) {
412
+ this.map = map
413
+ this.container = DomUtil.create('div', 'leaflet-photon')
414
+
415
+ this.options = Util.extend(this.options, options)
416
+
417
+ this.input = DomUtil.create('input', 'photon-input', this.container)
418
+ this.search = new PhotonSearch(map, this.input, this.options)
419
+ this.search.on('blur', this.forwardEvent, this)
420
+ this.search.on('focus', this.forwardEvent, this)
421
+ this.search.on('hide', this.forwardEvent, this)
422
+ this.search.on('selected', this.forwardEvent, this)
423
+ this.search.on('ajax:send', this.forwardEvent, this)
424
+ this.search.on('ajax:return', this.forwardEvent, this)
425
+ return this.container
426
+ },
427
+
428
+ // TODO onRemove
429
+
430
+ forwardEvent: function (e) {
431
+ this.fire(e.type, e)
432
+ },
433
+ })
434
+
435
+ export const PhotonReverse = PhotonBase.extend({
436
+ options: {
437
+ url: 'https://photon.komoot.io/reverse/?',
438
+ limit: 1,
439
+ handleResults: null,
440
+ },
441
+
442
+ initialize: function (options) {
443
+ Util.setOptions(this, options)
444
+ },
445
+
446
+ doReverse: function (latlng) {
447
+ latlng = latLng(latlng)
448
+ this.fire('reverse', { latlng: latlng })
449
+ this.latlng = latlng
450
+ this.ajax().then((data) => this.handleResults(data))
451
+ },
452
+
453
+ _handleResults: (data) => {
454
+ /*eslint-disable no-console */
455
+ console.log(data)
456
+ /*eslint-enable no-alert */
457
+ },
458
+
459
+ handleResults: function (data) {
460
+ return (this.options.handleResults || this._handleResults).call(this, data)
461
+ },
462
+
463
+ getParams: function () {
464
+ return {
465
+ lang: this.options.lang,
466
+ limit: this.options.limit,
467
+ lat: this.latlng.lat,
468
+ lon: this.latlng.lng,
469
+ osm_tag: this.options.osm_tag,
470
+ }
471
+ },
472
+ })
umap/sync/app.py CHANGED
@@ -184,4 +184,7 @@ class Peer:
184
184
  logging.debug(err)
185
185
 
186
186
 
187
- urlpatterns = [path("ws/sync/<str:map_id>", name="ws_sync", view=sync)]
187
+ script_name = ""
188
+ if settings.FORCE_SCRIPT_NAME:
189
+ script_name = f"{settings.FORCE_SCRIPT_NAME.strip('/')}/"
190
+ urlpatterns = [path(f"{script_name}ws/sync/<str:map_id>", name="ws_sync", view=sync)]
@@ -7,6 +7,7 @@
7
7
  {% if UMAP_HOST_INFOS.url and UMAP_HOST_INFOS.name %}<span>{% trans "Hosted by" %} <a href="{{ UMAP_HOST_INFOS.url }}">{{ UMAP_HOST_INFOS.name }}</a></span>{% endif %}
8
8
  {% if UMAP_HOST_INFOS.email %}<a href="mailto:{{ UMAP_HOST_INFOS.email }}">{% trans "Contact" %}</a>{% endif %}
9
9
  {% if UMAP_HELP_URL %}<a href="{{ UMAP_HELP_URL }}">{% trans "Help" %}</a>{% endif %}
10
+ {% if UMAP_HOST_INFOS.tos %}<a href="{{ UMAP_HOST_INFOS.tos }}">{% trans "Terms of Service" %}</a>{% endif %}
10
11
  {% get_language_info_list for LANGUAGES as languages %}
11
12
  <form action="{% url "set_language" %}" method="post" class="i18n_switch">
12
13
  {% csrf_token %}
@@ -4,16 +4,12 @@
4
4
 
5
5
  <link rel="stylesheet"
6
6
  href="{% static 'umap/vendors/leaflet/leaflet.css' %}" />
7
- <link rel="stylesheet"
8
- href="{% static 'umap/vendors/editinosm/Leaflet.EditInOSM.css' %}" />
9
7
  <link rel="stylesheet"
10
8
  href="{% static 'umap/vendors/minimap/Control.MiniMap.min.css' %}" />
11
9
  <link rel="stylesheet"
12
10
  href="{% static 'umap/vendors/measurable/Leaflet.Measurable.css' %}" />
13
11
  <link rel="stylesheet"
14
12
  href="{% static 'umap/vendors/fullscreen/leaflet.fullscreen.css' %}" />
15
- <link rel="stylesheet"
16
- href="{% static 'umap/vendors/locatecontrol/L.Control.Locate.min.css' %}" />
17
13
  <link rel="stylesheet"
18
14
  href="{% static 'umap/vendors/iconlayers/iconLayers.css' %}" />
19
15
  <link rel="stylesheet" href="{% static 'umap/vars.css' %}" />
@@ -16,28 +16,21 @@
16
16
  <script src="{% static 'umap/vendors/editable/Path.Drag.js' %}" defer></script>
17
17
  <script src="{% static 'umap/vendors/editable/Leaflet.Editable.js' %}" defer></script>
18
18
  <script type="module" src="{% static 'umap/js/modules/global.js' %}" defer></script>
19
- <script src="{% static 'umap/vendors/hash/leaflet-hash.js' %}" defer></script>
20
- <script src="{% static 'umap/vendors/editinosm/Leaflet.EditInOSM.js' %}"
21
- defer></script>
22
19
  <script src="{% static 'umap/vendors/minimap/Control.MiniMap.min.js' %}"
23
20
  defer></script>
24
21
  <script src="{% static 'umap/vendors/csv2geojson/csv2geojson.js' %}" defer></script>
25
22
  <script src="{% static 'umap/vendors/osmtogeojson/osmtogeojson.js' %}" defer></script>
26
- <script src="{% static 'umap/vendors/loading/Control.Loading.js' %}" defer></script>
27
- <script src="{% static 'umap/vendors/photon/leaflet.photon.js' %}" defer></script>
28
23
  <script src="{% static 'umap/vendors/fullscreen/Leaflet.fullscreen.min.js' %}"
29
24
  defer></script>
30
25
  <script src="{% static 'umap/vendors/measurable/Leaflet.Measurable.js' %}"
31
26
  defer></script>
32
27
  <script src="{% static 'umap/vendors/iconlayers/iconLayers.js' %}" defer></script>
33
- <script src="{% static 'umap/vendors/locatecontrol/L.Control.Locate.min.js' %}"
34
- defer></script>
35
28
  <script src="{% static 'umap/vendors/textpath/leaflet.textpath.js' %}"
36
29
  defer></script>
37
30
  <script src="{% static 'umap/vendors/simple-statistics/simple-statistics.min.js' %}"
38
31
  defer></script>
39
- <script src="{% static 'umap/js/umap.core.js' %}" defer></script>
40
32
  <script src="{% static 'umap/js/umap.controls.js' %}" defer></script>
41
33
  <script type="module" src="{% static 'umap/js/components/fragment.js' %}" defer></script>
42
34
  <script type="module" src="{% static 'umap/js/components/modal.js' %}" defer></script>
35
+ <script type="module" src="{% static 'umap/js/components/copiable.js' %}" defer></script>
43
36
  {% endautoescape %}
@@ -48,7 +48,8 @@
48
48
  className: 'edit-team-members',
49
49
  on_select: onSelect,
50
50
  on_unselect: onUnselect,
51
- placeholder: "{% trans "Add user" %}"
51
+ placeholder: "{% trans "Add user" %}",
52
+ url: "{% url 'agnocomplete:agnocomplete' 'AutocompleteUser' %}?q={q}"
52
53
  }
53
54
  const autocomplete = new U.AjaxAutocompleteMultiple(form, options)
54
55
  for (const option of select.options) {
@@ -26,8 +26,9 @@ def set_timeout(context):
26
26
 
27
27
  @pytest.fixture
28
28
  def new_page(context):
29
- def make_page(prefix="console"):
30
- page = context.new_page()
29
+ def make_page(prefix="console", custom_context=None):
30
+ _context = custom_context or context
31
+ page = _context.new_page()
31
32
  page.on(
32
33
  "console",
33
34
  lambda msg: print(f"{prefix}: {msg.text}")
@@ -133,7 +133,7 @@ def test_can_change_perms_after_create(tilelayer, live_server, page):
133
133
  page.goto(f"{live_server.url}/en/map/new")
134
134
  # Create a layer
135
135
  page.get_by_title("Manage layers").click()
136
- page.get_by_title("Add a layer").click()
136
+ page.get_by_role("button", name="Add a layer").click()
137
137
  page.locator("input[name=name]").fill("Layer 1")
138
138
  expect(
139
139
  page.get_by_role("button", name="Visibility: Draft (private)")