From 7daddd6bbc4f685cc52af48bcfafdbea309b381b Mon Sep 17 00:00:00 2001
From: Matthias Schiffer <mschiffer@universe-factory.net>
Date: Sun, 7 Jan 2024 19:22:56 +0100
Subject: [PATCH] viewer: include open marker in URL

Allow sharing URLs that reference a marker.
---
 viewer/MinedMap.js | 32 +++++++++++++++++++++++++++-----
 1 file changed, 27 insertions(+), 5 deletions(-)

diff --git a/viewer/MinedMap.js b/viewer/MinedMap.js
index 882691f..7dda976 100644
--- a/viewer/MinedMap.js
+++ b/viewer/MinedMap.js
@@ -39,6 +39,8 @@ const signKinds = {
 const params = {};
 const signIcons = {};
 
+let updateHash = () => {};
+
 function signIcon(material, kind) {
 	function createSignIcon(material, kind) {
 		const {iconSize, popupAnchor} = signKinds[kind];
@@ -284,7 +286,7 @@ function loadSigns(signLayer) {
 		}
 
 		for (const [key, group] of Object.entries(groups)) {
-			const popup = document.createElement('div');
+			const el = document.createElement('div');
 
 			let material;
 			let kind;
@@ -293,10 +295,10 @@ function loadSigns(signLayer) {
 			group.sort((a, b) => b.y - a.y);
 
 			for (const sign of group) {
-				popup.appendChild(createSign(sign, false));
+				el.appendChild(createSign(sign, false));
 
 				if (sign.back_text)
-					popup.appendChild(createSign(sign, true));
+					el.appendChild(createSign(sign, true));
 
 				material ??= sign.material;
 				kind ??= sign.kind;
@@ -307,9 +309,23 @@ function loadSigns(signLayer) {
 
 			const [x, z] = key.split(',').map((i) => +i);
 
-			L.marker([-z-0.5, x+0.5], {
+			const popup = L.popup().setContent(el);
+
+			popup.on('add', () => {
+				params.marker = [x, z];
+				updateHash();
+			});
+			popup.on('remove', () => {
+				params.marker = null;
+				updateHash();
+			});
+
+			const marker = L.marker([-z-0.5, x+0.5], {
 				icon: signIcon(material, kind),
 			}).addTo(signLayer).bindPopup(popup);
+
+			if (params.marker && x === params.marker[0] && z === params.marker[1])
+				marker.openPopup();
 		}
 	}
 
@@ -332,6 +348,7 @@ window.createMap = function () {
 			params.z = parseFloat(args['z']);
 			params.light = parseInt(args['light']);
 			params.signs = parseInt(args['signs'] ?? '1');
+			params.marker = (args['marker'] ?? '').split(',').map((i) => +i);
 
 			if (isNaN(params.zoom))
 				params.zoom = 0;
@@ -339,6 +356,8 @@ window.createMap = function () {
 				params.x = spawn.x;
 			if (isNaN(params.z))
 				params.z = spawn.z;
+			if (isNaN(params.marker[0]) || isNaN(params.marker[1]))
+				params.marker = null;
 		};
 
 		updateParams();
@@ -392,11 +411,14 @@ window.createMap = function () {
 				ret += '&light=1';
 			if (!map.hasLayer(signLayer))
 				ret += '&signs=0';
+			if (params.marker) {
+				ret += `&marker=${params.marker[0]},${params.marker[1]}`;
+			}
 
 			return ret;
 		};
 
-		const updateHash = function () {
+		updateHash = function () {
 			window.location.hash = makeHash();
 		};