diff --git a/umap/static/umap/js/umap.controls.js b/umap/static/umap/js/umap.controls.js
index 42a6dd67..e0c1f051 100644
--- a/umap/static/umap/js/umap.controls.js
+++ b/umap/static/umap/js/umap.controls.js
@@ -1147,15 +1147,21 @@ L.U.Map.include({
this.loadDatalayers(true) // Force load
},
- download: function (mode) {
+ format: function (mode) {
const type = this.EXPORT_TYPES[mode || 'umap']
const content = type.formatter(this)
let name = this.options.name || 'data'
name = name.replace(/[^a-z0-9]/gi, '_').toLowerCase()
+ const filename = name + type.ext
+ return {content, filetype: type.filetype, filename}
+ },
+
+ download: function (mode) {
+ const {content, filetype, filename} = this.format(mode)
+ const blob = new Blob([content], { type: filetype })
window.URL = window.URL || window.webkitURL
- const blob = new Blob([content], { type: type.filetype })
const el = document.createElement('a')
- el.download = name + type.ext
+ el.download = filename
el.href = window.URL.createObjectURL(blob)
el.style.display = 'none'
document.body.appendChild(el)
diff --git a/umap/static/umap/js/umap.js b/umap/static/umap/js/umap.js
index ec412835..7848add6 100644
--- a/umap/static/umap/js/umap.js
+++ b/umap/static/umap/js/umap.js
@@ -1136,9 +1136,11 @@ L.U.Map.include({
},
serialize: function () {
+ // Do not use local path during unit tests
+ const uri = window.location.protocol === 'file:' ? null : window.location.href
const umapfile = {
type: 'umap',
- uri: window.location.href,
+ uri: uri,
properties: this.exportOptions(),
geometry: this.geometry(),
layers: [],
diff --git a/umap/static/umap/test/Map.Export.js b/umap/static/umap/test/Map.Export.js
new file mode 100644
index 00000000..1c17a803
--- /dev/null
+++ b/umap/static/umap/test/Map.Export.js
@@ -0,0 +1,230 @@
+describe('L.U.Map.Export', function () {
+ before(function () {
+ this.server = sinon.fakeServer.create()
+ this.server.respondWith(
+ /\/datalayer\/62\/\?.*/,
+ JSON.stringify(RESPONSES.datalayer62_GET)
+ )
+ this.options = {
+ umap_id: 99,
+ }
+ this.map = initMap({ umap_id: 99 })
+ this.server.respond()
+ this.datalayer = this.map.getDataLayerByUmapId(62)
+ })
+ after(function () {
+ this.server.restore()
+ clickCancel()
+ resetMap()
+ })
+
+ describe('#formatters()', function () {
+ it('should export to geojson', function () {
+ const { content, filetype, filename } = this.map.format('geojson')
+ assert.equal(filetype, 'application/json')
+ assert.equal(filename, 'name_of_the_map.geojson')
+ assert.deepEqual(JSON.parse(content), {
+ type: 'FeatureCollection',
+ features: [
+ {
+ type: 'Feature',
+ properties: {
+ name: 'name poly',
+ },
+ geometry: {
+ type: 'Polygon',
+ coordinates: [
+ [
+ [11.25, 53.585984],
+ [10.151367, 52.975108],
+ [12.689209, 52.167194],
+ [14.084473, 53.199452],
+ [12.634277, 53.618579],
+ [11.25, 53.585984],
+ [11.25, 53.585984],
+ ],
+ ],
+ },
+ },
+ {
+ type: 'Feature',
+ properties: {
+ _umap_options: {
+ color: 'OliveDrab',
+ },
+ name: 'test',
+ },
+ geometry: {
+ type: 'Point',
+ coordinates: [-0.274658, 52.57635],
+ },
+ },
+ {
+ type: 'Feature',
+ properties: {
+ _umap_options: {
+ fill: false,
+ },
+ name: 'test',
+ },
+ geometry: {
+ type: 'LineString',
+ coordinates: [
+ [-0.571289, 54.476422],
+ [0.439453, 54.610255],
+ [1.724854, 53.448807],
+ [4.163818, 53.988395],
+ [5.306396, 53.533778],
+ [6.591797, 53.709714],
+ [7.042236, 53.350551],
+ ],
+ },
+ },
+ ],
+ })
+ })
+
+ it('should export to gpx', function () {
+ const { content, filetype, filename } = this.map.format('gpx')
+ assert.equal(filetype, 'application/gpx+xml')
+ assert.equal(filename, 'name_of_the_map.gpx')
+ const expected =
+ 'testname=testname polyname=name polytestname=test'
+ assert.equal(content, expected)
+ })
+
+ it('should export to gpx', function () {
+ const { content, filetype, filename } = this.map.format('kml')
+ assert.equal(filetype, 'application/vnd.google-earth.kml+xml')
+ assert.equal(filename, 'name_of_the_map.kml')
+ const expected =
+ 'name polyname poly11.25,53.585984 10.151367,52.975108 12.689209,52.167194 14.084473,53.199452 12.634277,53.618579 11.25,53.585984 11.25,53.585984test[object Object]test-0.274658,52.57635test[object Object]test-0.571289,54.476422 0.439453,54.610255 1.724854,53.448807 4.163818,53.988395 5.306396,53.533778 6.591797,53.709714 7.042236,53.350551'
+ assert.equal(content, expected)
+ })
+
+ it('should export to umap', function () {
+ const { content, filetype, filename } = this.map.format('umap')
+ assert.equal(filetype, 'application/json')
+ assert.equal(filename, 'name_of_the_map.umap')
+ const expected = {
+ type: 'umap',
+ uri: null,
+ properties: {
+ easing: false,
+ embedControl: true,
+ fullscreenControl: true,
+ searchControl: true,
+ datalayersControl: true,
+ zoomControl: true,
+ permanentCreditBackground: true,
+ slideshow: {},
+ captionMenus: true,
+ captionBar: false,
+ limitBounds: {},
+ overlay: null,
+ tilelayer: {
+ attribution: 'HOT and friends',
+ name: 'HOT OSM-fr server',
+ url_template: 'http://{s}.tile.openstreetmap.fr/hot/{z}/{x}/{y}.png',
+ rank: 99,
+ minZoom: 0,
+ maxZoom: 20,
+ id: 2,
+ },
+ licence: '',
+ description: 'The description of the map',
+ name: 'name of the map',
+ displayPopupFooter: false,
+ miniMap: false,
+ moreControl: true,
+ scaleControl: true,
+ scrollWheelZoom: true,
+ zoom: 6,
+ },
+ geometry: {
+ type: 'Point',
+ coordinates: [5.0592041015625, 52.05924589011585],
+ },
+ layers: [
+ {
+ type: 'FeatureCollection',
+ features: [
+ {
+ type: 'Feature',
+ properties: {
+ name: 'name poly',
+ },
+ geometry: {
+ type: 'Polygon',
+ coordinates: [
+ [
+ [11.25, 53.585984],
+ [10.151367, 52.975108],
+ [12.689209, 52.167194],
+ [14.084473, 53.199452],
+ [12.634277, 53.618579],
+ [11.25, 53.585984],
+ [11.25, 53.585984],
+ ],
+ ],
+ },
+ },
+ {
+ type: 'Feature',
+ properties: {
+ _umap_options: {
+ color: 'OliveDrab',
+ },
+ name: 'test',
+ },
+ geometry: {
+ type: 'Point',
+ coordinates: [-0.274658, 52.57635],
+ },
+ },
+ {
+ type: 'Feature',
+ properties: {
+ _umap_options: {
+ fill: false,
+ },
+ name: 'test',
+ },
+ geometry: {
+ type: 'LineString',
+ coordinates: [
+ [-0.571289, 54.476422],
+ [0.439453, 54.610255],
+ [1.724854, 53.448807],
+ [4.163818, 53.988395],
+ [5.306396, 53.533778],
+ [6.591797, 53.709714],
+ [7.042236, 53.350551],
+ ],
+ },
+ },
+ ],
+ _umap_options: {
+ displayOnLoad: true,
+ browsable: true,
+ iconClass: 'Default',
+ name: 'Elephants',
+ id: 62,
+ pictogram_url: null,
+ opacity: null,
+ weight: null,
+ fillColor: '',
+ color: '',
+ stroke: true,
+ smoothFactor: null,
+ dashArray: '',
+ fillOpacity: null,
+ fill: true,
+ },
+ },
+ ],
+ }
+ assert.deepEqual(JSON.parse(content), expected)
+ })
+ })
+})
diff --git a/umap/static/umap/test/Polyline.js b/umap/static/umap/test/Polyline.js
index 8e8d4607..dfc1393c 100644
--- a/umap/static/umap/test/Polyline.js
+++ b/umap/static/umap/test/Polyline.js
@@ -1,4 +1,4 @@
-describe('L.Utorage.Polyline', function () {
+describe('L.U.Polyline', function () {
var p2ll, map
before(function () {
diff --git a/umap/static/umap/test/index.html b/umap/static/umap/test/index.html
index b8ed9b10..cf4928f2 100644
--- a/umap/static/umap/test/index.html
+++ b/umap/static/umap/test/index.html
@@ -23,6 +23,8 @@
+
+
@@ -68,6 +70,7 @@
+