fix: disabled version bucket object delete do not display check delete all version

This commit is contained in:
cxymds
2026-04-08 21:49:08 +08:00
parent 6c914dd0b9
commit b17505adf7
3 changed files with 68 additions and 6 deletions
+25 -6
View File
@@ -39,6 +39,12 @@ import { exportFile } from "@/lib/export-file"
import { getContentType } from "@/lib/mime-types"
import { formatBytes } from "@/lib/functions"
import { buildBucketPath } from "@/lib/bucket-path"
import {
resolveBucketVersioningState,
shouldForceDeleteObjects,
shouldShowDeleteAllVersions,
type BucketVersioningState,
} from "@/lib/object-delete"
import { TaskStatsButton } from "@/components/tasks/stats-button"
import { useAddDeleteKeys, useAddDeleteFolder, useTasks } from "@/contexts/task-context"
import type { ColumnDef } from "@tanstack/react-table"
@@ -92,7 +98,7 @@ export function ObjectList({
const [continuationToken, setContinuationToken] = React.useState<string | undefined>()
const [tokenHistory, setTokenHistory] = React.useState<string[]>([])
const [nextToken, setNextToken] = React.useState<string | undefined>()
const [bucketVersioningEnabled, setBucketVersioningEnabled] = React.useState(false)
const [bucketVersioningState, setBucketVersioningState] = React.useState<BucketVersioningState>("unknown")
const [deleteDialogOpen, setDeleteDialogOpen] = React.useState(false)
const [deleteDialogKeys, setDeleteDialogKeys] = React.useState<string[]>([])
const [deleteAllVersions, setDeleteAllVersions] = React.useState(false)
@@ -177,15 +183,28 @@ export function ObjectList({
}, [tasks, fetchObjects])
React.useEffect(() => {
let cancelled = false
const loadBucketVersioningStatus = async () => {
setBucketVersioningState("unknown")
try {
const resp = await getBucketVersioning(bucket)
setBucketVersioningEnabled((resp as { Status?: string })?.Status === "Enabled")
if (!cancelled) {
setBucketVersioningState(resolveBucketVersioningState((resp as { Status?: string })?.Status))
}
} catch {
setBucketVersioningEnabled(false)
if (!cancelled) {
setBucketVersioningState("disabled")
}
}
}
loadBucketVersioningStatus()
void loadBucketVersioningStatus()
return () => {
cancelled = true
}
}, [bucket, getBucketVersioning])
React.useEffect(() => {
@@ -436,7 +455,7 @@ export function ObjectList({
setDeleteDialogOpen(false)
if (!keys.length) return
if ((bucketVersioningEnabled && deleteAllVersions) || !bucketVersioningEnabled) {
if (shouldForceDeleteObjects(bucketVersioningState, deleteAllVersions)) {
await handleDeleteAllVersions(keys)
} else {
await handleDelete(keys)
@@ -603,7 +622,7 @@ export function ObjectList({
<AlertDialogTitle>{t("Warning")}</AlertDialogTitle>
<AlertDialogDescription>
{t("Are you sure you want to delete the selected objects?")}
{bucketVersioningEnabled && (
{shouldShowDeleteAllVersions(bucketVersioningState) && (
<label className="mt-4 flex items-center gap-2">
<Checkbox checked={deleteAllVersions} onCheckedChange={(v) => setDeleteAllVersions(v === true)} />
<span>{t("Delete All Versions")}</span>
+17
View File
@@ -0,0 +1,17 @@
export type BucketVersioningState = "unknown" | "enabled" | "disabled"
export function resolveBucketVersioningState(status?: string | null): BucketVersioningState {
return status === "Enabled" ? "enabled" : "disabled"
}
export function shouldShowDeleteAllVersions(state: BucketVersioningState): boolean {
return state === "enabled"
}
export function shouldForceDeleteObjects(state: BucketVersioningState, deleteAllVersions: boolean): boolean {
if (state === "enabled") {
return deleteAllVersions
}
return true
}
+26
View File
@@ -0,0 +1,26 @@
import test from "node:test"
import assert from "node:assert/strict"
import {
resolveBucketVersioningState,
shouldForceDeleteObjects,
shouldShowDeleteAllVersions,
} from "../../lib/object-delete"
test("resolveBucketVersioningState maps enabled status correctly", () => {
assert.equal(resolveBucketVersioningState("Enabled"), "enabled")
assert.equal(resolveBucketVersioningState("Suspended"), "disabled")
assert.equal(resolveBucketVersioningState(undefined), "disabled")
})
test("shouldShowDeleteAllVersions only shows the option for enabled buckets", () => {
assert.equal(shouldShowDeleteAllVersions("enabled"), true)
assert.equal(shouldShowDeleteAllVersions("disabled"), false)
assert.equal(shouldShowDeleteAllVersions("unknown"), false)
})
test("shouldForceDeleteObjects keeps existing delete behavior outside enabled buckets", () => {
assert.equal(shouldForceDeleteObjects("enabled", true), true)
assert.equal(shouldForceDeleteObjects("enabled", false), false)
assert.equal(shouldForceDeleteObjects("disabled", false), true)
assert.equal(shouldForceDeleteObjects("unknown", false), true)
})