mirror of
https://github.com/greflm13/StaticGalleryBuilder.git
synced 2026-02-05 02:59:27 +00:00
fixed tag render in title
This commit is contained in:
@@ -38,7 +38,12 @@ class PhotoGallery {
|
|||||||
|
|
||||||
openSwipe(imgIndex) {
|
openSwipe(imgIndex) {
|
||||||
const options = { index: imgIndex };
|
const options = { index: imgIndex };
|
||||||
const gallery = new PhotoSwipe(this.pswpElement, PhotoSwipeUI_Default, this.shown, options);
|
const gallery = new PhotoSwipe(
|
||||||
|
this.pswpElement,
|
||||||
|
PhotoSwipeUI_Default,
|
||||||
|
this.shown,
|
||||||
|
options
|
||||||
|
);
|
||||||
gallery.init();
|
gallery.init();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -73,7 +78,9 @@ class PhotoGallery {
|
|||||||
|
|
||||||
if (folders) folders.style.display = "";
|
if (folders) folders.style.display = "";
|
||||||
document.getElementById("recursive").checked = false;
|
document.getElementById("recursive").checked = false;
|
||||||
document.querySelectorAll("#tagdropdown input.tagcheckbox:checked").forEach((checkbox) => (checkbox.checked = false));
|
document
|
||||||
|
.querySelectorAll("#tagdropdown input.tagcheckbox:checked")
|
||||||
|
.forEach((checkbox) => (checkbox.checked = false));
|
||||||
window.history.replaceState({ html: content, pageTitle: title }, "", path);
|
window.history.replaceState({ html: content, pageTitle: title }, "", path);
|
||||||
this.requestMetadata();
|
this.requestMetadata();
|
||||||
}
|
}
|
||||||
@@ -143,7 +150,8 @@ class PhotoGallery {
|
|||||||
existingItems.add(image.src);
|
existingItems.add(image.src);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (Array.isArray(data.subfolders)) nextLevel.push(...data.subfolders);
|
if (Array.isArray(data.subfolders))
|
||||||
|
nextLevel.push(...data.subfolders);
|
||||||
} catch {}
|
} catch {}
|
||||||
})
|
})
|
||||||
);
|
);
|
||||||
@@ -186,15 +194,21 @@ class PhotoGallery {
|
|||||||
filter() {
|
filter() {
|
||||||
const searchParams = new URLSearchParams(window.location.search);
|
const searchParams = new URLSearchParams(window.location.search);
|
||||||
this.shown = [];
|
this.shown = [];
|
||||||
let path = decodeURIComponent(window.location.origin + window.location.pathname.replace("index.html", ""));
|
let path = decodeURIComponent(
|
||||||
|
window.location.origin +
|
||||||
|
window.location.pathname.replace("index.html", "")
|
||||||
|
);
|
||||||
if (path.startsWith("null")) {
|
if (path.startsWith("null")) {
|
||||||
path = window.location.protocol + "//" + path.substring(4);
|
path = window.location.protocol + "//" + path.substring(4);
|
||||||
}
|
}
|
||||||
const selectedTags = [];
|
const selectedTags = [];
|
||||||
|
|
||||||
document.querySelectorAll("#tagdropdown input.tagcheckbox:checked").forEach((checkbox) => {
|
document
|
||||||
|
.querySelectorAll("#tagdropdown input.tagcheckbox:checked")
|
||||||
|
.forEach((checkbox) => {
|
||||||
let tag = checkbox.parentElement.id.trim().substring(1);
|
let tag = checkbox.parentElement.id.trim().substring(1);
|
||||||
if (checkbox.parentElement.parentElement.children.length > 1) tag += "|";
|
if (checkbox.parentElement.parentElement.children.length > 1)
|
||||||
|
tag += "|";
|
||||||
selectedTags.push(tag);
|
selectedTags.push(tag);
|
||||||
});
|
});
|
||||||
|
|
||||||
@@ -202,14 +216,17 @@ class PhotoGallery {
|
|||||||
|
|
||||||
let isRecursiveChecked = false;
|
let isRecursiveChecked = false;
|
||||||
try {
|
try {
|
||||||
isRecursiveChecked = document.getElementById("recursive")?.checked || false;
|
isRecursiveChecked =
|
||||||
|
document.getElementById("recursive")?.checked || false;
|
||||||
} catch {}
|
} catch {}
|
||||||
|
|
||||||
for (const item of this.items) {
|
for (const item of this.items) {
|
||||||
const tags = item.tags || [];
|
const tags = item.tags || [];
|
||||||
const include = selectedTags.every((selected) => {
|
const include = selectedTags.every((selected) => {
|
||||||
const isParent = selected.endsWith("|");
|
const isParent = selected.endsWith("|");
|
||||||
return isParent ? tags.some((t) => t.startsWith(selected)) : tags.includes(selected);
|
return isParent
|
||||||
|
? tags.some((t) => t.startsWith(selected))
|
||||||
|
: tags.includes(selected);
|
||||||
});
|
});
|
||||||
|
|
||||||
if (include || selectedTags.length === 0) {
|
if (include || selectedTags.length === 0) {
|
||||||
@@ -235,12 +252,18 @@ class PhotoGallery {
|
|||||||
let current = obj;
|
let current = obj;
|
||||||
for (let i = 0; i < path.length; i++) {
|
for (let i = 0; i < path.length; i++) {
|
||||||
const part = path[i];
|
const part = path[i];
|
||||||
|
if (i === path.length - 1) {
|
||||||
if (!current[part]) {
|
if (!current[part]) {
|
||||||
|
current[part] = null;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if (!current[part] || typeof current[part] !== "object") {
|
||||||
current[part] = {};
|
current[part] = {};
|
||||||
}
|
}
|
||||||
current = current[part];
|
current = current[part];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
finalize(obj) {
|
finalize(obj) {
|
||||||
if (typeof obj === "object" && obj !== null && !Array.isArray(obj)) {
|
if (typeof obj === "object" && obj !== null && !Array.isArray(obj)) {
|
||||||
@@ -248,7 +271,11 @@ class PhotoGallery {
|
|||||||
Object.keys(obj)
|
Object.keys(obj)
|
||||||
.sort()
|
.sort()
|
||||||
.forEach((key) => {
|
.forEach((key) => {
|
||||||
result[key] = finalize(obj[key]);
|
if (obj[key] === null) {
|
||||||
|
result[key] = [];
|
||||||
|
} else {
|
||||||
|
result[key] = this.finalize(obj[key]);
|
||||||
|
}
|
||||||
});
|
});
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
@@ -259,18 +286,38 @@ class PhotoGallery {
|
|||||||
const tree = {};
|
const tree = {};
|
||||||
for (const tag of tags) {
|
for (const tag of tags) {
|
||||||
const parts = tag.split(delimiter);
|
const parts = tag.split(delimiter);
|
||||||
insertPath(tree, parts);
|
this.insertPath(tree, parts);
|
||||||
}
|
}
|
||||||
return finalize(tree);
|
return this.finalize(tree);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
renderTree = (obj, depth = 0) => {
|
||||||
|
let lines = [];
|
||||||
|
const indent = " ".repeat(depth);
|
||||||
|
for (const key of Object.keys(obj)) {
|
||||||
|
lines.push(indent + key);
|
||||||
|
if (Array.isArray(obj[key])) {
|
||||||
|
for (const val of obj[key]) {
|
||||||
|
lines.push(" ".repeat(depth + 1) + val);
|
||||||
|
}
|
||||||
|
} else if (typeof obj[key] === "object" && obj[key] !== null) {
|
||||||
|
lines = lines.concat(this.renderTree(obj[key], depth + 1));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return lines.join("\n");
|
||||||
|
};
|
||||||
|
|
||||||
updateImageList() {
|
updateImageList() {
|
||||||
const imagelist = document.getElementById("imagelist");
|
const imagelist = document.getElementById("imagelist");
|
||||||
if (!imagelist) return;
|
if (!imagelist) return;
|
||||||
let str = "";
|
let str = "";
|
||||||
this.shown.forEach((item, index) => {
|
this.shown.forEach((item, index) => {
|
||||||
let tags = this.parseHierarchicalTags(item.tags || []);
|
let tags = this.parseHierarchicalTags(item.tags || []);
|
||||||
str += `<div class="column" title="${tags}"><figure><img src="${item.msrc}" data-index="${index}" /><figcaption class="caption">${item.name}`;
|
str += `<div class="column"><figure title="${this.renderTree(
|
||||||
|
tags
|
||||||
|
)}"><img src="${
|
||||||
|
item.msrc
|
||||||
|
}" data-index="${index}" /><figcaption class="caption">${item.name}`;
|
||||||
if (item.tiff) str += ` <a href="${item.tiff}">TIFF</a>`;
|
if (item.tiff) str += ` <a href="${item.tiff}">TIFF</a>`;
|
||||||
if (item.raw) str += ` <a href="${item.raw}">RAW</a>`;
|
if (item.raw) str += ` <a href="${item.raw}">RAW</a>`;
|
||||||
str += "</figcaption></figure></div>";
|
str += "</figcaption></figure></div>";
|
||||||
@@ -281,9 +328,16 @@ class PhotoGallery {
|
|||||||
}
|
}
|
||||||
|
|
||||||
setFilter(selected) {
|
setFilter(selected) {
|
||||||
document.querySelectorAll("#tagdropdown input.tagcheckbox").forEach((checkbox) => {
|
document
|
||||||
|
.querySelectorAll("#tagdropdown input.tagcheckbox")
|
||||||
|
.forEach((checkbox) => {
|
||||||
selected.forEach((tag) => {
|
selected.forEach((tag) => {
|
||||||
if (checkbox.parentElement.id.trim().substring(1).replace(" ", "%20") === tag) {
|
if (
|
||||||
|
checkbox.parentElement.id
|
||||||
|
.trim()
|
||||||
|
.substring(1)
|
||||||
|
.replace(" ", "%20") === tag
|
||||||
|
) {
|
||||||
checkbox.checked = true;
|
checkbox.checked = true;
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
@@ -296,7 +350,9 @@ class PhotoGallery {
|
|||||||
const svg = tag?.parentElement.querySelector(".tagtoggle svg");
|
const svg = tag?.parentElement.querySelector(".tagtoggle svg");
|
||||||
if (!ol || !svg) return;
|
if (!ol || !svg) return;
|
||||||
ol.classList.toggle("show");
|
ol.classList.toggle("show");
|
||||||
svg.style.transform = ol.classList.contains("show") ? "rotate(180deg)" : "rotate(0deg)";
|
svg.style.transform = ol.classList.contains("show")
|
||||||
|
? "rotate(180deg)"
|
||||||
|
: "rotate(0deg)";
|
||||||
}
|
}
|
||||||
|
|
||||||
setupDropdownToggle() {
|
setupDropdownToggle() {
|
||||||
@@ -308,12 +364,18 @@ class PhotoGallery {
|
|||||||
event.stopPropagation();
|
event.stopPropagation();
|
||||||
const svg = toggleLink.querySelector("svg");
|
const svg = toggleLink.querySelector("svg");
|
||||||
dropdown.classList.toggle("show");
|
dropdown.classList.toggle("show");
|
||||||
if (svg) svg.style.transform = dropdown.classList.contains("show") ? "rotate(180deg)" : "rotate(0deg)";
|
if (svg)
|
||||||
|
svg.style.transform = dropdown.classList.contains("show")
|
||||||
|
? "rotate(180deg)"
|
||||||
|
: "rotate(0deg)";
|
||||||
this.tagDropdownShown = dropdown.classList.contains("show");
|
this.tagDropdownShown = dropdown.classList.contains("show");
|
||||||
});
|
});
|
||||||
|
|
||||||
document.addEventListener("click", (event) => {
|
document.addEventListener("click", (event) => {
|
||||||
if (!dropdown.contains(event.target) && !toggleLink.contains(event.target)) {
|
if (
|
||||||
|
!dropdown.contains(event.target) &&
|
||||||
|
!toggleLink.contains(event.target)
|
||||||
|
) {
|
||||||
dropdown.classList.remove("show");
|
dropdown.classList.remove("show");
|
||||||
this.tagDropdownShown = false;
|
this.tagDropdownShown = false;
|
||||||
const svg = toggleLink.querySelector("svg");
|
const svg = toggleLink.querySelector("svg");
|
||||||
@@ -340,11 +402,14 @@ class PhotoGallery {
|
|||||||
}
|
}
|
||||||
|
|
||||||
setupClickHandlers() {
|
setupClickHandlers() {
|
||||||
const resetEl = document.getElementById("reset-filter")?.querySelector("label");
|
const resetEl = document
|
||||||
|
.getElementById("reset-filter")
|
||||||
|
?.querySelector("label");
|
||||||
if (resetEl) resetEl.addEventListener("click", this.reset);
|
if (resetEl) resetEl.addEventListener("click", this.reset);
|
||||||
|
|
||||||
const recurseEl = document.getElementById("recursive");
|
const recurseEl = document.getElementById("recursive");
|
||||||
if (recurseEl) recurseEl.addEventListener("change", this.debounce(this.recursive, 150));
|
if (recurseEl)
|
||||||
|
recurseEl.addEventListener("change", this.debounce(this.recursive, 150));
|
||||||
|
|
||||||
const totop = document.getElementById("totop");
|
const totop = document.getElementById("totop");
|
||||||
if (totop) totop.addEventListener("click", this.topFunction);
|
if (totop) totop.addEventListener("click", this.topFunction);
|
||||||
@@ -377,7 +442,10 @@ class PhotoGallery {
|
|||||||
scrollFunction() {
|
scrollFunction() {
|
||||||
const totopbutton = document.getElementById("totop");
|
const totopbutton = document.getElementById("totop");
|
||||||
if (!totopbutton) return;
|
if (!totopbutton) return;
|
||||||
if (document.body.scrollTop > 20 || document.documentElement.scrollTop > 20) {
|
if (
|
||||||
|
document.body.scrollTop > 20 ||
|
||||||
|
document.documentElement.scrollTop > 20
|
||||||
|
) {
|
||||||
totopbutton.style.display = "block";
|
totopbutton.style.display = "block";
|
||||||
} else {
|
} else {
|
||||||
totopbutton.style.display = "none";
|
totopbutton.style.display = "none";
|
||||||
|
|||||||
Reference in New Issue
Block a user