mirror of
https://github.com/langgenius/dify.git
synced 2026-09-05 00:31:19 +08:00
fix(web): remove document revision selector
This commit is contained in:
parent
608d5bbd92
commit
cd605abd5e
@ -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' })] }],
|
||||
|
||||
@ -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>
|
||||
)}
|
||||
</>
|
||||
)
|
||||
}
|
||||
|
||||
@ -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 && (
|
||||
|
||||
Loading…
Reference in New Issue
Block a user