umap-project 2.8.2__py3-none-any.whl → 2.9.0b0__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.

Potentially problematic release.


This version of umap-project might be problematic. Click here for more details.

Files changed (157) hide show
  1. umap/__init__.py +1 -1
  2. umap/asgi.py +12 -7
  3. umap/context_processors.py +1 -0
  4. umap/locale/en/LC_MESSAGES/django.po +102 -59
  5. umap/locale/fr/LC_MESSAGES/django.mo +0 -0
  6. umap/locale/fr/LC_MESSAGES/django.po +105 -61
  7. umap/management/commands/empty_trash.py +12 -1
  8. umap/migrations/0026_datalayer_modified_at_datalayer_share_status.py +26 -0
  9. umap/models.py +23 -3
  10. umap/settings/base.py +4 -1
  11. umap/static/umap/base.css +1 -1
  12. umap/static/umap/content.css +2 -22
  13. umap/static/umap/css/bar.css +7 -10
  14. umap/static/umap/css/form.css +28 -29
  15. umap/static/umap/css/icon.css +8 -2
  16. umap/static/umap/css/panel.css +2 -1
  17. umap/static/umap/css/tooltip.css +33 -31
  18. umap/static/umap/img/16-white.svg +2 -0
  19. umap/static/umap/img/16.svg +1 -1
  20. umap/static/umap/img/providers/bitbucket.png +0 -0
  21. umap/static/umap/img/providers/github.png +0 -0
  22. umap/static/umap/img/providers/keycloak.png +0 -0
  23. umap/static/umap/img/providers/openstreetmap-oauth2.png +0 -0
  24. umap/static/umap/img/providers/twitter-oauth2.png +0 -0
  25. umap/static/umap/img/source/16-white.svg +3 -1
  26. umap/static/umap/img/source/16.svg +1 -1
  27. umap/static/umap/js/components/alerts/alert.js +4 -1
  28. umap/static/umap/js/modules/browser.js +6 -6
  29. umap/static/umap/js/modules/caption.js +30 -7
  30. umap/static/umap/js/modules/data/features.js +21 -24
  31. umap/static/umap/js/modules/data/layer.js +71 -33
  32. umap/static/umap/js/modules/form/builder.js +241 -0
  33. umap/static/umap/js/modules/form/fields.js +1338 -0
  34. umap/static/umap/js/modules/formatter.js +5 -8
  35. umap/static/umap/js/modules/help.js +3 -1
  36. umap/static/umap/js/modules/importer.js +1 -1
  37. umap/static/umap/js/modules/permissions.js +5 -4
  38. umap/static/umap/js/modules/rendering/icon.js +5 -1
  39. umap/static/umap/js/modules/rendering/layers/classified.js +11 -7
  40. umap/static/umap/js/modules/rendering/layers/cluster.js +11 -1
  41. umap/static/umap/js/modules/rendering/map.js +0 -2
  42. umap/static/umap/js/modules/rules.js +2 -1
  43. umap/static/umap/js/modules/schema.js +5 -6
  44. umap/static/umap/js/modules/share.js +3 -3
  45. umap/static/umap/js/modules/sync/engine.js +18 -13
  46. umap/static/umap/js/modules/sync/updaters.js +8 -0
  47. umap/static/umap/js/modules/sync/websocket.js +10 -5
  48. umap/static/umap/js/modules/tableeditor.js +3 -2
  49. umap/static/umap/js/modules/ui/bar.js +17 -9
  50. umap/static/umap/js/modules/ui/base.js +7 -24
  51. umap/static/umap/js/modules/ui/tooltip.js +19 -11
  52. umap/static/umap/js/modules/umap.js +36 -24
  53. umap/static/umap/js/modules/utils.js +196 -12
  54. umap/static/umap/js/umap.controls.js +0 -12
  55. umap/static/umap/locale/br.js +21 -13
  56. umap/static/umap/locale/br.json +21 -13
  57. umap/static/umap/locale/ca.js +12 -4
  58. umap/static/umap/locale/ca.json +12 -4
  59. umap/static/umap/locale/cs_CZ.js +10 -4
  60. umap/static/umap/locale/cs_CZ.json +10 -4
  61. umap/static/umap/locale/de.js +12 -4
  62. umap/static/umap/locale/de.json +12 -4
  63. umap/static/umap/locale/el.js +12 -4
  64. umap/static/umap/locale/el.json +12 -4
  65. umap/static/umap/locale/en.js +9 -4
  66. umap/static/umap/locale/en.json +9 -4
  67. umap/static/umap/locale/es.js +20 -12
  68. umap/static/umap/locale/es.json +20 -12
  69. umap/static/umap/locale/eu.js +12 -4
  70. umap/static/umap/locale/eu.json +12 -4
  71. umap/static/umap/locale/fa_IR.js +12 -4
  72. umap/static/umap/locale/fa_IR.json +12 -4
  73. umap/static/umap/locale/fr.js +10 -5
  74. umap/static/umap/locale/fr.json +10 -5
  75. umap/static/umap/locale/gl.js +353 -345
  76. umap/static/umap/locale/gl.json +353 -345
  77. umap/static/umap/locale/hu.js +9 -4
  78. umap/static/umap/locale/hu.json +9 -4
  79. umap/static/umap/locale/it.js +100 -92
  80. umap/static/umap/locale/it.json +100 -92
  81. umap/static/umap/locale/ms.js +12 -4
  82. umap/static/umap/locale/ms.json +12 -4
  83. umap/static/umap/locale/nl.js +12 -4
  84. umap/static/umap/locale/nl.json +12 -4
  85. umap/static/umap/locale/pl.js +12 -4
  86. umap/static/umap/locale/pl.json +12 -4
  87. umap/static/umap/locale/pt.js +12 -4
  88. umap/static/umap/locale/pt.json +12 -4
  89. umap/static/umap/locale/pt_PT.js +12 -4
  90. umap/static/umap/locale/pt_PT.json +12 -4
  91. umap/static/umap/locale/th_TH.js +12 -4
  92. umap/static/umap/locale/th_TH.json +12 -4
  93. umap/static/umap/locale/zh_TW.js +10 -4
  94. umap/static/umap/locale/zh_TW.json +10 -4
  95. umap/static/umap/map.css +12 -8
  96. umap/static/umap/nav.css +2 -3
  97. umap/static/umap/unittests/utils.js +14 -0
  98. umap/static/umap/vars.css +2 -0
  99. umap/sync/__init__.py +0 -0
  100. umap/sync/app.py +181 -0
  101. umap/sync/payloads.py +49 -0
  102. umap/templates/auth/user_detail.html +4 -0
  103. umap/templates/auth/user_form.html +9 -6
  104. umap/templates/auth/user_stars.html +4 -0
  105. umap/templates/base.html +1 -1
  106. umap/templates/registration/login.html +2 -5
  107. umap/templates/umap/about.html +5 -0
  108. umap/templates/umap/about_summary.html +2 -2
  109. umap/templates/umap/components/provider.html +8 -0
  110. umap/templates/umap/js.html +0 -3
  111. umap/templates/umap/map_detail.html +1 -1
  112. umap/templates/umap/password_change.html +4 -0
  113. umap/templates/umap/password_change_done.html +4 -0
  114. umap/templates/umap/search.html +4 -0
  115. umap/templates/umap/team_confirm_delete.html +4 -0
  116. umap/templates/umap/team_detail.html +4 -0
  117. umap/templates/umap/team_form.html +4 -0
  118. umap/templates/umap/user_dashboard.html +1 -1
  119. umap/templates/umap/user_teams.html +4 -0
  120. umap/tests/base.py +3 -1
  121. umap/tests/integration/conftest.py +16 -23
  122. umap/tests/integration/test_basics.py +2 -2
  123. umap/tests/integration/test_caption.py +1 -0
  124. umap/tests/integration/test_draw_polygon.py +3 -3
  125. umap/tests/integration/test_edit_datalayer.py +1 -1
  126. umap/tests/integration/test_edit_map.py +3 -3
  127. umap/tests/integration/test_edit_polygon.py +1 -1
  128. umap/tests/integration/test_import.py +23 -1
  129. umap/tests/integration/test_optimistic_merge.py +1 -0
  130. umap/tests/integration/test_picto.py +8 -8
  131. umap/tests/integration/test_save.py +1 -0
  132. umap/tests/integration/test_star.py +13 -9
  133. umap/tests/integration/test_tableeditor.py +1 -0
  134. umap/tests/integration/test_websocket_sync.py +112 -33
  135. umap/tests/settings.py +2 -0
  136. umap/tests/test_datalayer.py +2 -3
  137. umap/tests/test_datalayer_views.py +20 -1
  138. umap/tests/test_empty_trash.py +10 -3
  139. umap/tests/test_map_views.py +11 -0
  140. umap/utils.py +24 -11
  141. umap/views.py +37 -6
  142. {umap_project-2.8.2.dist-info → umap_project-2.9.0b0.dist-info}/METADATA +15 -15
  143. {umap_project-2.8.2.dist-info → umap_project-2.9.0b0.dist-info}/RECORD +146 -145
  144. {umap_project-2.8.2.dist-info → umap_project-2.9.0b0.dist-info}/WHEEL +1 -1
  145. umap/management/commands/run_websocket_server.py +0 -23
  146. umap/settings/local_s3.py +0 -45
  147. umap/static/umap/bitbucket.png +0 -0
  148. umap/static/umap/github.png +0 -0
  149. umap/static/umap/js/umap.forms.js +0 -1242
  150. umap/static/umap/keycloak.png +0 -0
  151. umap/static/umap/openstreetmap.png +0 -0
  152. umap/static/umap/twitter.png +0 -0
  153. umap/static/umap/vendors/formbuilder/Leaflet.FormBuilder.js +0 -468
  154. umap/tests/test_websocket_server.py +0 -22
  155. umap/websocket_server.py +0 -202
  156. {umap_project-2.8.2.dist-info → umap_project-2.9.0b0.dist-info}/entry_points.txt +0 -0
  157. {umap_project-2.8.2.dist-info → umap_project-2.9.0b0.dist-info}/licenses/LICENSE +0 -0
@@ -34,6 +34,7 @@ import {
34
34
  uMapAlert as Alert,
35
35
  } from '../components/alerts/alert.js'
36
36
  import Orderable from './orderable.js'
37
+ import { MutatingForm } from './form/builder.js'
37
38
 
38
39
  export default class Umap extends ServerStored {
39
40
  constructor(element, geojson) {
@@ -540,7 +541,13 @@ export default class Umap extends ServerStored {
540
541
  if (SAVEMANAGER.isDirty) this.saveAll()
541
542
  break
542
543
  case 'z':
543
- if (SAVEMANAGER.isDirty) this.askForReset()
544
+ if (Utils.isWritable(event.target)) {
545
+ used = false
546
+ break
547
+ }
548
+ if (SAVEMANAGER.isDirty) {
549
+ this.askForReset()
550
+ }
544
551
  break
545
552
  case 'm':
546
553
  this._leafletMap.editTools.startMarker()
@@ -734,7 +741,7 @@ export default class Umap extends ServerStored {
734
741
  const metadataFields = ['properties.name', 'properties.description']
735
742
 
736
743
  DomUtil.createTitle(container, translate('Edit map details'), 'icon-caption')
737
- const builder = new U.FormBuilder(this, metadataFields, {
744
+ const builder = new MutatingForm(this, metadataFields, {
738
745
  className: 'map-metadata',
739
746
  umap: this,
740
747
  })
@@ -749,7 +756,7 @@ export default class Umap extends ServerStored {
749
756
  'properties.permanentCredit',
750
757
  'properties.permanentCreditBackground',
751
758
  ]
752
- const creditsBuilder = new U.FormBuilder(this, creditsFields, { umap: this })
759
+ const creditsBuilder = new MutatingForm(this, creditsFields, { umap: this })
753
760
  credits.appendChild(creditsBuilder.build())
754
761
  this.editPanel.open({ content: container })
755
762
  }
@@ -770,7 +777,7 @@ export default class Umap extends ServerStored {
770
777
  'properties.captionBar',
771
778
  'properties.captionMenus',
772
779
  ])
773
- const builder = new U.FormBuilder(this, UIFields, { umap: this })
780
+ const builder = new MutatingForm(this, UIFields, { umap: this })
774
781
  const controlsOptions = DomUtil.createFieldset(
775
782
  container,
776
783
  translate('User interface options')
@@ -793,7 +800,7 @@ export default class Umap extends ServerStored {
793
800
  'properties.dashArray',
794
801
  ]
795
802
 
796
- const builder = new U.FormBuilder(this, shapeOptions, { umap: this })
803
+ const builder = new MutatingForm(this, shapeOptions, { umap: this })
797
804
  const defaultShapeProperties = DomUtil.createFieldset(
798
805
  container,
799
806
  translate('Default shape properties')
@@ -812,7 +819,7 @@ export default class Umap extends ServerStored {
812
819
  'properties.slugKey',
813
820
  ]
814
821
 
815
- const builder = new U.FormBuilder(this, optionsFields, { umap: this })
822
+ const builder = new MutatingForm(this, optionsFields, { umap: this })
816
823
  const defaultProperties = DomUtil.createFieldset(
817
824
  container,
818
825
  translate('Default properties')
@@ -830,7 +837,7 @@ export default class Umap extends ServerStored {
830
837
  'properties.labelInteractive',
831
838
  'properties.outlinkTarget',
832
839
  ]
833
- const builder = new U.FormBuilder(this, popupFields, { umap: this })
840
+ const builder = new MutatingForm(this, popupFields, { umap: this })
834
841
  const popupFieldset = DomUtil.createFieldset(
835
842
  container,
836
843
  translate('Default interaction options')
@@ -887,7 +894,7 @@ export default class Umap extends ServerStored {
887
894
  container,
888
895
  translate('Custom background')
889
896
  )
890
- const builder = new U.FormBuilder(this, tilelayerFields, { umap: this })
897
+ const builder = new MutatingForm(this, tilelayerFields, { umap: this })
891
898
  customTilelayer.appendChild(builder.build())
892
899
  }
893
900
 
@@ -935,7 +942,7 @@ export default class Umap extends ServerStored {
935
942
  ['properties.overlay.tms', { handler: 'Switch', label: translate('TMS format') }],
936
943
  ]
937
944
  const overlay = DomUtil.createFieldset(container, translate('Custom overlay'))
938
- const builder = new U.FormBuilder(this, overlayFields, { umap: this })
945
+ const builder = new MutatingForm(this, overlayFields, { umap: this })
939
946
  overlay.appendChild(builder.build())
940
947
  }
941
948
 
@@ -962,7 +969,7 @@ export default class Umap extends ServerStored {
962
969
  { handler: 'BlurFloatInput', placeholder: translate('max East') },
963
970
  ],
964
971
  ]
965
- const boundsBuilder = new U.FormBuilder(this, boundsFields, { umap: this })
972
+ const boundsBuilder = new MutatingForm(this, boundsFields, { umap: this })
966
973
  limitBounds.appendChild(boundsBuilder.build())
967
974
  const boundsButtons = DomUtil.create('div', 'button-bar half', limitBounds)
968
975
  DomUtil.createButton(
@@ -1027,14 +1034,7 @@ export default class Umap extends ServerStored {
1027
1034
  { handler: 'Switch', label: translate('Autostart when map is loaded') },
1028
1035
  ],
1029
1036
  ]
1030
- const slideshowBuilder = new U.FormBuilder(this, slideshowFields, {
1031
- callback: () => {
1032
- this.slideshow.load()
1033
- // FIXME when we refactor formbuilder: this callback is called in a 'postsync'
1034
- // event, which comes after the call of `setter` method, which will call the
1035
- // map.render method, which should do this redraw.
1036
- this.bottomBar.redraw()
1037
- },
1037
+ const slideshowBuilder = new MutatingForm(this, slideshowFields, {
1038
1038
  umap: this,
1039
1039
  })
1040
1040
  slideshow.appendChild(slideshowBuilder.build())
@@ -1042,7 +1042,9 @@ export default class Umap extends ServerStored {
1042
1042
 
1043
1043
  _editSync(container) {
1044
1044
  const sync = DomUtil.createFieldset(container, translate('Real-time collaboration'))
1045
- const builder = new U.FormBuilder(this, ['properties.syncEnabled'], { umap: this })
1045
+ const builder = new MutatingForm(this, ['properties.syncEnabled'], {
1046
+ umap: this,
1047
+ })
1046
1048
  sync.appendChild(builder.build())
1047
1049
  }
1048
1050
 
@@ -1109,7 +1111,7 @@ export default class Umap extends ServerStored {
1109
1111
  this._editOverlay(container)
1110
1112
  this._editBounds(container)
1111
1113
  this._editSlideshow(container)
1112
- if (this.properties.websocketEnabled) {
1114
+ if (this.properties.websocketEnabled && this.id) {
1113
1115
  this._editSync(container)
1114
1116
  }
1115
1117
  this._advancedActions(container)
@@ -1259,6 +1261,7 @@ export default class Umap extends ServerStored {
1259
1261
  }
1260
1262
 
1261
1263
  askForReset(e) {
1264
+ if (this.getProperty('syncEnabled')) return
1262
1265
  this.dialog
1263
1266
  .confirm(translate('Are you sure you want to cancel your changes?'))
1264
1267
  .then(() => {
@@ -1347,10 +1350,14 @@ export default class Umap extends ServerStored {
1347
1350
  }
1348
1351
  this.topBar.redraw()
1349
1352
  },
1353
+ 'properties.slideshow.active': () => {
1354
+ this.slideshow.load()
1355
+ this.bottomBar.redraw()
1356
+ },
1350
1357
  numberOfConnectedPeers: () => {
1351
1358
  Utils.eachElement('.connected-peers span', (el) => {
1352
1359
  if (this.sync.websocketConnected) {
1353
- el.textContent = this.sync.getNumberOfConnectedPeers()
1360
+ el.textContent = Object.keys(this.sync.getPeers()).length
1354
1361
  } else {
1355
1362
  el.textContent = translate('Disconnected')
1356
1363
  }
@@ -1359,7 +1366,11 @@ export default class Umap extends ServerStored {
1359
1366
  },
1360
1367
  'properties.starred': () => {
1361
1368
  Utils.eachElement('.map-star', (el) => {
1362
- el.classList.toggle('starred', this.properties.starred)
1369
+ el.classList.toggle('icon-starred', this.properties.starred)
1370
+ el.classList.toggle('icon-star', !this.properties.starred)
1371
+ })
1372
+ Utils.eachElement('.map-stars', (el) => {
1373
+ el.textContent = this.properties.stars || 0
1363
1374
  })
1364
1375
  },
1365
1376
  }
@@ -1439,7 +1450,7 @@ export default class Umap extends ServerStored {
1439
1450
 
1440
1451
  removeDataLayers() {
1441
1452
  this.eachDataLayerReverse((datalayer) => {
1442
- datalayer._delete()
1453
+ datalayer.del()
1443
1454
  })
1444
1455
  }
1445
1456
 
@@ -1458,7 +1469,7 @@ export default class Umap extends ServerStored {
1458
1469
  const row = DomUtil.create('li', 'orderable', ul)
1459
1470
  DomUtil.createIcon(row, 'icon-drag', translate('Drag to reorder'))
1460
1471
  datalayer.renderToolbox(row)
1461
- const builder = new U.FormBuilder(
1472
+ const builder = new MutatingForm(
1462
1473
  datalayer,
1463
1474
  [['options.name', { handler: 'EditableText' }]],
1464
1475
  { className: 'umap-form-inline' }
@@ -1542,6 +1553,7 @@ export default class Umap extends ServerStored {
1542
1553
  return
1543
1554
  }
1544
1555
  this.properties.starred = data.starred
1556
+ this.properties.stars = data.stars
1545
1557
  Alert.success(
1546
1558
  data.starred
1547
1559
  ? translate('Map has been starred')
@@ -159,16 +159,13 @@ export function toHTML(r, options) {
159
159
  r = r.replace(/\*(.*?)\*/g, '<em>$1</em>')
160
160
 
161
161
  // links
162
- r = r.replace(/(\[\[http)/g, '[[h_t_t_p') // Escape for avoiding clash between [[http://xxx]] and http://xxx
163
- r = r.replace(/({{http)/g, '{{h_t_t_p')
164
- r = r.replace(/(=http)/g, '=h_t_t_p') // http://xxx as query string, see https://github.com/umap-project/umap/issues/607
165
- r = r.replace(/(https?:[^ \<)\n]*)/g, `<a target="_${target}" href="$1">$1</a>`)
166
162
  r = r.replace(
167
- /\[\[(h_t_t_ps?:[^\]|]*?)\]\]/g,
168
- `<a target="_${target}" href="$1">$1</a>`
163
+ /(^|\s|>|\()(https?:[^ \<)\n]*)/g,
164
+ `$1<a target="_${target}" href="$2">$2</a>`
169
165
  )
166
+ r = r.replace(/\[\[(https?:[^\]|]*?)\]\]/g, `<a target="_${target}" href="$1">$1</a>`)
170
167
  r = r.replace(
171
- /\[\[(h_t_t_ps?:[^|]*?)\|(.*?)\]\]/g,
168
+ /\[\[(https?:[^|]*?)\|(.*?)\]\]/g,
172
169
  `<a target="_${target}" href="$1">$2</a>`
173
170
  )
174
171
  r = r.replace(/\[\[([^\]|]*?)\]\]/g, `<a target="_${target}" href="$1">$1</a>`)
@@ -176,15 +173,15 @@ export function toHTML(r, options) {
176
173
 
177
174
  // iframe
178
175
  r = r.replace(
179
- /{{{(h_t_t_ps?[^|{]*)}}}/g,
176
+ /{{{(https?[^|{]*)}}}/g,
180
177
  '<div><iframe frameborder="0" src="$1" width="100%" height="300px"></iframe></div>'
181
178
  )
182
179
  r = r.replace(
183
- /{{{(h_t_t_ps?[^|{]*)\|(\d*)(px)?}}}/g,
180
+ /{{{(https?[^|{]*)\|(\d*)(px)?}}}/g,
184
181
  '<div><iframe frameborder="0" src="$1" width="100%" height="$2px"></iframe></div>'
185
182
  )
186
183
  r = r.replace(
187
- /{{{(h_t_t_ps?[^|{]*)\|(\d*)(px)?\*(\d*)(px)?}}}/g,
184
+ /{{{(https?[^|{]*)\|(\d*)(px)?\*(\d*)(px)?}}}/g,
188
185
  '<div><iframe frameborder="0" src="$1" width="$4px" height="$2px"></iframe></div>'
189
186
  )
190
187
 
@@ -416,9 +413,11 @@ export function loadTemplate(html) {
416
413
  }
417
414
 
418
415
  export function loadTemplateWithRefs(html) {
419
- const element = loadTemplate(html)
416
+ const template = document.createElement('template')
417
+ template.innerHTML = html
418
+ const element = template.content.firstElementChild
420
419
  const elements = {}
421
- for (const node of element.querySelectorAll('[data-ref]')) {
420
+ for (const node of template.content.querySelectorAll('[data-ref]')) {
422
421
  elements[node.dataset.ref] = node
423
422
  }
424
423
  return [element, elements]
@@ -446,3 +445,188 @@ export function eachElement(selector, callback) {
446
445
  callback(el)
447
446
  }
448
447
  }
448
+
449
+ export class WithEvents {
450
+ constructor() {
451
+ this._target = new EventTarget()
452
+ }
453
+
454
+ on(eventType, callback) {
455
+ if (typeof callback !== 'function') return
456
+ this._target.addEventListener(eventType, callback)
457
+ }
458
+
459
+ fire(eventType, detail) {
460
+ const event = new CustomEvent(eventType, { detail })
461
+ this._target.dispatchEvent(event)
462
+ }
463
+ }
464
+
465
+ export function isWritable(element) {
466
+ if (['TEXTAREA', 'INPUT'].includes(element.tagName)) return true
467
+ if (element.isContentEditable) return true
468
+ return false
469
+ }
470
+
471
+ // From https://www.joshwcomeau.com/snippets/javascript/debounce/
472
+ export const debounce = (callback, wait) => {
473
+ let timeoutId = null
474
+
475
+ return (...args) => {
476
+ window.clearTimeout(timeoutId)
477
+
478
+ timeoutId = window.setTimeout(() => {
479
+ callback.apply(null, args)
480
+ }, wait)
481
+ }
482
+ }
483
+
484
+ export const COLORS = [
485
+ 'Black',
486
+ 'Navy',
487
+ 'DarkBlue',
488
+ 'MediumBlue',
489
+ 'Blue',
490
+ 'DarkGreen',
491
+ 'Green',
492
+ 'Teal',
493
+ 'DarkCyan',
494
+ 'DeepSkyBlue',
495
+ 'DarkTurquoise',
496
+ 'MediumSpringGreen',
497
+ 'Lime',
498
+ 'SpringGreen',
499
+ 'Aqua',
500
+ 'Cyan',
501
+ 'MidnightBlue',
502
+ 'DodgerBlue',
503
+ 'LightSeaGreen',
504
+ 'ForestGreen',
505
+ 'SeaGreen',
506
+ 'DarkSlateGray',
507
+ 'DarkSlateGrey',
508
+ 'LimeGreen',
509
+ 'MediumSeaGreen',
510
+ 'Turquoise',
511
+ 'RoyalBlue',
512
+ 'SteelBlue',
513
+ 'DarkSlateBlue',
514
+ 'MediumTurquoise',
515
+ 'Indigo',
516
+ 'DarkOliveGreen',
517
+ 'CadetBlue',
518
+ 'CornflowerBlue',
519
+ 'MediumAquaMarine',
520
+ 'DimGray',
521
+ 'DimGrey',
522
+ 'SlateBlue',
523
+ 'OliveDrab',
524
+ 'SlateGray',
525
+ 'SlateGrey',
526
+ 'LightSlateGray',
527
+ 'LightSlateGrey',
528
+ 'MediumSlateBlue',
529
+ 'LawnGreen',
530
+ 'Chartreuse',
531
+ 'Aquamarine',
532
+ 'Maroon',
533
+ 'Purple',
534
+ 'Olive',
535
+ 'Gray',
536
+ 'Grey',
537
+ 'SkyBlue',
538
+ 'LightSkyBlue',
539
+ 'BlueViolet',
540
+ 'DarkRed',
541
+ 'DarkMagenta',
542
+ 'SaddleBrown',
543
+ 'DarkSeaGreen',
544
+ 'LightGreen',
545
+ 'MediumPurple',
546
+ 'DarkViolet',
547
+ 'PaleGreen',
548
+ 'DarkOrchid',
549
+ 'YellowGreen',
550
+ 'Sienna',
551
+ 'Brown',
552
+ 'DarkGray',
553
+ 'DarkGrey',
554
+ 'LightBlue',
555
+ 'GreenYellow',
556
+ 'PaleTurquoise',
557
+ 'LightSteelBlue',
558
+ 'PowderBlue',
559
+ 'FireBrick',
560
+ 'DarkGoldenRod',
561
+ 'MediumOrchid',
562
+ 'RosyBrown',
563
+ 'DarkKhaki',
564
+ 'Silver',
565
+ 'MediumVioletRed',
566
+ 'IndianRed',
567
+ 'Peru',
568
+ 'Chocolate',
569
+ 'Tan',
570
+ 'LightGray',
571
+ 'LightGrey',
572
+ 'Thistle',
573
+ 'Orchid',
574
+ 'GoldenRod',
575
+ 'PaleVioletRed',
576
+ 'Crimson',
577
+ 'Gainsboro',
578
+ 'Plum',
579
+ 'BurlyWood',
580
+ 'LightCyan',
581
+ 'Lavender',
582
+ 'DarkSalmon',
583
+ 'Violet',
584
+ 'PaleGoldenRod',
585
+ 'LightCoral',
586
+ 'Khaki',
587
+ 'AliceBlue',
588
+ 'HoneyDew',
589
+ 'Azure',
590
+ 'SandyBrown',
591
+ 'Wheat',
592
+ 'Beige',
593
+ 'WhiteSmoke',
594
+ 'MintCream',
595
+ 'GhostWhite',
596
+ 'Salmon',
597
+ 'AntiqueWhite',
598
+ 'Linen',
599
+ 'LightGoldenRodYellow',
600
+ 'OldLace',
601
+ 'Red',
602
+ 'Fuchsia',
603
+ 'Magenta',
604
+ 'DeepPink',
605
+ 'OrangeRed',
606
+ 'Tomato',
607
+ 'HotPink',
608
+ 'Coral',
609
+ 'DarkOrange',
610
+ 'LightSalmon',
611
+ 'Orange',
612
+ 'LightPink',
613
+ 'Pink',
614
+ 'Gold',
615
+ 'PeachPuff',
616
+ 'NavajoWhite',
617
+ 'Moccasin',
618
+ 'Bisque',
619
+ 'MistyRose',
620
+ 'BlanchedAlmond',
621
+ 'PapayaWhip',
622
+ 'LavenderBlush',
623
+ 'SeaShell',
624
+ 'Cornsilk',
625
+ 'LemonChiffon',
626
+ 'FloralWhite',
627
+ 'Snow',
628
+ 'Yellow',
629
+ 'LightYellow',
630
+ 'Ivory',
631
+ 'White',
632
+ ]
@@ -491,18 +491,6 @@ U.CaptionControl = L.Control.Button.extend({
491
491
  },
492
492
  })
493
493
 
494
- U.StarControl = L.Control.Button.extend({
495
- options: {
496
- position: 'topleft',
497
- title: L._('Star this map'),
498
- className: 'leaflet-control-star map-star umap-control',
499
- },
500
-
501
- onClick: function () {
502
- this._umap.star()
503
- },
504
- })
505
-
506
494
  L.Control.Embed = L.Control.Button.extend({
507
495
  options: {
508
496
  position: 'topleft',
@@ -19,7 +19,6 @@ const locale = {
19
19
  "Add a new property": "Ouzhpennañ ur perzh nevez",
20
20
  "Add a polygon to the current multi": "Ouzhpennañ ul lieskorn d'ar strollad a-vremañ",
21
21
  "Add image URL": "Ouzhpennañ URL ar skeudenn",
22
- "Add": "Ouzhpennañ",
23
22
  "Advanced actions": "Oberoù araokaet",
24
23
  "Advanced properties": "Perzhioù araokaet",
25
24
  "All data and settings of the map": "Holl roadennoù hag arventennoù ar gartenn",
@@ -120,7 +119,6 @@ const locale = {
120
119
  "Display the locate control": "Diskwel an afell \"lec'hiañ\"",
121
120
  "Display the measure control": "Diskwel an afell muzuliañ",
122
121
  "Display the search control": "Diskwel an afell \"klask\"",
123
- "Display the star map button": "Diskouez an afell evit spilhennañ ar gartenn",
124
122
  "Display the tile layers control": "Diskwel an afell \"cheñch foñs ar gartenn\"",
125
123
  "Display the zoom control": "Diskwel an afelloù \"zoumañ\" ha \"dizoumañ\"",
126
124
  "Do you want to display a caption bar?": "Diskwel ur varrenn alc'hwez?",
@@ -183,12 +181,12 @@ const locale = {
183
181
  "Icon shape": "Furm an ikon",
184
182
  "Icon symbol": "Arouez an ikon",
185
183
  "If false, the polygon or line will act as a part of the underlying map.": "If false, the polygon or line will act as a part of the underlying map.",
186
- "Iframe with custom height (in px): {{{https://iframe.url.com|height}}}": "Iframe with custom height (in px): {{{https://iframe.url.com|height}}}",
187
- "Iframe with custom height and width (in px): {{{https://iframe.url.com|height*width}}}": "Iframe with custom height and width (in px): {{{https://iframe.url.com|height*width}}}",
184
+ "Iframe with custom height (in px): {{{https://iframe.url.com|height}}}": "Iframe gant uhelder personelaet (e pikselioù): {{{https://iframe.url.com|height}}}",
185
+ "Iframe with custom height and width (in px): {{{https://iframe.url.com|height*width}}}": "Iframe gant mentoù personelaet (e pikselioù): {{{https://iframe.url.com|height*width}}}",
188
186
  "iframe": "iframe",
189
187
  "Iframe: {{{https://iframe.url.com}}}": "Iframe: {{{https://iframe.url.com}}}",
190
- "Image with custom width (in px): {{https://image.url.com|width}}": "Image with custom width (in px): {{https://image.url.com|width}}",
191
- "Image: {{https://image.url.com}}": "Image: {{https://image.url.com}}",
188
+ "Image with custom width (in px): {{https://image.url.com|width}}": "Skeudenn gant ledander personelaet (e pikselioù): {{https://image.url.com|width}}",
189
+ "Image: {{https://image.url.com}}": "Skeudenn: {{https://image.url.com}}",
192
190
  "Import data": "Enporzhiañ roadennoù",
193
191
  "Import in a new layer": "Enporzhiañ ur gwiskad nevez",
194
192
  "Imports all umap data, including layers and settings.": "Enporzhiañ holl roadennoù ar gartenn, ar gwiskadoù hag an arventennoù en o zouez.",
@@ -216,7 +214,7 @@ const locale = {
216
214
  "Limit bounds": "Bevennoù geografek",
217
215
  "Link to view the map": "Liamm evit gwelet ar gartenn",
218
216
  "Link to…": "Liamm etrezek...",
219
- "Link with text: [[https://example.com|text of the link]]": "Link with text: [[https://example.com|text of the link]]",
217
+ "Link with text: [[https://example.com|text of the link]]": "Liamm gant testenn: [[https://skouer.bzh|testenn al liamm]]",
220
218
  "Long credits": "Kredadoù hir",
221
219
  "Longitude": "Hedred",
222
220
  "Make main shape": "Tres pennañ",
@@ -320,7 +318,7 @@ const locale = {
320
318
  "Show this layer in the caption": "Diskouez ar gwiskad-mañ en alc'hwez",
321
319
  "Show/hide layer": "Diskouez/kuzhat ar gwiskad",
322
320
  "Side panel": "Panell gostez",
323
- "Simple link: [[https://example.com]]": "Simple link: [[https://example.com]]",
321
+ "Simple link: [[https://example.com]]": "Liamm simpl: [[https://skouer.bzh]]",
324
322
  "Simplify": "Eeunaat",
325
323
  "Skipping unknown geometry.type: {type}": "Tremen e-bioù tikedenn geometry.type dianav: {type}",
326
324
  "Slideshow": "Diaporama",
@@ -515,12 +513,22 @@ const locale = {
515
513
  "Manage collaborators": "Merañ ar c'henlabourerien",
516
514
  "show/hide all layers": "diskouez/kuzhat an holl wiskadoù",
517
515
  "zoom to data extent": "zoom to data extent",
518
- "download visible data": "download visible data",
519
- "{connectedPeers} peer(s) currently connected to this map": "{connectedPeers} a genlabourerien a zo kennasket ouzh ar gartenn-mañ bremañ",
520
- "Import helpers": "Import helpers",
521
- "Import helpers will fill the URL field for you.": "Import helpers will fill the URL field for you.",
516
+ "download visible data": "Pellgargañ ar roadennoù war-wel",
517
+ "Import helpers": "Skoazellerien enporzhiañ",
518
+ "Import helpers will fill the URL field for you.": "Ar skoazellerien enporzhiañ a leunio maezienn an URL evidoc'h.",
522
519
  "Wikipedia": "Wikipedia",
523
- "Save draft": "Save draft"
520
+ "Save draft": "Enrollañ ar brouilhed",
521
+ "No data has been found for import": "No data has been found for import",
522
+ "Successfully imported {count} feature(s)": "Successfully imported {count} feature(s)",
523
+ "Disconnected": "Disconnected",
524
+ "You must be logged in": "You must be logged in",
525
+ "Created at {date}": "Created at {date}",
526
+ "Modified at {date}": "Modified at {date}",
527
+ "on hover": "on hover",
528
+ "Cannot load remote data for layer \"{layer}\" with url \"{url}\"": "Cannot load remote data for layer \"{layer}\" with url \"{url}\"",
529
+ "Cannot parse remote data for layer \"{layer}\" with url \"{url}\"": "Cannot parse remote data for layer \"{layer}\" with url \"{url}\"",
530
+ "Import failed: invalid data": "Import failed: invalid data",
531
+ "Anonymous": "Anonymous"
524
532
  }
525
533
  L.registerLocale("br", locale)
526
534
  L.setLocale("br")
@@ -19,7 +19,6 @@
19
19
  "Add a new property": "Ouzhpennañ ur perzh nevez",
20
20
  "Add a polygon to the current multi": "Ouzhpennañ ul lieskorn d'ar strollad a-vremañ",
21
21
  "Add image URL": "Ouzhpennañ URL ar skeudenn",
22
- "Add": "Ouzhpennañ",
23
22
  "Advanced actions": "Oberoù araokaet",
24
23
  "Advanced properties": "Perzhioù araokaet",
25
24
  "All data and settings of the map": "Holl roadennoù hag arventennoù ar gartenn",
@@ -120,7 +119,6 @@
120
119
  "Display the locate control": "Diskwel an afell \"lec'hiañ\"",
121
120
  "Display the measure control": "Diskwel an afell muzuliañ",
122
121
  "Display the search control": "Diskwel an afell \"klask\"",
123
- "Display the star map button": "Diskouez an afell evit spilhennañ ar gartenn",
124
122
  "Display the tile layers control": "Diskwel an afell \"cheñch foñs ar gartenn\"",
125
123
  "Display the zoom control": "Diskwel an afelloù \"zoumañ\" ha \"dizoumañ\"",
126
124
  "Do you want to display a caption bar?": "Diskwel ur varrenn alc'hwez?",
@@ -183,12 +181,12 @@
183
181
  "Icon shape": "Furm an ikon",
184
182
  "Icon symbol": "Arouez an ikon",
185
183
  "If false, the polygon or line will act as a part of the underlying map.": "If false, the polygon or line will act as a part of the underlying map.",
186
- "Iframe with custom height (in px): {{{https://iframe.url.com|height}}}": "Iframe with custom height (in px): {{{https://iframe.url.com|height}}}",
187
- "Iframe with custom height and width (in px): {{{https://iframe.url.com|height*width}}}": "Iframe with custom height and width (in px): {{{https://iframe.url.com|height*width}}}",
184
+ "Iframe with custom height (in px): {{{https://iframe.url.com|height}}}": "Iframe gant uhelder personelaet (e pikselioù): {{{https://iframe.url.com|height}}}",
185
+ "Iframe with custom height and width (in px): {{{https://iframe.url.com|height*width}}}": "Iframe gant mentoù personelaet (e pikselioù): {{{https://iframe.url.com|height*width}}}",
188
186
  "iframe": "iframe",
189
187
  "Iframe: {{{https://iframe.url.com}}}": "Iframe: {{{https://iframe.url.com}}}",
190
- "Image with custom width (in px): {{https://image.url.com|width}}": "Image with custom width (in px): {{https://image.url.com|width}}",
191
- "Image: {{https://image.url.com}}": "Image: {{https://image.url.com}}",
188
+ "Image with custom width (in px): {{https://image.url.com|width}}": "Skeudenn gant ledander personelaet (e pikselioù): {{https://image.url.com|width}}",
189
+ "Image: {{https://image.url.com}}": "Skeudenn: {{https://image.url.com}}",
192
190
  "Import data": "Enporzhiañ roadennoù",
193
191
  "Import in a new layer": "Enporzhiañ ur gwiskad nevez",
194
192
  "Imports all umap data, including layers and settings.": "Enporzhiañ holl roadennoù ar gartenn, ar gwiskadoù hag an arventennoù en o zouez.",
@@ -216,7 +214,7 @@
216
214
  "Limit bounds": "Bevennoù geografek",
217
215
  "Link to view the map": "Liamm evit gwelet ar gartenn",
218
216
  "Link to…": "Liamm etrezek...",
219
- "Link with text: [[https://example.com|text of the link]]": "Link with text: [[https://example.com|text of the link]]",
217
+ "Link with text: [[https://example.com|text of the link]]": "Liamm gant testenn: [[https://skouer.bzh|testenn al liamm]]",
220
218
  "Long credits": "Kredadoù hir",
221
219
  "Longitude": "Hedred",
222
220
  "Make main shape": "Tres pennañ",
@@ -320,7 +318,7 @@
320
318
  "Show this layer in the caption": "Diskouez ar gwiskad-mañ en alc'hwez",
321
319
  "Show/hide layer": "Diskouez/kuzhat ar gwiskad",
322
320
  "Side panel": "Panell gostez",
323
- "Simple link: [[https://example.com]]": "Simple link: [[https://example.com]]",
321
+ "Simple link: [[https://example.com]]": "Liamm simpl: [[https://skouer.bzh]]",
324
322
  "Simplify": "Eeunaat",
325
323
  "Skipping unknown geometry.type: {type}": "Tremen e-bioù tikedenn geometry.type dianav: {type}",
326
324
  "Slideshow": "Diaporama",
@@ -515,10 +513,20 @@
515
513
  "Manage collaborators": "Merañ ar c'henlabourerien",
516
514
  "show/hide all layers": "diskouez/kuzhat an holl wiskadoù",
517
515
  "zoom to data extent": "zoom to data extent",
518
- "download visible data": "download visible data",
519
- "{connectedPeers} peer(s) currently connected to this map": "{connectedPeers} a genlabourerien a zo kennasket ouzh ar gartenn-mañ bremañ",
520
- "Import helpers": "Import helpers",
521
- "Import helpers will fill the URL field for you.": "Import helpers will fill the URL field for you.",
516
+ "download visible data": "Pellgargañ ar roadennoù war-wel",
517
+ "Import helpers": "Skoazellerien enporzhiañ",
518
+ "Import helpers will fill the URL field for you.": "Ar skoazellerien enporzhiañ a leunio maezienn an URL evidoc'h.",
522
519
  "Wikipedia": "Wikipedia",
523
- "Save draft": "Save draft"
520
+ "Save draft": "Enrollañ ar brouilhed",
521
+ "No data has been found for import": "No data has been found for import",
522
+ "Successfully imported {count} feature(s)": "Successfully imported {count} feature(s)",
523
+ "Disconnected": "Disconnected",
524
+ "You must be logged in": "You must be logged in",
525
+ "Created at {date}": "Created at {date}",
526
+ "Modified at {date}": "Modified at {date}",
527
+ "on hover": "on hover",
528
+ "Cannot load remote data for layer \"{layer}\" with url \"{url}\"": "Cannot load remote data for layer \"{layer}\" with url \"{url}\"",
529
+ "Cannot parse remote data for layer \"{layer}\" with url \"{url}\"": "Cannot parse remote data for layer \"{layer}\" with url \"{url}\"",
530
+ "Import failed: invalid data": "Import failed: invalid data",
531
+ "Anonymous": "Anonymous"
524
532
  }
@@ -19,7 +19,6 @@ const locale = {
19
19
  "Add a new property": "Add a new property",
20
20
  "Add a polygon to the current multi": "Add a polygon to the current multi",
21
21
  "Add image URL": "Add image URL",
22
- "Add": "Add",
23
22
  "Advanced actions": "Opcions avançades",
24
23
  "Advanced properties": "Propietats avançades",
25
24
  "All data and settings of the map": "Totes les dades i configuracions del mapa",
@@ -120,7 +119,6 @@ const locale = {
120
119
  "Display the locate control": "Mostra el control de ubicar",
121
120
  "Display the measure control": "Mostra el botó mesura",
122
121
  "Display the search control": "Mostra el control de cerca",
123
- "Display the star map button": "Mostra el botó per a destacar el mapa",
124
122
  "Display the tile layers control": "Mostra el botó de les capes de tessel·les",
125
123
  "Display the zoom control": "Mostra el control del zoom",
126
124
  "Do you want to display a caption bar?": "Voleu mostrar la barra de llegenda?",
@@ -516,11 +514,21 @@ const locale = {
516
514
  "show/hide all layers": "show/hide all layers",
517
515
  "zoom to data extent": "zoom to data extent",
518
516
  "download visible data": "download visible data",
519
- "{connectedPeers} peer(s) currently connected to this map": "{connectedPeers} peer(s) currently connected to this map",
520
517
  "Import helpers": "Import helpers",
521
518
  "Import helpers will fill the URL field for you.": "Import helpers will fill the URL field for you.",
522
519
  "Wikipedia": "Wikipedia",
523
- "Save draft": "Save draft"
520
+ "Save draft": "Save draft",
521
+ "No data has been found for import": "No data has been found for import",
522
+ "Successfully imported {count} feature(s)": "Successfully imported {count} feature(s)",
523
+ "Disconnected": "Disconnected",
524
+ "You must be logged in": "You must be logged in",
525
+ "Created at {date}": "Created at {date}",
526
+ "Modified at {date}": "Modified at {date}",
527
+ "on hover": "on hover",
528
+ "Cannot load remote data for layer \"{layer}\" with url \"{url}\"": "Cannot load remote data for layer \"{layer}\" with url \"{url}\"",
529
+ "Cannot parse remote data for layer \"{layer}\" with url \"{url}\"": "Cannot parse remote data for layer \"{layer}\" with url \"{url}\"",
530
+ "Import failed: invalid data": "Import failed: invalid data",
531
+ "Anonymous": "Anonymous"
524
532
  }
525
533
  L.registerLocale("ca", locale)
526
534
  L.setLocale("ca")