From 8da23fda22ce7e34fa4748815cdb5ac0493abb04 Mon Sep 17 00:00:00 2001 From: Diego Imbert Date: Tue, 28 Jul 2026 12:10:33 +0200 Subject: [PATCH] fix: discard stale prefix searches and guard load-more reveals Co-Authored-By: Claude Fable 5 Claude-Session: https://claude.ai/code/session_011HeHeGLWDuu62fxjBZA15P --- backend/ee-repo-ref.txt | 2 +- .../src/lib/components/S3FilePickerInner.svelte | 15 ++++++++++++++- 2 files changed, 15 insertions(+), 2 deletions(-) diff --git a/backend/ee-repo-ref.txt b/backend/ee-repo-ref.txt index 4914b42230..7e56c2e18b 100644 --- a/backend/ee-repo-ref.txt +++ b/backend/ee-repo-ref.txt @@ -1 +1 @@ -9198f30466965db1305daf9d6694855de6fe8d93 +6bf95f5b160283d5eeb0ac29f199644dcecd6149 diff --git a/frontend/src/lib/components/S3FilePickerInner.svelte b/frontend/src/lib/components/S3FilePickerInner.svelte index a6e8b14c17..f2fa2fb1aa 100644 --- a/frontend/src/lib/components/S3FilePickerInner.svelte +++ b/frontend/src/lib/components/S3FilePickerInner.svelte @@ -203,7 +203,7 @@ // Sorted after every real child of the folder but before the folder's own // siblings, so the row lands at the bottom of the level it pages. - const LOAD_MORE_SUFFIX = '￿' + const LOAD_MORE_SUFFIX = '\uffff' function loadMoreKey(folderKey: string | undefined): string { return (folderKey ?? '') + LOAD_MORE_SUFFIX } @@ -267,6 +267,7 @@ } async function loadFilesFlat() { + const generation = loadGeneration let availableFiles = await listStoredFilesRequest({ workspace: ws!, maxKeys: maxKeys, // fixed pages of 1000 files for now @@ -275,6 +276,11 @@ storage: storage, s3ResourcePath }) + // Debounced prefix searches overlap, so a slower earlier one must not + // land in the tree a later one already rebuilt. + if (generation !== loadGeneration) { + return + } if ( availableFiles.restricted_access === null || availableFiles.restricted_access === undefined || @@ -447,6 +453,7 @@ if (marker === undefined) { return } + const generation = loadGeneration const loadingKey = loadMoreKey(parentKey) loadingFolderKeys.add(loadingKey) try { @@ -457,6 +464,12 @@ } finally { loadingFolderKeys.delete(loadingKey) } + // The tree may have been rebuilt, or the folder collapsed, while the page + // was in flight — either way its children must stay hidden. + const parentNode = parentKey !== undefined ? allFilesByKey[parentKey] : undefined + if (generation !== loadGeneration || parentNode?.collapsed === true) { + return + } revealChildren(parentKey) }