nakarte

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

commit 53a65f78cb9e17160372c3c9f53b8aea4ec7021d
parent 7b9847743626f49b48fee675edd62566b1cc8d24
Author: Sergej Orlov <wladimirych@gmail.com>
Date:   Fri, 17 Jan 2025 23:08:10 +0100

Create menu instead of button, add item for copying tracks to clipboard

Diffstat:
Meslint_rules/imports_webapp.js | 1+
Msrc/App.js | 31++++++++++++++++++++++++++++++-
Asrc/images/menu.png | 0
Msrc/lib/leaflet.control.sessions/index.js | 11+++++++++--
Msrc/lib/leaflet.control.track-list/track-list.js | 25++++++++++++++++---------
5 files changed, 56 insertions(+), 12 deletions(-)

diff --git a/eslint_rules/imports_webapp.js b/eslint_rules/imports_webapp.js @@ -37,6 +37,7 @@ const filesWithSideEffects = [ 'src/lib/leaflet.placemark/index.js', 'src/lib/leaflet.polyline-edit/index.js', 'src/lib/leaflet.polyline-measure/index.js', + 'src/vendored/mapbbcode/FunctionButton.js', ]; const filesWithExportAndSideEffects = [ diff --git a/src/App.js b/src/App.js @@ -35,6 +35,9 @@ import safeLocalStorage from '~/lib/safe-localstorage'; import {ExternalMaps} from '~/lib/leaflet.control.external-maps'; import {SearchControl} from '~/lib/leaflet.control.search'; import '~/lib/leaflet.placemark'; +import '~/vendored/mapbbcode/FunctionButton'; +import Contextmenu from '~/lib/contextmenu'; +import iconMenu from './images/menu.png'; const locationErrorMessage = { 0: 'Your browser does not support geolocation.', @@ -122,7 +125,33 @@ function setUp() { // eslint-disable-line complexity let sessionsControl; if (!isInIframe()) { - sessionsControl = new SessionsControl(tracklist, {position: 'topleft'}).addTo(map); + sessionsControl = new SessionsControl(tracklist, {noButton: true}).addTo(map); + const size = L.Browser.touch ? 30 : 26; + const offset = L.Browser.touch ? 7 : 5; + const menuButton = L.functionButtons( + [ + { + content: iconMenu, + title: 'Menu', + bgPos: [-offset, -offset], + imageSize: size, + }, + ], + {position: 'topleft'} + ); + menuButton.addTo(map); + menuButton.on('clicked', (e) => { + new Contextmenu([ + { + text: 'Recent sessions', + callback: () => sessionsControl.showSessionListWindow(), + }, + { + text: 'Copy share link', + callback: () => tracklist.copyAllTracksToClipboard(e, true), + }, + ]).show(e); + }); } new ExternalMaps({position: 'topleft'}).addTo(map); diff --git a/src/images/menu.png b/src/images/menu.png Binary files differ. diff --git a/src/lib/leaflet.control.sessions/index.js b/src/lib/leaflet.control.sessions/index.js @@ -160,8 +160,15 @@ const SessionsControl = L.Control.extend({ }, onAdd: function () { - const {container, link} = makeButton(null, 'Recent sessions'); - L.DomEvent.on(link, 'click', () => this.toggleSessionListsVisible()); + let container; + if (this.options.noButton) { + container = L.DomUtil.create('div'); + container.style.margin = '0'; + } else { + const {container: buttonContainer, link} = makeButton(null, 'Recent sessions'); + L.DomEvent.on(link, 'click', () => this.toggleSessionListsVisible()); + container = buttonContainer; + } this.setupSessionListWindow(); return container; }, diff --git a/src/lib/leaflet.control.track-list/track-list.js b/src/lib/leaflet.control.track-list/track-list.js @@ -47,14 +47,16 @@ function getLinkToShare(keysToExclude, paramsToAdd) { const params = new URLSearchParams(hash.substring(1)); - for (const key of keysToExclude) { - params.delete(key); + if (keysToExclude) { + for (const key of keysToExclude) { + params.delete(key); + } } - - for (const [key, value] of Object.entries(paramsToAdd)) { - params.set(key, value); + if (paramsToAdd) { + for (const [key, value] of Object.entries(paramsToAdd)) { + params.set(key, value); + } } - return origin + pathname + '#' + decodeURIComponent(params.toString()); } @@ -616,8 +618,13 @@ L.Control.TrackList = L.Control.extend({ return tracks.map((track) => this.trackToString(track)).join('/'); }, - copyTracksLinkToClipboard: function(tracks, mouseEvent) { + copyTracksLinkToClipboard: function(tracks, mouseEvent, allowWithoutTracks = false) { if (!tracks.length) { + if (allowWithoutTracks) { + const url = getLinkToShare(this.options.keysToExcludeOnCopyLink); + copyToClipboard(url, mouseEvent); + return; + } notify('No tracks to copy'); return; } @@ -1389,8 +1396,8 @@ L.Control.TrackList = L.Control.extend({ this.addTracksFromGeodataArray(geodata, allowEmpty); }, - copyAllTracksToClipboard: function(mouseEvent) { - this.copyTracksLinkToClipboard(this.tracks(), mouseEvent); + copyAllTracksToClipboard: function(mouseEvent, allowWithoutTracks = false) { + this.copyTracksLinkToClipboard(this.tracks(), mouseEvent, allowWithoutTracks); }, copyVisibleTracksToClipboard: function(mouseEvent) {