fix(web): remove document revision selector

This commit is contained in:
Stephen Zhou 2026-08-17 23:20:46 +08:00
parent 608d5bbd92
commit cd605abd5e
No known key found for this signature in database
3 changed files with 4 additions and 165 deletions

View File

@ -1882,22 +1882,7 @@ describe('DocumentDetailPage', () => {
expect(chunksQuery.refetch).toHaveBeenCalledOnce()
})
it('loads older revisions and always includes the active revision in the selector', async () => {
const user = userEvent.setup()
revisionsQuery.data = { pages: [{ items: [activeRevision({ revision: 2 })] }] }
revisionsQuery.hasNextPage = true
render(<DocumentDetailPage documentId="document-1" knowledgeSpaceId="space-1" />)
await user.click(
screen.getByRole('combobox', { name: 'dataset.newKnowledge.documentRevision' }),
)
expect(await screen.findByRole('option', { name: /v3/ })).toBeInTheDocument()
await user.click(screen.getByRole('button', { name: 'dataset.newKnowledge.loadMoreRevisions' }))
expect(revisionsQuery.fetchNextPage).toHaveBeenCalledOnce()
})
it('restores the selected revision from the URL', () => {
it('uses a revision from the URL without exposing revision controls', () => {
revisionsQuery.data = {
pages: [{ items: [activeRevision({ revision: 2, state: 'superseded' })] }],
}
@ -1907,8 +1892,8 @@ describe('DocumentDetailPage', () => {
})
expect(
screen.getByRole('combobox', { name: 'dataset.newKnowledge.documentRevision' }),
).toHaveTextContent('v2')
screen.queryByRole('combobox', { name: 'dataset.newKnowledge.documentRevision' }),
).not.toBeInTheDocument()
expect(infiniteInput(chunksOptions.mock.lastCall?.[0])(null)).toEqual({
params: {
control_space_id: 'space-1',
@ -1919,62 +1904,6 @@ describe('DocumentDetailPage', () => {
})
})
it('writes revision selection to browser history', async () => {
const user = userEvent.setup()
revisionsQuery.data = {
pages: [{ items: [activeRevision({ revision: 2, state: 'superseded' })] }],
}
const { onUrlUpdate } = render(
<DocumentDetailPage documentId="document-1" knowledgeSpaceId="space-1" />,
)
await user.click(
screen.getByRole('combobox', { name: 'dataset.newKnowledge.documentRevision' }),
)
await user.click(await screen.findByRole('option', { name: /v2/ }))
await waitFor(() => {
const urlUpdate = onUrlUpdate.mock.calls.at(-1)?.[0]
expect(urlUpdate?.searchParams.get('revision')).toBe('2')
expect(urlUpdate?.options.history).toBe('push')
})
})
it('announces revision cursor errors and restores focus when the final page loads', async () => {
const user = userEvent.setup()
revisionsQuery.hasNextPage = true
const rendered = render(
<DocumentDetailPage documentId="document-1" knowledgeSpaceId="space-1" />,
)
const loadMore = screen.getByRole('button', {
name: 'dataset.newKnowledge.loadMoreRevisions',
})
await user.click(loadMore)
revisionsQuery.isFetchingNextPage = true
rendered.rerender(<DocumentDetailPage documentId="document-1" knowledgeSpaceId="space-1" />)
revisionsQuery.isFetchingNextPage = false
revisionsQuery.isFetchNextPageError = true
rendered.rerender(<DocumentDetailPage documentId="document-1" knowledgeSpaceId="space-1" />)
expect(screen.getByRole('alert')).toHaveTextContent(
'dataset.newKnowledge.documentRevisionsLoadError',
)
expect(screen.getByRole('button', { name: 'common.operation.retry' })).toHaveFocus()
await user.click(screen.getByRole('button', { name: 'common.operation.retry' }))
revisionsQuery.isFetchingNextPage = true
revisionsQuery.isFetchNextPageError = false
rendered.rerender(<DocumentDetailPage documentId="document-1" knowledgeSpaceId="space-1" />)
revisionsQuery.isFetchingNextPage = false
revisionsQuery.hasNextPage = false
rendered.rerender(<DocumentDetailPage documentId="document-1" knowledgeSpaceId="space-1" />)
await waitFor(() =>
expect(
screen.getByRole('combobox', { name: 'dataset.newKnowledge.documentRevision' }),
).toHaveFocus(),
)
})
it('finds a document task on later cursor pages and ignores stale revision tasks', async () => {
tasksQuery.data = {
pages: [{ items: [task({ documentId: 'another-document', id: 'another-task' })] }],

View File

@ -1,16 +1,6 @@
import type { RefObject } from 'react'
import type { LogicalDocument, LogicalDocumentRevision } from './document-models'
import type { LogicalDocument } from './document-models'
import { Button } from '@langgenius/dify-ui/button'
import {
Select,
SelectContent,
SelectItem,
SelectItemIndicator,
SelectItemText,
SelectLabel,
SelectTrigger,
} from '@langgenius/dify-ui/select'
import { useEffect, useRef } from 'react'
import { useTranslation } from 'react-i18next'
import Link from '@/next/link'
@ -19,59 +9,29 @@ export function DocumentDetailHeader({
canCancelReindex,
cancelReindexBusy,
document,
effectiveRevision,
fetchNextRevisionPage,
hasNextRevisionPage,
isFetchNextRevisionPageError,
isFetchingNextRevisionPage,
onCancelReindex,
onReindex,
onRevisionChange,
reindexDisabled,
reindexDisabledReasonId,
reindexFailed,
reindexInProgress,
reindexing,
revisions,
titleRef,
}: {
backPath: string
canCancelReindex: boolean
cancelReindexBusy: boolean
document: LogicalDocument
effectiveRevision?: number
fetchNextRevisionPage: () => void
hasNextRevisionPage: boolean
isFetchNextRevisionPageError: boolean
isFetchingNextRevisionPage: boolean
onCancelReindex: () => void
onReindex: () => void
onRevisionChange: (revision: number) => void
reindexDisabled: boolean
reindexDisabledReasonId?: string
reindexFailed: boolean
reindexInProgress: boolean
reindexing: boolean
revisions: Array<Exclude<LogicalDocumentRevision, null>>
titleRef: RefObject<HTMLHeadingElement | null>
}) {
const { t } = useTranslation('dataset')
const { t: tCommon } = useTranslation('common')
const revisionTriggerRef = useRef<HTMLButtonElement>(null)
const loadMoreRequestedRef = useRef(false)
const wasFetchingNextPageRef = useRef(false)
useEffect(() => {
if (isFetchingNextRevisionPage) wasFetchingNextPageRef.current = true
if (
isFetchingNextRevisionPage ||
!wasFetchingNextPageRef.current ||
!loadMoreRequestedRef.current
)
return
wasFetchingNextPageRef.current = false
loadMoreRequestedRef.current = false
if (!isFetchNextRevisionPageError && !hasNextRevisionPage) revisionTriggerRef.current?.focus()
}, [hasNextRevisionPage, isFetchNextRevisionPageError, isFetchingNextRevisionPage])
return (
<>
@ -93,44 +53,6 @@ export function DocumentDetailHeader({
</h1>
</div>
<div className="flex flex-wrap items-center gap-2">
{revisions.length > 0 && effectiveRevision !== undefined && (
<Select
value={String(effectiveRevision)}
onValueChange={(value) => {
if (value) onRevisionChange(Number(value))
}}
>
<SelectLabel>{t(($) => $['newKnowledge.documentRevision'])}</SelectLabel>
<SelectTrigger ref={revisionTriggerRef} className="h-8 w-fit min-w-28">
v{effectiveRevision}
</SelectTrigger>
<SelectContent>
{revisions.map((revision) => (
<SelectItem key={revision.revision} value={String(revision.revision)}>
<SelectItemText>
v{revision.revision} ·{' '}
{t(($) => $[`newKnowledge.revisionState.${revision.state}`])}
</SelectItemText>
<SelectItemIndicator />
</SelectItem>
))}
</SelectContent>
</Select>
)}
{(hasNextRevisionPage || isFetchNextRevisionPageError) && (
<Button
disabled={isFetchingNextRevisionPage}
loading={isFetchingNextRevisionPage}
onClick={() => {
loadMoreRequestedRef.current = true
fetchNextRevisionPage()
}}
>
{isFetchNextRevisionPageError
? tCommon(($) => $['operation.retry'])
: t(($) => $['newKnowledge.loadMoreRevisions'])}
</Button>
)}
<Button
aria-busy={reindexing || cancelReindexBusy}
aria-describedby={reindexDisabledReasonId}
@ -150,11 +72,6 @@ export function DocumentDetailHeader({
</Button>
</div>
</div>
{isFetchNextRevisionPageError && (
<p className="mt-2 system-xs-regular text-text-destructive" role="alert">
{t(($) => $['newKnowledge.documentRevisionsLoadError'])}
</p>
)}
</>
)
}

View File

@ -275,14 +275,8 @@ export function DocumentDetailPage({
canCancelReindex={canCancelReindex}
cancelReindexBusy={cancelReindexBusy}
document={document}
effectiveRevision={effectiveRevision}
fetchNextRevisionPage={() => void revisionsQuery.fetchNextPage()}
hasNextRevisionPage={revisionsQuery.hasNextPage}
isFetchNextRevisionPageError={revisionsQuery.isFetchNextPageError}
isFetchingNextRevisionPage={revisionsQuery.isFetchingNextPage}
onCancelReindex={() => void cancelReindex()}
onReindex={() => void reindex()}
onRevisionChange={(revision) => void setDocumentLocation({ chunk: null, revision })}
reindexDisabled={
!canEdit ||
reindexBusy ||
@ -300,7 +294,6 @@ export function DocumentDetailPage({
reindexFailed={latestTask?.state === 'failed'}
reindexInProgress={reindexInProgress}
reindexing={reindexBusy || submissionPending}
revisions={availableRevisions}
titleRef={titleRef}
/>
{!hasEditPermission && (