|
|
@@ -56,10 +56,14 @@ $(() => {
|
|
|
bt.type = 'button';
|
|
|
bt.innerHTML = '<i class="bi bi-pen"></i>';
|
|
|
inputGroup.appendChild(bt);
|
|
|
- bt.addEventListener('click', () => MediaStorage.Instance.setMetaValue(fullPageMediaDisplayed?.fixedSum || fullPageMediaList, key, valInput.value));
|
|
|
- inputGroup.addEventListener('submit', evt => {
|
|
|
+ bt.addEventListener('click', async () => {
|
|
|
+ await MediaStorage.Instance.setMetaValue(fullPageMediaDisplayed?.fixedSum || fullPageMediaList, key, valInput.value)
|
|
|
+ reloadCurrentMedia();
|
|
|
+ });
|
|
|
+ inputGroup.addEventListener('submit', async evt => {
|
|
|
evt.preventDefault();
|
|
|
- MediaStorage.Instance.setMetaValue(fullPageMediaDisplayed?.fixedSum || fullPageMediaList, key, valInput.value);
|
|
|
+ await MediaStorage.Instance.setMetaValue(fullPageMediaDisplayed?.fixedSum || fullPageMediaList, key, valInput.value);
|
|
|
+ reloadCurrentMedia();
|
|
|
});
|
|
|
}
|
|
|
li.appendChild(keySpan);
|
|
|
@@ -67,10 +71,35 @@ $(() => {
|
|
|
return li;
|
|
|
}
|
|
|
|
|
|
- function displayMap(geo) {
|
|
|
+ let latLngTimeo = null;
|
|
|
+ function setLatLngWithDelay(medias, lat, lng) {
|
|
|
+ if (latLngTimeo)
|
|
|
+ clearTimeout(latLngTimeo);
|
|
|
+ latLngTimeo = setTimeout(async () => {
|
|
|
+ await MediaStorage.Instance.setMetaValue(medias.map(x => x.fixedSum), 'gpsLocation', JSON.stringify([lat, lng]));
|
|
|
+ latLngTimeo = null;
|
|
|
+ reloadCurrentMedia();
|
|
|
+ }, 500);
|
|
|
+ }
|
|
|
+
|
|
|
+ function displayMap(media, geo, isRo) {
|
|
|
let jsonGeo = geo;
|
|
|
+ let marker;
|
|
|
+ let createMarker = (latLng) => {
|
|
|
+ if (marker)
|
|
|
+ return marker;
|
|
|
+ marker = L.marker(latLng, { draggable: true, autoPan: true });
|
|
|
+ if (!isRo)
|
|
|
+ marker.addEventListener('dragend', e => {
|
|
|
+ let latLng = e.target?.getLatLng();
|
|
|
+ if (!latLng || !latLng.lat || !latLng.lng)
|
|
|
+ return;
|
|
|
+ setLatLngWithDelay(media, latLng.lat, latLng.lng);
|
|
|
+ });
|
|
|
+ return marker;
|
|
|
+ };
|
|
|
try {
|
|
|
- geo = JSON.parse(geo);
|
|
|
+ geo = geo && JSON.parse(geo);
|
|
|
}
|
|
|
catch(err) { return null; }
|
|
|
let outerHTML = document.createElement("li");
|
|
|
@@ -80,23 +109,39 @@ $(() => {
|
|
|
outerHTML.appendChild(container);
|
|
|
let innerHTML = document.createElement("div");
|
|
|
container.appendChild(innerHTML);
|
|
|
- let map = L.map(innerHTML, { scrollWheelZoom: false }).setView(geo, 13);
|
|
|
+ let map = L.map(innerHTML, { scrollWheelZoom: false });
|
|
|
L.tileLayer('https://tile.openstreetmap.org/{z}/{x}/{y}.png', {
|
|
|
attribution: '© <a href="https://www.openstreetmap.org/copyright">OpenStreetMap</a> contributors'
|
|
|
}).addTo(map);
|
|
|
- L.marker(geo).addTo(map);
|
|
|
+ if (!isRo) {
|
|
|
+ map.addEventListener("contextmenu", evt => {
|
|
|
+ if (!marker)
|
|
|
+ createMarker(evt.latlng).addTo(map);
|
|
|
+ else
|
|
|
+ marker.setLatLng(evt.latlng);
|
|
|
+ setLatLngWithDelay(media, evt.latlng.lat, evt.latlng.lng);
|
|
|
+ });
|
|
|
+ }
|
|
|
+ if (geo) {
|
|
|
+ map.setView(geo, 13);
|
|
|
+ createMarker(geo).addTo(map);
|
|
|
+ }
|
|
|
+ else
|
|
|
+ map.setView(L.latLng(45, 2), 5);
|
|
|
setTimeout(function () {
|
|
|
map.invalidateSize();
|
|
|
}, 0);
|
|
|
- let a = document.createElement("a");
|
|
|
- a.href = `https://www.openstreetmap.org/?mlat=${geo[0]}&mlon=${geo[1]}`;
|
|
|
- a.target = "_blank";
|
|
|
- a.innerHTML = jsonGeo;
|
|
|
- container.appendChild(a);
|
|
|
+ if (jsonGeo) {
|
|
|
+ let a = document.createElement("a");
|
|
|
+ a.href = `https://www.openstreetmap.org/?mlat=${geo[0]}&mlon=${geo[1]}`;
|
|
|
+ a.target = "_blank";
|
|
|
+ a.innerHTML = jsonGeo;
|
|
|
+ container.appendChild(a);
|
|
|
+ }
|
|
|
return outerHTML;
|
|
|
}
|
|
|
|
|
|
- function displayMetas(metaData, isRo) {
|
|
|
+ function displayMetas(media, metaData, isRo) {
|
|
|
let metaList = document.createElement("ul");
|
|
|
|
|
|
metaData.libraryPath = null;
|
|
|
@@ -122,7 +167,7 @@ $(() => {
|
|
|
|
|
|
for (let i of Object.keys(metaData).sort((a, b) => a.toLowerCase().localeCompare(b.toLowerCase()))) {
|
|
|
if (i === 'gpsLocation') {
|
|
|
- let dom = displayMap(metaData[i].value);
|
|
|
+ let dom = displayMap(Array.isArray(media) ? media : [media], metaData[i].value, isRo);
|
|
|
dom && metaList.appendChild(dom);
|
|
|
continue;
|
|
|
}
|
|
|
@@ -130,18 +175,23 @@ $(() => {
|
|
|
metaItem && metaList.appendChild(metaItem);
|
|
|
}
|
|
|
|
|
|
- if (!isRo)
|
|
|
+ if (!isRo && media) {
|
|
|
for (let i of ['geoCountry', 'geoCity', 'geoAdmin']) {
|
|
|
if (!metaData[i]) {
|
|
|
let metaItem = displayMeta(i, "", false);
|
|
|
metaItem && metaList.appendChild(metaItem);
|
|
|
}
|
|
|
}
|
|
|
+ if (!metaData['gpsLocation']) {
|
|
|
+ let dom = displayMap(Array.isArray(media) ? media : [media], null, isRo);
|
|
|
+ dom && metaList.appendChild(dom);
|
|
|
+ }
|
|
|
+ }
|
|
|
return metaList;
|
|
|
}
|
|
|
|
|
|
function reloadCurrentMedia() {
|
|
|
- fullPageMediaDisplayed && window.displayMediaFullPage(fullPageMediaDisplayed);
|
|
|
+ fullPageMediaDisplayed && window.displayMediaFullPage(MediaStorage.Instance.getMediaLocal(fullPageMediaDisplayed.fixedSum));
|
|
|
}
|
|
|
|
|
|
function displayTags(fixedTagList, tagList, writeAccess) {
|
|
|
@@ -223,7 +273,7 @@ $(() => {
|
|
|
return bt;
|
|
|
}
|
|
|
|
|
|
- function _displayMediaFullPage(fileName, imgUrl, metaData, downloadLink, fileIds, writeAccess) {
|
|
|
+ function _displayMediaFullPage(media, fileName, imgUrl, metaData, downloadLink, fileIds, writeAccess) {
|
|
|
return new Promise(ok => {
|
|
|
document.getElementById("pch-fullPagePreviewContainer").classList.add("loading");
|
|
|
document.getElementById("pch-fullPageMedia-title").innerText = fileName;
|
|
|
@@ -236,7 +286,7 @@ $(() => {
|
|
|
if (fileIds && writeAccess)
|
|
|
document.getElementById("pch-fullPageDetail").appendChild(displayRemoveButton(fileIds));
|
|
|
document.getElementById("pch-fullPageDetail").appendChild(displayTags(metaData?.fixedTags || [], metaData?.tags || [], writeAccess));
|
|
|
- document.getElementById("pch-fullPageDetail").appendChild(displayMetas(Object.assign({}, metaData || {}), !writeAccess));
|
|
|
+ document.getElementById("pch-fullPageDetail").appendChild(displayMetas(media, Object.assign({}, metaData || {}), !writeAccess));
|
|
|
});
|
|
|
}
|
|
|
|
|
|
@@ -281,7 +331,7 @@ $(() => {
|
|
|
fullPageMediaDisplayed = mediaItem ?? null;
|
|
|
document.body.classList.add("overlay-visible");
|
|
|
if (!mediaItem)
|
|
|
- return _displayMediaFullPage("Error", null, {}, null, null, false);
|
|
|
+ return _displayMediaFullPage(null, "Error", null, {}, null, null, false);
|
|
|
let containerSize = document.getElementById("pch-fullPageMedia").getBoundingClientRect();
|
|
|
let requestSize = mediaItem.resize(containerSize.width, containerSize.height);
|
|
|
document.getElementById("pch-fullPagePreview").parentNode.style.maxWidth = "100%";
|
|
|
@@ -296,7 +346,7 @@ $(() => {
|
|
|
if (document.location.hash != `#${mediaItem.fixedSum}`)
|
|
|
history.pushState({}, '', `#${mediaItem.fixedSum}`);
|
|
|
const requestSizeQuery = requestSize ? `&w=${requestSize.width}&h=${requestSize.height}` : "";
|
|
|
- return _displayMediaFullPage(mediaItem.fileName, `${mediaItem.thumbnail}?q=6${requestSizeQuery}`, meta, `${mediaItem.original}?trim`, [mediaItem.fixedSum], mediaItem.writeAccess);
|
|
|
+ return _displayMediaFullPage(mediaItem, mediaItem.fileName, `${mediaItem.thumbnail}?q=6${requestSizeQuery}`, meta, `${mediaItem.original}?trim`, [mediaItem.fixedSum], mediaItem.writeAccess);
|
|
|
}
|
|
|
|
|
|
function aggregateMetas(medias) {
|
|
|
@@ -329,7 +379,7 @@ $(() => {
|
|
|
fixedTags: medias.reduce((acc, x) => { x.fixedTags.forEach(tag => acc.add(tag)) ; return acc; }, new Set()),
|
|
|
tags: medias.reduce((acc, x) => { x.tags.forEach(tag => acc.add(tag)) ; return acc; }, new Set()),
|
|
|
};
|
|
|
- return _displayMediaFullPage(title, "", meta, null, medias.map(x => x.fixedSum), true);
|
|
|
+ return _displayMediaFullPage(medias, title, "", meta, null, medias.map(x => x.fixedSum), true);
|
|
|
}
|
|
|
|
|
|
document.getElementById("pch-fullPageMedia-closeBt")
|