Quellcode durchsuchen

refactor(Documents): Remove ProgressBar component and simplify document loading logic

tags/2.0.0-beta.2
twwu vor 1 Monat
Ursprung
Commit
f64b055d2e

+ 0
- 20
web/app/components/base/progress-bar/index.tsx Datei anzeigen

type ProgressBarProps = {
percent: number
}
const ProgressBar = ({
percent = 0,
}: ProgressBarProps) => {
return (
<div className='flex items-center'>
<div className='mr-2 w-[100px] rounded-lg bg-gray-100'>
<div
className='h-1 rounded-lg bg-[#2970FF]'
style={{ width: `${percent}%` }}
/>
</div>
<div className='text-xs font-medium text-gray-500'>{percent}%</div>
</div>
)
}

export default ProgressBar

+ 6
- 11
web/app/components/datasets/documents/index.tsx Datei anzeigen

} }
}, [debouncedSearchValue, query.keyword, updateQuery]) }, [debouncedSearchValue, query.keyword, updateQuery])


const { data: documentsRes, isFetching: isListLoading } = useDocumentList({
const { data: documentsRes, isLoading: isListLoading } = useDocumentList({
datasetId, datasetId,
query: { query: {
page: currPage + 1, page: currPage + 1,
limit, limit,
keyword: debouncedSearchValue, keyword: debouncedSearchValue,
}, },
refetchInterval: (isDataSourceNotion && timerCanRun) ? 2500 : 0,
refetchInterval: timerCanRun ? 2500 : 0,
}) })


const invalidDocumentList = useInvalidDocumentList(datasetId) const invalidDocumentList = useInvalidDocumentList(datasetId)
}, 5000) }, 5000)
}, []) }, [])


const documentsWithProgress = useMemo(() => {
useEffect(() => {
let completedNum = 0 let completedNum = 0
let percent = 0 let percent = 0
const documentsData = documentsRes?.data?.map((documentItem) => {
documentsRes?.data?.forEach((documentItem) => {
const { indexing_status, completed_segments, total_segments } = documentItem const { indexing_status, completed_segments, total_segments } = documentItem
const isEmbedded = indexing_status === 'completed' || indexing_status === 'paused' || indexing_status === 'error' const isEmbedded = indexing_status === 'completed' || indexing_status === 'paused' || indexing_status === 'error'


percent, percent,
} }
}) })
if (completedNum === documentsRes?.data?.length)
setTimerCanRun(false)
return {
...documentsRes,
data: documentsData,
}
setTimerCanRun(completedNum !== documentsRes?.data?.length)
}, [documentsRes]) }, [documentsRes])
const total = documentsRes?.total || 0 const total = documentsRes?.total || 0


router.push(`/datasets/${datasetId}/documents/create`) router.push(`/datasets/${datasetId}/documents/create`)
} }


const documentsList = isDataSourceNotion ? documentsWithProgress?.data : documentsRes?.data
const documentsList = documentsRes?.data
const [selectedIds, setSelectedIds] = useState<string[]>([]) const [selectedIds, setSelectedIds] = useState<string[]>([])


// Clear selection when search changes to avoid confusion // Clear selection when search changes to avoid confusion

+ 6
- 15
web/app/components/datasets/documents/list.tsx Datei anzeigen

'use client' 'use client'
import type { FC } from 'react' import type { FC } from 'react'
import React, { useCallback, useEffect, useMemo, useState } from 'react'
import React, { useCallback, useMemo, useState } from 'react'
import { useBoolean } from 'ahooks' import { useBoolean } from 'ahooks'
import { ArrowDownIcon } from '@heroicons/react/24/outline' import { ArrowDownIcon } from '@heroicons/react/24/outline'
import { pick, uniq } from 'lodash-es' import { pick, uniq } from 'lodash-es'
import { asyncRunSafe } from '@/utils' import { asyncRunSafe } from '@/utils'
import { formatNumber } from '@/utils/format' import { formatNumber } from '@/utils/format'
import NotionIcon from '@/app/components/base/notion-icon' import NotionIcon from '@/app/components/base/notion-icon'
import ProgressBar from '@/app/components/base/progress-bar'
import type { LegacyDataSourceInfo, LocalFileInfo, OnlineDocumentInfo, OnlineDriveInfo } from '@/models/datasets' import type { LegacyDataSourceInfo, LocalFileInfo, OnlineDocumentInfo, OnlineDriveInfo } from '@/models/datasets'
import { ChunkingMode, DataSourceType, DocumentActionType, type SimpleDocumentDetail } from '@/models/datasets' import { ChunkingMode, DataSourceType, DocumentActionType, type SimpleDocumentDetail } from '@/models/datasets'
import type { CommonResponse } from '@/models/common' import type { CommonResponse } from '@/models/common'
const chunkingMode = datasetConfig?.doc_form const chunkingMode = datasetConfig?.doc_form
const isGeneralMode = chunkingMode !== ChunkingMode.parentChild const isGeneralMode = chunkingMode !== ChunkingMode.parentChild
const isQAMode = chunkingMode === ChunkingMode.qa const isQAMode = chunkingMode === ChunkingMode.qa
const [localDocs, setLocalDocs] = useState<LocalDoc[]>(documents)
const [sortField, setSortField] = useState<'name' | 'word_count' | 'hit_count' | 'created_at' | null>('created_at') const [sortField, setSortField] = useState<'name' | 'word_count' | 'hit_count' | 'created_at' | null>('created_at')
const [sortOrder, setSortOrder] = useState<'asc' | 'desc'>('desc') const [sortOrder, setSortOrder] = useState<'asc' | 'desc'>('desc')


onUpdate, onUpdate,
}) })


useEffect(() => {
const localDocs = useMemo(() => {
let filteredDocs = documents let filteredDocs = documents


if (statusFilter.value !== 'all') { if (statusFilter.value !== 'all') {
) )
} }


if (!sortField) {
setLocalDocs(filteredDocs)
return
}
if (!sortField)
return filteredDocs


const sortedDocs = [...filteredDocs].sort((a, b) => { const sortedDocs = [...filteredDocs].sort((a, b) => {
let aValue: any let aValue: any
} }
}) })


setLocalDocs(sortedDocs)
return sortedDocs
}, [documents, sortField, sortOrder, statusFilter]) }, [documents, sortField, sortOrder, statusFilter])


const handleSort = (field: 'name' | 'word_count' | 'hit_count' | 'created_at') => { const handleSort = (field: 'name' | 'word_count' | 'hit_count' | 'created_at') => {
{formatTime(doc.created_at, t('datasetHitTesting.dateTimeFormat') as string)} {formatTime(doc.created_at, t('datasetHitTesting.dateTimeFormat') as string)}
</td> </td>
<td> <td>
{
(['indexing', 'splitting', 'parsing', 'cleaning'].includes(doc.indexing_status)
&& isOnlineDocument(doc.data_source_type))
? <ProgressBar percent={doc.percent || 0} />
: <StatusItem status={doc.display_status} />
}
<StatusItem status={doc.display_status} />
</td> </td>
<td> <td>
<Operations <Operations

Laden…
Abbrechen
Speichern