From 4ad51282590c4ef379416dd6041544504a21c90d Mon Sep 17 00:00:00 2001 From: dev Date: Fri, 14 Aug 2026 14:25:17 -0400 Subject: [PATCH] fix: clarify partial object sorting --- components/object/list.tsx | 62 ++++++++++++++++++++++++---- i18n/locales/ar-MA.json | 5 +++ i18n/locales/de-DE.json | 5 +++ i18n/locales/en-US.json | 5 +++ i18n/locales/es-ES.json | 5 +++ i18n/locales/fr-FR.json | 5 +++ i18n/locales/id-ID.json | 5 +++ i18n/locales/it-IT.json | 5 +++ i18n/locales/ja-JP.json | 5 +++ i18n/locales/ko-KR.json | 5 +++ i18n/locales/pt-BR.json | 5 +++ i18n/locales/ru-RU.json | 5 +++ i18n/locales/tr-TR.json | 5 +++ i18n/locales/vi-VN.json | 5 +++ i18n/locales/zh-CN.json | 5 +++ tests/lib/object-list-source.test.js | 12 ++++++ 16 files changed, 135 insertions(+), 9 deletions(-) diff --git a/components/object/list.tsx b/components/object/list.tsx index f08328b..b96dd08 100644 --- a/components/object/list.tsx +++ b/components/object/list.tsx @@ -139,6 +139,7 @@ export function ObjectList({ const [showDeleted, setShowDeleted] = useLocalStorage("object-list-show-deleted", false) const [loading, setLoading] = React.useState(false) const [listError, setListError] = React.useState(null) + const [loadMoreError, setLoadMoreError] = React.useState(false) const [data, setData] = React.useState([]) const [nextToken, setNextToken] = React.useState() const [showScrollShortcuts, setShowScrollShortcuts] = React.useState(false) @@ -218,6 +219,7 @@ export function ObjectList({ loadingRef.current = true setLoading(true) if (!shouldAppend) setListError(null) + setLoadMoreError(false) try { const response = await listObject(bucket, prefix || undefined, resolvedPageSize, token, { includeDeleted: showDeleted, @@ -265,7 +267,6 @@ export function ObjectList({ } } catch (error) { console.error("Failed to fetch objects:", error) - message.error((error as Error)?.message ?? t("Failed to load objects")) if ( shouldApplyObjectListResponse({ requestId, @@ -274,8 +275,11 @@ export function ObjectList({ activeScope: activeScopeRef.current, }) ) { - setNextToken(undefined) - if (!shouldAppend) { + if (shouldAppend) { + setLoadMoreError(true) + } else { + message.error((error as Error)?.message ?? t("Failed to load objects")) + setNextToken(undefined) setData([]) setListError(isAccessDeniedError(error) ? "accessDenied" : "loadFailed") } @@ -502,7 +506,14 @@ export function ObjectList({ }, { id: "lastModified", - header: () => t("Last Modified"), + header: () => ( + + {t("Last Modified")} + {nextToken ? ( + {t("Loaded objects only")} + ) : null} + + ), accessorFn: (row) => (row.type === "prefix" || !row.LastModified ? "" : new Date(row.LastModified).getTime()), cell: ({ row }) => (row.original.LastModified ? formatDateTime(row.original.LastModified) : "-"), }, @@ -567,6 +578,7 @@ export function ObjectList({ prefix, bucketVersioningState, openDeleteDialog, + nextToken, ], ) @@ -808,6 +820,20 @@ export function ObjectList({ ) : null} ) : null} + {data.length > 0 ? ( + + ) : null} ) : null} diff --git a/i18n/locales/ar-MA.json b/i18n/locales/ar-MA.json index e1772de..74fb324 100644 --- a/i18n/locales/ar-MA.json +++ b/i18n/locales/ar-MA.json @@ -1529,6 +1529,11 @@ "Filter loaded objects": "Filter loaded objects", "Loaded {count} objects": "Loaded {count} objects", "Filtering and sorting apply to loaded objects": "Filtering and sorting apply to loaded objects", + "Loaded objects only": "الكائنات المحملة فقط", + "Load next objects": "تحميل الكائنات التالية", + "All objects loaded": "تم تحميل جميع الكائنات", + "Failed to load more objects. Loaded objects remain available.": "فشل تحميل المزيد من الكائنات. تظل الكائنات المحملة متاحة.", + "Retry": "إعادة المحاولة", "Loading more objects": "Loading more objects", "Scroll to load more objects": "Scroll to load more objects", "Back to top": "Back to top", diff --git a/i18n/locales/de-DE.json b/i18n/locales/de-DE.json index 9309886..592ce4f 100644 --- a/i18n/locales/de-DE.json +++ b/i18n/locales/de-DE.json @@ -1529,6 +1529,11 @@ "Filter loaded objects": "Filter loaded objects", "Loaded {count} objects": "Loaded {count} objects", "Filtering and sorting apply to loaded objects": "Filtering and sorting apply to loaded objects", + "Loaded objects only": "Nur geladene Objekte", + "Load next objects": "Nächste Objekte laden", + "All objects loaded": "Alle Objekte geladen", + "Failed to load more objects. Loaded objects remain available.": "Weitere Objekte konnten nicht geladen werden. Geladene Objekte bleiben verfügbar.", + "Retry": "Erneut versuchen", "Loading more objects": "Loading more objects", "Scroll to load more objects": "Scroll to load more objects", "Back to top": "Back to top", diff --git a/i18n/locales/en-US.json b/i18n/locales/en-US.json index 3607430..1f38ad0 100644 --- a/i18n/locales/en-US.json +++ b/i18n/locales/en-US.json @@ -1529,6 +1529,11 @@ "Filter loaded objects": "Filter loaded objects", "Loaded {count} objects": "Loaded {count} objects", "Filtering and sorting apply to loaded objects": "Filtering and sorting apply to loaded objects", + "Loaded objects only": "Loaded objects only", + "Load next objects": "Load next objects", + "All objects loaded": "All objects loaded", + "Failed to load more objects. Loaded objects remain available.": "Failed to load more objects. Loaded objects remain available.", + "Retry": "Retry", "Loading more objects": "Loading more objects", "Scroll to load more objects": "Scroll to load more objects", "Back to top": "Back to top", diff --git a/i18n/locales/es-ES.json b/i18n/locales/es-ES.json index e4fa567..1c4446a 100644 --- a/i18n/locales/es-ES.json +++ b/i18n/locales/es-ES.json @@ -1529,6 +1529,11 @@ "Filter loaded objects": "Filter loaded objects", "Loaded {count} objects": "Loaded {count} objects", "Filtering and sorting apply to loaded objects": "Filtering and sorting apply to loaded objects", + "Loaded objects only": "Solo objetos cargados", + "Load next objects": "Cargar los siguientes objetos", + "All objects loaded": "Todos los objetos cargados", + "Failed to load more objects. Loaded objects remain available.": "No se pudieron cargar más objetos. Los objetos cargados siguen disponibles.", + "Retry": "Reintentar", "Loading more objects": "Loading more objects", "Scroll to load more objects": "Scroll to load more objects", "Back to top": "Back to top", diff --git a/i18n/locales/fr-FR.json b/i18n/locales/fr-FR.json index 44eb997..c704085 100644 --- a/i18n/locales/fr-FR.json +++ b/i18n/locales/fr-FR.json @@ -1529,6 +1529,11 @@ "Filter loaded objects": "Filter loaded objects", "Loaded {count} objects": "Loaded {count} objects", "Filtering and sorting apply to loaded objects": "Filtering and sorting apply to loaded objects", + "Loaded objects only": "Objets chargés uniquement", + "Load next objects": "Charger les objets suivants", + "All objects loaded": "Tous les objets sont chargés", + "Failed to load more objects. Loaded objects remain available.": "Impossible de charger d’autres objets. Les objets chargés restent disponibles.", + "Retry": "Réessayer", "Loading more objects": "Loading more objects", "Scroll to load more objects": "Scroll to load more objects", "Back to top": "Back to top", diff --git a/i18n/locales/id-ID.json b/i18n/locales/id-ID.json index 827629b..346a854 100644 --- a/i18n/locales/id-ID.json +++ b/i18n/locales/id-ID.json @@ -1529,6 +1529,11 @@ "Filter loaded objects": "Filter loaded objects", "Loaded {count} objects": "Loaded {count} objects", "Filtering and sorting apply to loaded objects": "Filtering and sorting apply to loaded objects", + "Loaded objects only": "Hanya objek yang dimuat", + "Load next objects": "Muat objek berikutnya", + "All objects loaded": "Semua objek telah dimuat", + "Failed to load more objects. Loaded objects remain available.": "Gagal memuat lebih banyak objek. Objek yang telah dimuat tetap tersedia.", + "Retry": "Coba lagi", "Loading more objects": "Loading more objects", "Scroll to load more objects": "Scroll to load more objects", "Back to top": "Back to top", diff --git a/i18n/locales/it-IT.json b/i18n/locales/it-IT.json index 9168fc0..5b0dba5 100644 --- a/i18n/locales/it-IT.json +++ b/i18n/locales/it-IT.json @@ -1529,6 +1529,11 @@ "Filter loaded objects": "Filter loaded objects", "Loaded {count} objects": "Loaded {count} objects", "Filtering and sorting apply to loaded objects": "Filtering and sorting apply to loaded objects", + "Loaded objects only": "Solo oggetti caricati", + "Load next objects": "Carica gli oggetti successivi", + "All objects loaded": "Tutti gli oggetti sono stati caricati", + "Failed to load more objects. Loaded objects remain available.": "Impossibile caricare altri oggetti. Gli oggetti caricati restano disponibili.", + "Retry": "Riprova", "Loading more objects": "Loading more objects", "Scroll to load more objects": "Scroll to load more objects", "Back to top": "Back to top", diff --git a/i18n/locales/ja-JP.json b/i18n/locales/ja-JP.json index 79b2c93..82d47ed 100644 --- a/i18n/locales/ja-JP.json +++ b/i18n/locales/ja-JP.json @@ -1529,6 +1529,11 @@ "Filter loaded objects": "Filter loaded objects", "Loaded {count} objects": "Loaded {count} objects", "Filtering and sorting apply to loaded objects": "Filtering and sorting apply to loaded objects", + "Loaded objects only": "読み込み済みオブジェクトのみ", + "Load next objects": "次のオブジェクトを読み込む", + "All objects loaded": "すべてのオブジェクトを読み込みました", + "Failed to load more objects. Loaded objects remain available.": "追加のオブジェクトを読み込めませんでした。読み込み済みのオブジェクトは引き続き利用できます。", + "Retry": "再試行", "Loading more objects": "Loading more objects", "Scroll to load more objects": "Scroll to load more objects", "Back to top": "Back to top", diff --git a/i18n/locales/ko-KR.json b/i18n/locales/ko-KR.json index 12593bc..e577626 100644 --- a/i18n/locales/ko-KR.json +++ b/i18n/locales/ko-KR.json @@ -1529,6 +1529,11 @@ "Filter loaded objects": "Filter loaded objects", "Loaded {count} objects": "Loaded {count} objects", "Filtering and sorting apply to loaded objects": "Filtering and sorting apply to loaded objects", + "Loaded objects only": "로드된 객체만", + "Load next objects": "다음 객체 로드", + "All objects loaded": "모든 객체 로드됨", + "Failed to load more objects. Loaded objects remain available.": "추가 객체를 로드하지 못했습니다. 로드된 객체는 계속 사용할 수 있습니다.", + "Retry": "다시 시도", "Loading more objects": "Loading more objects", "Scroll to load more objects": "Scroll to load more objects", "Back to top": "Back to top", diff --git a/i18n/locales/pt-BR.json b/i18n/locales/pt-BR.json index d7c6840..dc9b7c0 100644 --- a/i18n/locales/pt-BR.json +++ b/i18n/locales/pt-BR.json @@ -1529,6 +1529,11 @@ "Filter loaded objects": "Filter loaded objects", "Loaded {count} objects": "Loaded {count} objects", "Filtering and sorting apply to loaded objects": "Filtering and sorting apply to loaded objects", + "Loaded objects only": "Apenas objetos carregados", + "Load next objects": "Carregar próximos objetos", + "All objects loaded": "Todos os objetos carregados", + "Failed to load more objects. Loaded objects remain available.": "Falha ao carregar mais objetos. Os objetos carregados continuam disponíveis.", + "Retry": "Tentar novamente", "Loading more objects": "Loading more objects", "Scroll to load more objects": "Scroll to load more objects", "Back to top": "Back to top", diff --git a/i18n/locales/ru-RU.json b/i18n/locales/ru-RU.json index 6570ba0..c3d4363 100644 --- a/i18n/locales/ru-RU.json +++ b/i18n/locales/ru-RU.json @@ -1529,6 +1529,11 @@ "Filter loaded objects": "Фильтровать загруженные объекты", "Loaded {count} objects": "Загружено {count} объектов", "Filtering and sorting apply to loaded objects": "Фильтрация и сортировка применяются к загруженным объектам", + "Loaded objects only": "Только загруженные объекты", + "Load next objects": "Загрузить следующие объекты", + "All objects loaded": "Все объекты загружены", + "Failed to load more objects. Loaded objects remain available.": "Не удалось загрузить дополнительные объекты. Загруженные объекты остаются доступными.", + "Retry": "Повторить", "Loading more objects": "Загрузить больше объектов", "Scroll to load more objects": "Прокрутить для загрузки объектов", "Back to top": "Перейти вверх", diff --git a/i18n/locales/tr-TR.json b/i18n/locales/tr-TR.json index be1c26e..021d182 100644 --- a/i18n/locales/tr-TR.json +++ b/i18n/locales/tr-TR.json @@ -1529,6 +1529,11 @@ "Filter loaded objects": "Filter loaded objects", "Loaded {count} objects": "Loaded {count} objects", "Filtering and sorting apply to loaded objects": "Filtering and sorting apply to loaded objects", + "Loaded objects only": "Yalnızca yüklenen nesneler", + "Load next objects": "Sonraki nesneleri yükle", + "All objects loaded": "Tüm nesneler yüklendi", + "Failed to load more objects. Loaded objects remain available.": "Daha fazla nesne yüklenemedi. Yüklenen nesneler kullanılabilir durumda kalır.", + "Retry": "Yeniden dene", "Loading more objects": "Loading more objects", "Scroll to load more objects": "Scroll to load more objects", "Back to top": "Back to top", diff --git a/i18n/locales/vi-VN.json b/i18n/locales/vi-VN.json index d0d8c8e..484ec3b 100644 --- a/i18n/locales/vi-VN.json +++ b/i18n/locales/vi-VN.json @@ -1529,6 +1529,11 @@ "Filter loaded objects": "Filter loaded objects", "Loaded {count} objects": "Loaded {count} objects", "Filtering and sorting apply to loaded objects": "Filtering and sorting apply to loaded objects", + "Loaded objects only": "Chỉ các đối tượng đã tải", + "Load next objects": "Tải các đối tượng tiếp theo", + "All objects loaded": "Đã tải tất cả đối tượng", + "Failed to load more objects. Loaded objects remain available.": "Không thể tải thêm đối tượng. Các đối tượng đã tải vẫn khả dụng.", + "Retry": "Thử lại", "Loading more objects": "Loading more objects", "Scroll to load more objects": "Scroll to load more objects", "Back to top": "Back to top", diff --git a/i18n/locales/zh-CN.json b/i18n/locales/zh-CN.json index 8488af2..a80cb57 100644 --- a/i18n/locales/zh-CN.json +++ b/i18n/locales/zh-CN.json @@ -1529,6 +1529,11 @@ "Filter loaded objects": "筛选已加载对象", "Loaded {count} objects": "已加载 {count} 个对象", "Filtering and sorting apply to loaded objects": "筛选和排序作用于已加载对象", + "Loaded objects only": "仅已加载对象", + "Load next objects": "加载下一批对象", + "All objects loaded": "已加载所有对象", + "Failed to load more objects. Loaded objects remain available.": "无法加载更多对象。已加载的对象仍然可用。", + "Retry": "重试", "Loading more objects": "正在加载更多对象", "Scroll to load more objects": "滚动以加载更多对象", "Back to top": "回到顶部", diff --git a/tests/lib/object-list-source.test.js b/tests/lib/object-list-source.test.js index 7c117d4..422bef2 100644 --- a/tests/lib/object-list-source.test.js +++ b/tests/lib/object-list-source.test.js @@ -32,6 +32,18 @@ test("object list lazy loads additional object batches instead of showing a pagi assert.equal(source.includes('t("Next Page")'), false) }) +test("last modified sorting discloses partial results and keeps continuation visible", () => { + const source = fs.readFileSync("components/object/list.tsx", "utf8") + + assert.match(source, /\{nextToken \? \(\s+]*>\{t\("Loaded objects only"\)\}/) + assert.match(source, /\{data\.length > 0 \? \(\s+ { const source = fs.readFileSync("components/object/list.tsx", "utf8")