nakarte

Source code of https://map.sikmir.ru (fork)
git clone git://git.sikmir.ru/nakarte
Log | Files | Refs | LICENSE

commit b957dfbf7ba7750ab47133fe149aa609a01571c0
parent dc6b859314396ac1a86a136ace06bf4dd5bb93a7
Author: Sergej Orlov <wladimirych@gmail.com>
Date:   Sat,  3 Dec 2016 03:30:40 +0300

[track list] store tracks in localStorage

Diffstat:
Msrc/App.js | 12+++++++++---
Asrc/lib/leaflet.control.track-list/track-list.localstorage.js | 93+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
2 files changed, 102 insertions(+), 3 deletions(-)

diff --git a/src/App.js b/src/App.js @@ -15,8 +15,10 @@ import './adaptive.css'; import 'lib/leaflet.control.panoramas/panoramas'; import 'lib/leaflet.control.track-list/track-list'; import 'lib/leaflet.control.track-list/track-list.hash-state'; +import 'lib/leaflet.control.track-list/track-list.localstorage'; import enableLayersControlAdaptiveHeight from 'lib/leaflet.control.layers.adaptive-height/adaptive-height'; import enableLayersMinimize from 'lib/leaflet.control.layers.minimize/minimize'; +import hashState from 'lib/leaflet.hashState/hashState'; function raiseControlsOnMouse(controls) { @@ -82,11 +84,15 @@ function setUp() { /////////// controls bottom-right corner - new L.Control.TrackList() - .addTo(map) - .enableHashState('nktk'); + const tracklist = new L.Control.TrackList() + .addTo(map); + if (!hashState.getState('nktk')) { + tracklist.loadTracksFromStorage(); + } + tracklist.enableHashState('nktk'); raiseControlsOnMouse(); + L.DomEvent.on(window, 'beforeunload', () => tracklist.saveTracksToStorage()); } export default {setUp}; diff --git a/src/lib/leaflet.control.track-list/track-list.localstorage.js b/src/lib/leaflet.control.track-list/track-list.localstorage.js @@ -0,0 +1,92 @@ +import './track-list' +import L from 'leaflet'; +import {parseGeoFile} from './lib/geo_file_formats'; + +L.Control.TrackList.include({ + maxLocalStorageSessions: 5, + + saveTracksToStorage: function() { + if (!(window.localStorage)) { + return; + } + var tracks = this.tracks(), + serialized = [], + maxKey = -1, + i, track, s, key, m, keys = []; + + for (i = 0; i < localStorage.length; i++) { + key = localStorage.key(i); + m = key.match(/^trackList_(\d+)$/); + if (m && m[1] !== undefined) { + if (+m[1] > maxKey) { + maxKey = +m[1]; + } + } + } + key = 'trackList_' + (maxKey + 1); + + if (tracks.length === 0) { + localStorage.setItem(key, ''); + return; + } + for (i = 0; i < tracks.length; i++) { + track = tracks[i]; + s = this.trackToString(track); + serialized.push(s); + } + if (serialized.length === 0) { + return; + } + s = '#nktk=' + serialized.join('/'); + + localStorage.setItem(key, s); + + //cleanup stale records + for (i = 0; i < localStorage.length; i++) { + key = localStorage.key(i); + m = key.match(/^trackList_(\d+)$/); + if (m && m[1] !== undefined) { + keys.push(+m[1]); + } + } + if (keys.length > this.maxLocalStorageSessions) { + keys.sort(function(a, b) { + return a - b + } + ); + for (i = 0; i < keys.length - this.maxLocalStorageSessions; i++) { + key = 'trackList_' + keys[i]; + localStorage.removeItem(key); + } + } + }, + + loadTracksFromStorage: function() { + if (!(window.localStorage)) { + return; + } + var i, key, m, s, + geodata, + maxKey = -1; + + for (i = 0; i < localStorage.length; i++) { + key = localStorage.key(i); + m = key.match(/^trackList_(\d+)$/); + if (m && m[1] !== undefined) { + if (+m[1] > maxKey) { + maxKey = +m[1]; + } + } + } + if (maxKey > -1) { + key = 'trackList_' + maxKey; + s = localStorage.getItem(key); + localStorage.removeItem(key); + if (s) { + geodata = parseGeoFile('', s); + this.addTracksFromGeodataArray(geodata); + } + } + } + } +); +\ No newline at end of file