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:
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) {