From f75e2a52784a30d019a7b8f3b1fbe88340d8d65f Mon Sep 17 00:00:00 2001 From: vcoppe Date: Wed, 3 Jul 2024 11:30:28 +0200 Subject: [PATCH] handle series of (de)select events together --- .../file-list/FileListNodeContent.svelte | 61 +++++++++++-------- 1 file changed, 35 insertions(+), 26 deletions(-) diff --git a/website/src/lib/components/file-list/FileListNodeContent.svelte b/website/src/lib/components/file-list/FileListNodeContent.svelte index 0fa1c6cb..507562e5 100644 --- a/website/src/lib/components/file-list/FileListNodeContent.svelte +++ b/website/src/lib/components/file-list/FileListNodeContent.svelte @@ -48,35 +48,44 @@ let sortable: Sortable; let orientation = getContext<'vertical' | 'horizontal'>('orientation'); + let lastUpdateStart = 0; function updateToSelection(e) { - if (updating) return; - updating = true; - // Sortable updates selection - let changed = getChangedIds(); - if (changed.length > 0) { - selection.update(($selection) => { - $selection.clear(); - Object.entries(elements).forEach(([id, element]) => { - $selection.set( - item.extend(getRealId(id)), - element.classList.contains('sortable-selected') - ); - }); - - if ( - e.originalEvent && - $selection.size > 1 && - !(e.originalEvent.ctrlKey || e.originalEvent.metaKey || e.originalEvent.shiftKey) - ) { - // Fix bug that sometimes causes a single select to be treated as a multi-select - $selection.clear(); - $selection.set(item.extend(getRealId(changed[0])), true); + lastUpdateStart = Date.now(); + setTimeout(() => { + if (Date.now() - lastUpdateStart >= 40) { + if (updating) { + return; } - return $selection; - }); - } - updating = false; + updating = true; + // Sortable updates selection + let changed = getChangedIds(); + if (changed.length > 0) { + selection.update(($selection) => { + $selection.clear(); + Object.entries(elements).forEach(([id, element]) => { + $selection.set( + item.extend(getRealId(id)), + element.classList.contains('sortable-selected') + ); + }); + + if ( + e.originalEvent && + $selection.size > 1 && + !(e.originalEvent.ctrlKey || e.originalEvent.metaKey || e.originalEvent.shiftKey) + ) { + // Fix bug that sometimes causes a single select to be treated as a multi-select + $selection.clear(); + $selection.set(item.extend(getRealId(changed[0])), true); + } + + return $selection; + }); + } + updating = false; + } + }, 50); } function updateFromSelection() {