commit 88f0cfbf1b848a375252bd34c7aa36fd631c7772
parent 186c6e2269b5a49a220c7f59acd1fa7473a699d7
Author: Igor Sidorov <igor.sidorov@onapp.com>
Date:   Sun, 27 May 2018 13:33:46 +0300
Modify PDF filename generation logic according to comments
Diffstat:
3 files changed, 132 insertions(+), 46 deletions(-)
diff --git a/src/layers.js b/src/layers.js
@@ -20,6 +20,7 @@ export default function getLayers() {
                 {
                     title: 'OpenStreetMap',
                     description: 'OSM default style',
+                    shortName: 'osm',
                     order: 100,
                     isOverlay: false,
                     isDefault: true,
@@ -29,6 +30,7 @@ export default function getLayers() {
                 },
                 {
                     title: 'ESRI Sat',
+                    shortName: 'esri',
                     order: 200,
                     isOverlay: false,
                     isDefault: true,
@@ -39,6 +41,7 @@ export default function getLayers() {
                 },
                 {
                     title: 'Yandex map',
+                    shortName: 'yandex',
                     order: 300,
                     isOverlay: false,
                     isDefault: true,
@@ -46,6 +49,7 @@ export default function getLayers() {
                 },
                 {
                     title: 'Yandex Satellite',
+                    shortName: 'yandex_sat',
                     order: 400,
                     isOverlay: false,
                     isDefault: true,
@@ -53,6 +57,7 @@ export default function getLayers() {
                 },
                 {
                     title: 'Google',
+                    shortName: 'google',
                     order: 500,
                     isOverlay: false,
                     isDefault: true,
@@ -60,6 +65,7 @@ export default function getLayers() {
                 },
                 {
                     title: 'Google Satellite',
+                    shortName: 'google_sat',
                     order: 600,
                     isOverlay: false,
                     isDefault: true,
@@ -67,6 +73,7 @@ export default function getLayers() {
                 },
                 {
                     title: 'Google Terrain',
+                    shortName: 'google_terrain',
                     order: 650,
                     isOverlay: false,
                     isDefault: true,
@@ -74,6 +81,7 @@ export default function getLayers() {
                 },
                 {
                     title: 'Bing Sat',
+                    shortName: 'bing',
                     order: 700,
                     isOverlay: false,
                     isDefault: true,
@@ -82,6 +90,7 @@ export default function getLayers() {
 
                 {
                     title: 'marshruty.ru',
+                    shortName: 'marshruty',
                     order: 800,
                     isOverlay: false,
                     isDefault: true,
@@ -91,6 +100,7 @@ export default function getLayers() {
                 },
                 {
                     title: 'Topomapper 1km',
+                    shortName: 'topomapper_1k',
                     order: 900,
                     isOverlay: false,
                     isDefault: true,
@@ -102,6 +112,7 @@ export default function getLayers() {
 
                 {
                     title: 'Topo 10km',
+                    shortName: 'topo_10k',
                     order: 10100,
                     isOverlay: true,
                     isDefault: true,
@@ -111,6 +122,7 @@ export default function getLayers() {
                 },
                 {
                     title: 'GGC 2 km',
+                    shortName: 'ggc_2k',
                     order: 10200,
                     isOverlay: true,
                     isDefault: true,
@@ -120,6 +132,7 @@ export default function getLayers() {
                 },
                 {
                     title: 'ArbaletMO',
+                    shortName: 'arbalet',
                     order: 10300,
                     isOverlay: true,
                     isDefault: true,
@@ -129,6 +142,7 @@ export default function getLayers() {
                 },
                 {
                     title: 'Slazav mountains',
+                    shortName: 'slazav_mountains',
                     order: 10400,
                     isOverlay: true,
                     isDefault: true,
@@ -138,6 +152,7 @@ export default function getLayers() {
                 },
                 {
                     title: 'GGC 1km',
+                    shortName: 'ggc_1k',
                     order: 10500,
                     isOverlay: true,
                     isDefault: true,
@@ -147,6 +162,7 @@ export default function getLayers() {
                 },
                 {
                     title: 'Topo 1km',
+                    shortName: 'topo_1k',
                     order: 10600,
                     isOverlay: true,
                     isDefault: true,
@@ -156,6 +172,7 @@ export default function getLayers() {
                 },
                 {
                     title: 'GGC 500m',
+                    shortName: 'ggc_500',
                     order: 10700,
                     isOverlay: true,
                     isDefault: true,
@@ -165,6 +182,7 @@ export default function getLayers() {
                 },
                 {
                     title: 'Topo 500m',
+                    shortName: 'topo_500',
                     order: 10800,
                     isOverlay: true,
                     isDefault: true,
@@ -174,6 +192,7 @@ export default function getLayers() {
                 },
                 {
                     title: 'GGC 250m',
+                    shortName: 'ggc_250',
                     order: 10900,
                     isOverlay: true,
                     isDefault: true,
@@ -183,6 +202,7 @@ export default function getLayers() {
                 },
                 {
                     title: 'Slazav map',
+                    shortName: 'slazav',
                     order: 11000,
                     isOverlay: true,
                     isDefault: true,
@@ -192,8 +212,10 @@ export default function getLayers() {
                 },
                 {
                     title: 'Races',
+                    shortName: 'races',
                     order: 11050,
                     isOverlay: true,
+                    isOverlayTransparent: true,
                     isDefault: true,
                     layer: L.tileLayer("https://tiles.nakarte.tk/adraces/{z}/{x}/{y}",
                         {code: 'U', tms: true, scaleDependent: false, maxNativeZoom: 15, print: true, jnx: true}
@@ -201,8 +223,10 @@ export default function getLayers() {
                 },
                 {
                     title: 'O-sport',
+                    shortName: 'osport',
                     order: 11100,
                     isOverlay: true,
+                    isOverlayTransparent: true,
                     isDefault: true,
                     layer: L.tileLayer("https://tiles.nakarte.tk/osport/{z}/{x}/{y}",
                         {code: 'R', tms: true, scaleDependent: false, maxNativeZoom: 17, print: true, jnx: true}
@@ -210,6 +234,7 @@ export default function getLayers() {
                 },
                 {
                     title: 'Soviet topo maps grid',
+                    shortName: 'soviet_topo_grid',
                     order: 11200,
                     isOverlay: true,
                     isDefault: true,
@@ -217,6 +242,7 @@ export default function getLayers() {
                 },
                 {
                     title: 'Wikimapia',
+                    shortName: 'wikimapia',
                     order: 11300,
                     isOverlay: true,
                     isDefault: true,
@@ -224,8 +250,10 @@ export default function getLayers() {
                 },
                 {
                     title: 'Mountain passes (Westra)',
+                    shortName: 'westra',
                     order: 11400,
                     isOverlay: true,
+                    isOverlayTransparent: true,
                     isDefault: true,
                     layer: new L.Layer.WestraPasses(config.westraDataBaseUrl, {
                             code: 'Wp',
@@ -254,6 +282,7 @@ export default function getLayers() {
             layers: [
                 {
                     title: 'OpenTopoMap',
+                    shortName: 'opentopo',
                     order: 110,
                     isOverlay: false,
                     isDefault: false,
@@ -263,6 +292,7 @@ export default function getLayers() {
                 },
                 {
                     title: 'OpenCycleMap',
+                    shortName: 'ocm',
                     description: '<a href="https://www.opencyclemap.org/docs/">(Info and key)</a>',
                     order: 120,
                     isOverlay: false,
@@ -273,6 +303,7 @@ export default function getLayers() {
                 },
                 {
                     title: 'OSM Outdoors',
+                    shortName: 'osm_outdoors',
                     order: 130,
                     isOverlay: false,
                     isDefault: false,
@@ -287,6 +318,7 @@ export default function getLayers() {
             layers: [
                 {
                     title: 'Eurasia 25km',
+                    shortName: 'eurasia_25k',
                     description: '1975-80',
                     order: 10090,
                     isOverlay: true,
@@ -297,6 +329,7 @@ export default function getLayers() {
                 },
                 {
                     title: 'Caucasus 1km',
+                    shortName: 'caucasus_1k',
                     order: 10610,
                     isOverlay: true,
                     isDefault: false,
@@ -306,6 +339,7 @@ export default function getLayers() {
                 },
                 {
                     title: 'Caucasus 500m',
+                    shortName: 'caucasus_500',
                     order: 10810,
                     isOverlay: true,
                     isDefault: false,
@@ -315,6 +349,7 @@ export default function getLayers() {
                 },
                 {
                     title: 'Topo 250m',
+                    shortName: 'topo_250',
                     order: 10950,
                     isOverlay: true,
                     isDefault: false,
@@ -324,6 +359,7 @@ export default function getLayers() {
                 },
                 {
                     title: 'Montenegro topo 250m',
+                    shortName: 'montenegro_250',
                     description: '1970-72',
                     order: 10960,
                     isOverlay: true,
@@ -339,6 +375,7 @@ export default function getLayers() {
             layers: [
                 {
                     title: 'Mountains by Aleksey Tsvetkov',
+                    shortName: 'tsvetkov_mountains',
                     description: 'Tian Shan, Dzungaria, <a href="http://pereval.g-utka.ru/">http://pereval.g-utka.ru/</a>',
                     order: 10390,
                     isOverlay: true,
@@ -364,6 +401,7 @@ export default function getLayers() {
             layers: [
                 {
                     title: 'Bing imagery acquisition dates',
+                    shortName: 'bind_dates',
                     order: 11110,
                     isOverlay: true,
                     isDefault: false,
@@ -378,6 +416,7 @@ export default function getLayers() {
                 },
                 {
                     title: 'geocaching.su',
+                    shortName: 'geocaching',
                     order: 11500,
                     isOverlay: true,
                     isDefault: false,
@@ -389,6 +428,7 @@ export default function getLayers() {
                 },
                 {
                     title: 'OpenStreetMap GPS traces',
+                    shortName: 'osm_gps_traces',
                     order: 11120,
                     isOverlay: true,
                     isDefault: false,
@@ -398,6 +438,7 @@ export default function getLayers() {
                 },
                 {
                     title: 'Strava heatmap (all)',
+                    shortName: 'strava',
                     order: 11130,
                     isOverlay: true,
                     isDefault: false,
@@ -408,6 +449,7 @@ export default function getLayers() {
                 },
                 {
                     title: 'Strava heatmap (run)',
+                    shortName: 'strava_run',
                     order: 11131,
                     isOverlay: true,
                     isDefault: false,
@@ -418,6 +460,7 @@ export default function getLayers() {
                 },
                 {
                     title: 'Strava heatmap (ride)',
+                    shortName: 'strava_ride',
                     order: 11132,
                     isOverlay: true,
                     isDefault: false,
@@ -428,6 +471,7 @@ export default function getLayers() {
                 },
                 {
                     title: 'Strava heatmap (winter)',
+                    shortName: 'strava_winter',
                     order: 11133,
                     isOverlay: true,
                     isDefault: false,
@@ -438,6 +482,7 @@ export default function getLayers() {
                 },
                 {
                     title: 'Strava heatmap lowres (all)',
+                    shortName: 'strava_lowres',
                     order: 11134,
                     isOverlay: true,
                     isDefault: false,
@@ -448,6 +493,7 @@ export default function getLayers() {
                 },
                 {
                     title: 'Strava heatmap lowres (run)',
+                    shortName: 'strava_lowres_run',
                     order: 11135,
                     isOverlay: true,
                     isDefault: false,
@@ -458,6 +504,7 @@ export default function getLayers() {
                 },
                 {
                     title: 'Strava heatmap lowres (ride)',
+                    shortName: 'strava_lowres_ride',
                     order: 11136,
                     isOverlay: true,
                     isDefault: false,
@@ -468,6 +515,7 @@ export default function getLayers() {
                 },
                 {
                     title: 'Strava heatmap lowres (winter)',
+                    shortName: 'strava_lowres_winter',
                     order: 11137,
                     isOverlay: true,
                     isDefault: false,
@@ -485,6 +533,7 @@ export default function getLayers() {
                 {
                     // Вместо 404 отдают 500 для отсутствующих тайлов
                     title: 'Norway UT map',
+                    shortName: 'norway_ut',
                     order: 5000,
                     isOverlay: false,
                     isDefault: false,
@@ -494,6 +543,7 @@ export default function getLayers() {
                 },
                 {
                     title: 'Norway paper map',
+                    shortName: 'norway_paper',
                     order: 10310,
                     isOverlay: true,
                     isDefault: false,
@@ -503,6 +553,7 @@ export default function getLayers() {
                 },
                 {
                     title: 'Norway map',
+                    shortName: 'norway',
                     order: 10320,
                     isOverlay: true,
                     isDefault: false,
@@ -512,6 +563,7 @@ export default function getLayers() {
                 },
                 {
                     title: 'Norway summer trails',
+                    shortName: 'norway_summer',
                     order: 20000,
                     isOverlay: true,
                     isDefault: false,
@@ -521,6 +573,7 @@ export default function getLayers() {
                 },
                 {
                     title: 'Norway winter trails',
+                    shortName: 'norway_winter',
                     order: 20010,
                     isOverlay: true,
                     isDefault: false,
@@ -531,6 +584,7 @@ export default function getLayers() {
                 {
                     // Вместо 404 отдают 500 для отсутствующих тайлов
                     title: 'Norway roads',
+                    shortName: 'norway_roads',
                     description: '<a href="https://kart.finn.no/">https://kart.finn.no/</a>',
                     order: 5030,
                     isOverlay: false,
@@ -545,6 +599,7 @@ export default function getLayers() {
             layers: [
                 {
                     title: 'Czech base',
+                    shortName: 'czech',
                     order: 5040,
                     isOverlay: false,
                     isDefault: false,
@@ -554,6 +609,7 @@ export default function getLayers() {
                 },
                 {
                     title: 'Czech tourist',
+                    shortName: 'czech_tourist',
                     order: 5050,
                     isOverlay: false,
                     isDefault: false,
@@ -563,6 +619,7 @@ export default function getLayers() {
                 },
                 {
                     title: 'Czech summer',
+                    shortName: 'czech_summer',
                     order: 5060,
                     isOverlay: false,
                     isDefault: false,
@@ -572,6 +629,7 @@ export default function getLayers() {
                 },
                 {
                     title: 'Czech winter',
+                    shortName: 'czech_winter',
                     order: 5070,
                     isOverlay: false,
                     isDefault: false,
@@ -581,6 +639,7 @@ export default function getLayers() {
                 },
                 {
                     title: 'Czech geographical',
+                    shortName: 'czech_geo',
                     order: 5080,
                     isOverlay: false,
                     isDefault: false,
@@ -593,6 +652,7 @@ export default function getLayers() {
     // TODO: move it to tests
     const codes = {};
     const orders = {};
+    const shortNames = new Set();
     for (let group of layers) {
         for (let layer of group.layers) {
             if (!layer.layer.options) {
@@ -614,6 +674,14 @@ export default function getLayers() {
                 throw new Error(`Duplicate layer order "${order}"`);
             }
             orders[order] = 1;
+            let shortName = layer.shortName;
+            if (!shortName) {
+                throw new Error('Layer without shortName: ' + layer.title);
+            }
+            if (shortNames.has(shortName)) {
+                throw new Error(`Duplicate layer shortName "${shortName}"`);
+            }
+            shortNames.add(shortName);
         }
     }
     return layers;
diff --git a/src/lib/leaflet.control.printPages/control.js b/src/lib/leaflet.control.printPages/control.js
@@ -17,6 +17,7 @@ import logging from 'lib/logging';
 import  {MagneticMeridians} from './decoration.magnetic-meridians';
 import {OverlayScale} from './decoration.scale';
 import {Grid} from './decoration.grid';
+import getLayers from 'layers';
 
 ko.extenders.checkNumberRange = function(target, range) {
     return ko.pureComputed({
@@ -208,7 +209,6 @@ L.Control.PrintPages = L.Control.extend({
                 }
             );
             const resolution = this.resolution();
-            const zooms = this.zoomForPrint();
             const decorationLayers = [];
             if (this.gridOn()) {
                 decorationLayers.push(new Grid());
@@ -220,18 +220,17 @@ L.Control.PrintPages = L.Control.extend({
             renderPages({
                     map: this._map,
                     pages,
-                    zooms,
+                    zooms: this.zoomForPrint(),
                     resolution,
                     scale: this.scale(),
                     decorationLayers,
                     progressCallback: this.incrementProgress.bind(this)
                 }
-            ).then(({images, layers}) => {
+            ).then(({images, renderedLayerCodes}) => {
                     if (images) {
                         const fileName = this.getFileName({
-                          layers,
-                          zooms,
-                          extension: 'pdf'
+                            renderedLayerCodes,
+                            extension: 'pdf'
                         });
                         savePagesPdf(images, resolution, fileName);
                     }
@@ -250,7 +249,6 @@ L.Control.PrintPages = L.Control.extend({
                 printSize: page.getPrintSize(),
                 label: page.getLabel()
             }];
-            const zooms = this.zoomForPrint();
             const decorationLayers = [];
             if (this.gridOn()) {
                 decorationLayers.push(new Grid());
@@ -265,20 +263,19 @@ L.Control.PrintPages = L.Control.extend({
             renderPages({
                     map: this._map,
                     pages,
-                    zooms,
+                    zooms: this.zoomForPrint(),
                     resolution: this.resolution(),
                     scale: this.scale(),
                     decorationLayers,
                     progressCallback: this.incrementProgress.bind(this)
                 }
             )
-                .then(({images, layers}) => {
-                  const fileName = this.getFileName({
-                    layers,
-                    zooms,
-                    extension: 'jpg'
-                  });
-                  savePageJpg(images[0], fileName);
+                .then(({images, renderedLayerCodes}) => {
+                    const fileName = this.getFileName({
+                        renderedLayerCodes,
+                        extension: 'jpg'
+                    });
+                    savePageJpg(images[0], fileName);
                 })
                 .catch((e) => {
                         logging.captureException(e);
@@ -477,43 +474,59 @@ L.Control.PrintPages = L.Control.extend({
             return true;
         },
 
-        getFileName: function({layers, zooms, extension}) {
-            let fileName = 'nakarte.tk_';
-
-            const width  = this.pageWidth();
-            const height = this.pageHeight();
-
-            const currentPageSize = this.pageSizes.find((pageSize) => {
-              return (width == pageSize.width) && (height == pageSize.height);
+        getFileName: function({renderedLayerCodes, extension}) {
+            let fileName = '';
+
+            const baseLayers = [];
+            const overlayLayers = [];
+            const transparentOverlayLayers = [];
+
+            getLayers().forEach(({ layers: layerGroup }) => {
+                layerGroup.forEach((layer) => {
+                    if (renderedLayerCodes.has(layer.layer.options.code)) {
+                        if (layer.isOverlay) {
+                            if (layer.isOverlayTransparent) {
+                                transparentOverlayLayers.push(layer);
+                            } else {
+                                overlayLayers.push(layer);
+                            }
+                        } else {
+                            baseLayers.push(layer);
+                        }
+                    }
+                });
             });
 
-            if (currentPageSize) {
-              fileName += currentPageSize.name;
-            } else {
-              fileName += `${width}x${height}`;
+            const compare = (layer1, layer2) => {
+                if (layer1.order < layer2.order) return 1;
+                if (layer1.order > layer2.order) return -1;
+                return 0;
             }
+            baseLayers.sort(compare);
+            overlayLayers.sort(compare);
+            transparentOverlayLayers.sort(compare);
 
-            const layerZooms = new Set();
+            const appendLayerShortName = (layer) => {
+                fileName += `${layer.shortName}_`;
+            }
+            if (overlayLayers.length > 0) {
+                appendLayerShortName(overlayLayers[0]);
+            } else if (baseLayers.length > 0) {
+                appendLayerShortName(baseLayers[0]);
+            }
+            transparentOverlayLayers.forEach(appendLayerShortName);
 
-            layers.map((layer) => {
-              const { options } = layer
-              if (options) {
-                const { code, scaleDependent } = options
+            fileName += `${this.scale()}m`;
 
-                if (code) {
-                  fileName += `_${code}`;
-                }
-                if (scaleDependent) {
-                  layerZooms.add(zooms.mapZoom);
-                } else {
-                  layerZooms.add(zooms.satZoom);
-                }
-              }
+            const width  = this.pageWidth();
+            const height = this.pageHeight();
+
+            const currentPageSize = this.pageSizes.find((pageSize) => {
+                return (width == pageSize.width) && (height == pageSize.height);
             });
 
-            if (layerZooms.size > 0) {
-              let layerZoomsName = [...layerZooms].join('_');
-              fileName += `_Z${layerZoomsName}`;
+            if (currentPageSize) {
+                fileName += `_${currentPageSize.name}`;
             }
 
             return `${fileName}.${extension}`;
diff --git a/src/lib/leaflet.control.printPages/map-render.js b/src/lib/leaflet.control.printPages/map-render.js
@@ -185,6 +185,7 @@ async function* iterateLayersTiles(layers, latLngBounds, destPixelSize, resoluti
     };
     let doStop;
     for (let layer of layers) {
+        const layerCode = layer.options && layer.options.code;
         let zoom;
         if (layer.options && layer.options.scaleDependent) {
             zoom = zooms.mapZoom;
@@ -217,7 +218,7 @@ async function* iterateLayersTiles(layers, latLngBounds, destPixelSize, resoluti
             layerPromises.push(tilePromise.tilePromise);
             let progressInc = (layer._printProgressWeight || 1) / count;
             tilePromise.tilePromise =
-                tilePromise.tilePromise.then((tileInfo) => Object.assign({zoom, progressInc}, tileInfo));
+                tilePromise.tilePromise.then((tileInfo) => Object.assign({zoom, progressInc, layerCode}, tileInfo));
             doStop = yield tilePromise;
             if (doStop) {
                 tilePromise.abortLoading();
@@ -276,6 +277,7 @@ async function renderPages({map, pages, zooms, resolution, scale, progressCallba
     }
     progressRange *= pages.length;
     const pageImagesInfo = [];
+    const renderedLayerCodes = new Set();
     for (let page of pages) {
         let destPixelSize = page.printSize.multiplyBy(resolution / 25.4).round();
         let pixelBounds = L.bounds(
@@ -301,6 +303,9 @@ async function renderPages({map, pages, zooms, resolution, scale, progressCallba
             }
             progressCallback(tileInfo.progressInc, progressRange);
             composer.putTile(tileInfo);
+            if (tileInfo.image) {
+                renderedLayerCodes.add(tileInfo.layerCode);
+            }
         }
         const dataUrl = composer.getDataUrl();
         let data = dataUrl.substring(dataUrl.indexOf(',') + 1);
@@ -312,7 +317,7 @@ async function renderPages({map, pages, zooms, resolution, scale, progressCallba
             }
         );
     }
-    return { images: pageImagesInfo, layers };
+    return { images: pageImagesInfo, renderedLayerCodes };
 }