From 660e17c4211c9f0179fbe311d959aaec1e266ad2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=A9=AC=E7=99=BB=E5=B1=B1?= Date: Tue, 19 May 2026 13:43:05 +0800 Subject: [PATCH] fix: stabilize object drawer dialogs Fix tag editing, version preview, nested dialog pointer handling, and right drawer height in the object details workflow. Fixes rustfs/rustfs#3006 --- components/object/info.tsx | 48 +++++++++++++++------- components/object/versions.tsx | 2 +- components/tasks/stats-button.tsx | 2 +- components/ui/dialog.tsx | 4 +- components/ui/drawer.tsx | 2 +- tests/lib/dialog-source.test.js | 9 ++++ tests/lib/drawer-source.test.js | 10 +++++ tests/lib/object-info-source.test.js | 27 +++++++++++- tests/lib/task-stats-button-source.test.js | 9 ++++ 9 files changed, 93 insertions(+), 20 deletions(-) create mode 100644 tests/lib/dialog-source.test.js create mode 100644 tests/lib/drawer-source.test.js create mode 100644 tests/lib/task-stats-button-source.test.js diff --git a/components/object/info.tsx b/components/object/info.tsx index 20061ed2..e8e18d00 100644 --- a/components/object/info.tsx +++ b/components/object/info.tsx @@ -292,6 +292,7 @@ export function ObjectInfo({ bucketName, objectKey, open, onOpenChange, onPrevie ), ]) const data = { ...head, SignedUrl: signed } + setShowVersions(false) onPreview({ key, data }) } catch (err) { message.error((err as Error)?.message ?? t("Failed to fetch versions")) @@ -326,16 +327,24 @@ export function ObjectInfo({ bucketName, objectKey, open, onOpenChange, onPrevie } } - const submitTagForm = async (e?: React.FormEvent | React.MouseEvent) => { - e?.preventDefault() - if (!canEditObjectTags || !object?.Key) return - if (!tagFormValue.Key || !tagFormValue.Value) { + const submitTagForm = async () => { + if (!canEditObjectTags) return + if (!resolvedObjectKey) { + message.error(t("Failed to fetch object info")) + return + } + + const nextTag = { + Key: tagFormValue.Key.trim(), + Value: tagFormValue.Value.trim(), + } + if (!nextTag.Key || !nextTag.Value) { message.error(t("Please fill in the correct format")) return } try { - const nextTags = [...tags, { ...tagFormValue }] - await objectApi.putObjectTags(object.Key as string, nextTags) + const nextTags = [...tags, nextTag] + await objectApi.putObjectTags(resolvedObjectKey, nextTags) setTags(nextTags) setTagFormValue({ Key: "", Value: "" }) message.success(t("Create Success")) @@ -355,10 +364,10 @@ export function ObjectInfo({ bucketName, objectKey, open, onOpenChange, onPrevie } const removeTag = async (tagKey: string) => { - if (!canEditObjectTags || !object?.Key) return + if (!canEditObjectTags || !resolvedObjectKey) return try { const nextTags = tags.filter((tag) => tag.Key !== tagKey) - await objectApi.putObjectTags(object.Key as string, nextTags) + await objectApi.putObjectTags(resolvedObjectKey, nextTags) setTags(nextTags) message.success(t("Delete Success")) } catch (err) { @@ -426,8 +435,8 @@ export function ObjectInfo({ bucketName, objectKey, open, onOpenChange, onPrevie return ( <> - !showRetentionView && onOpenChange(nextOpen)} direction="right"> - + + {t("Object Details")} @@ -635,7 +644,7 @@ export function ObjectInfo({ bucketName, objectKey, open, onOpenChange, onPrevie - + {t("Set Tags")} @@ -657,7 +666,13 @@ export function ObjectInfo({ bucketName, objectKey, open, onOpenChange, onPrevie ))} -
+ { + e.preventDefault() + void submitTagForm() + }} + >
{t("Tag Key")} @@ -688,7 +703,12 @@ export function ObjectInfo({ bucketName, objectKey, open, onOpenChange, onPrevie
-
@@ -697,7 +717,7 @@ export function ObjectInfo({ bucketName, objectKey, open, onOpenChange, onPrevie
- +
diff --git a/components/object/versions.tsx b/components/object/versions.tsx index db00a9e5..6bf7b434 100644 --- a/components/object/versions.tsx +++ b/components/object/versions.tsx @@ -214,7 +214,7 @@ export function ObjectVersions({ }) return ( - !open && onClose()}> + !open && onClose()} disablePointerDismissal> {t("Object Versions")} diff --git a/components/tasks/stats-button.tsx b/components/tasks/stats-button.tsx index d69700de..a35c37be 100644 --- a/components/tasks/stats-button.tsx +++ b/components/tasks/stats-button.tsx @@ -24,7 +24,7 @@ export function TaskStatsButton() { return ( - +