From 95ee9da0a05f5989fdf6a8b4cea9fd962b453d8f Mon Sep 17 00:00:00 2001 From: Peter Mathis Date: Wed, 8 May 2024 17:16:49 +0200 Subject: [PATCH] fix selecting items on top level --- .../contentbrowser/src/ContentBrowser.svelte | 85 +++++++++++++++---- 1 file changed, 70 insertions(+), 15 deletions(-) diff --git a/src/pat/contentbrowser/src/ContentBrowser.svelte b/src/pat/contentbrowser/src/ContentBrowser.svelte index 8f451ca07..ece2a4b89 100644 --- a/src/pat/contentbrowser/src/ContentBrowser.svelte +++ b/src/pat/contentbrowser/src/ContentBrowser.svelte @@ -30,7 +30,6 @@ let showUpload = false; let previewItem = { UID: "" }; - let searchPage = 1; // page number for @@getVocabulary let vw = Math.max(document.documentElement.clientWidth || 0, window.innerWidth || 0); @@ -52,12 +51,8 @@ }); } - function changePath(item) { - showUpload = false; - if (item === "/") { - currentPath.set(item); - previewItem = { UID: "" }; - } else if ($config.mode == "search") { + function showPreview(item) { + if ($config.mode == "search") { // one level search mode previewItem = item; } else if (item.is_folderish) { @@ -66,19 +61,66 @@ } else { const pathParts = item.path.split("/"); const folderPath = pathParts.slice(0, pathParts.length - 1).join("/"); - currentPath.set(folderPath); + currentPath.set(folderPath || "/"); previewItem = item; } scrollToRight(); } - async function selectItem(item) { + function selectItems(selectedNode) { + // iter through the wrapper nodes and select all + // inbetween current selection and last selection + let select = false; + for(const el of selectedNode.closest(".levelItems").children) { + if (el.classList.contains("selectedItem")) { + console.log(el); + select = !select; + } + el.classList.toggle("selectedItem", select); + }; + } + + function changePath(item, e) { + showUpload = false; + if (item === "/") { + currentPath.set(item); + previewItem = { UID: "" }; + return; + } else if (e?.shiftKey) { + // check for previously selected items in the same level + // and select all items inbetween + const levelWrapper = e.target.closest(".levelItems"); + if (levelWrapper.querySelector(".selectedItem")) { + e.target.classList.add("selectedItem"); + previewItem = { UID: "", multiple: true }; + selectItems(e.target); + return; + } + } + // clear previous selection + e.target.closest(".levelItems").querySelectorAll(".contentItem").forEach((el) => { + el.classList.remove("selectedItem"); + }) + showPreview(item); + } + + function keyboardNavigation(item, e) { + // TODO + return; + } + + async function addItem(item) { selectedItems.update((n) => [...n, item]); selectedUids.update(() => $selectedItems.map((x) => x.UID)); $showContentBrowser = false; previewItem = { UID: "" }; } + async function addSelectedItems() { + // TODO + return; + } + function cancelSelection() { $showContentBrowser = false; previewItem = { UID: "" }; @@ -207,7 +249,7 @@ {/if} + {#if previewItem.multiple} +
+
+ +
+
+ {/if} {#if showUpload}
{/if} @@ -427,7 +481,7 @@ .contentItem.inPath { background-color: rgba(var(--bs-primary-rgb), 0.15); } - .contentItem.currentItem { + .contentItem.selectedItem { background-color: var(--bs-primary); color: var(--bs-body-bg); } @@ -435,6 +489,7 @@ padding: 0.5rem; white-space: nowrap; max-width: 100%; + user-select: none; } .contentItem .grid-preview > img {