diff --git a/templates/functionality.js b/templates/functionality.js index 92b270a..8d56864 100644 --- a/templates/functionality.js +++ b/templates/functionality.js @@ -38,7 +38,12 @@ class PhotoGallery { openSwipe(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(); } @@ -73,7 +78,9 @@ class PhotoGallery { if (folders) folders.style.display = ""; 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); this.requestMetadata(); } @@ -143,7 +150,8 @@ class PhotoGallery { existingItems.add(image.src); } } - if (Array.isArray(data.subfolders)) nextLevel.push(...data.subfolders); + if (Array.isArray(data.subfolders)) + nextLevel.push(...data.subfolders); } catch {} }) ); @@ -186,30 +194,39 @@ class PhotoGallery { filter() { const searchParams = new URLSearchParams(window.location.search); 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")) { path = window.location.protocol + "//" + path.substring(4); } const selectedTags = []; - document.querySelectorAll("#tagdropdown input.tagcheckbox:checked").forEach((checkbox) => { - let tag = checkbox.parentElement.id.trim().substring(1); - if (checkbox.parentElement.parentElement.children.length > 1) tag += "|"; - selectedTags.push(tag); - }); + document + .querySelectorAll("#tagdropdown input.tagcheckbox:checked") + .forEach((checkbox) => { + let tag = checkbox.parentElement.id.trim().substring(1); + if (checkbox.parentElement.parentElement.children.length > 1) + tag += "|"; + selectedTags.push(tag); + }); const urltags = selectedTags.join(","); let isRecursiveChecked = false; try { - isRecursiveChecked = document.getElementById("recursive")?.checked || false; + isRecursiveChecked = + document.getElementById("recursive")?.checked || false; } catch {} for (const item of this.items) { const tags = item.tags || []; const include = selectedTags.every((selected) => { 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) { @@ -235,10 +252,16 @@ class PhotoGallery { let current = obj; for (let i = 0; i < path.length; i++) { const part = path[i]; - if (!current[part]) { - current[part] = {}; + if (i === path.length - 1) { + if (!current[part]) { + current[part] = null; + } + } else { + if (!current[part] || typeof current[part] !== "object") { + current[part] = {}; + } + current = current[part]; } - current = current[part]; } } @@ -248,7 +271,11 @@ class PhotoGallery { Object.keys(obj) .sort() .forEach((key) => { - result[key] = finalize(obj[key]); + if (obj[key] === null) { + result[key] = []; + } else { + result[key] = this.finalize(obj[key]); + } }); return result; } @@ -259,18 +286,38 @@ class PhotoGallery { const tree = {}; for (const tag of tags) { 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() { const imagelist = document.getElementById("imagelist"); if (!imagelist) return; let str = ""; this.shown.forEach((item, index) => { let tags = this.parseHierarchicalTags(item.tags || []); - str += `