| | |
| | | import { createContext, useContext, useContextSelector } from 'use-context-selector' |
| | | import { useTranslation } from 'react-i18next' |
| | | import { useRouter } from 'next/navigation' |
| | | import { RiArrowLeftLine, RiLayoutLeft2Line, RiLayoutRight2Line } from '@remixicon/react' |
| | | import { RiArrowLeftLine, RiLayoutRight2Line } from '@remixicon/react' |
| | | import { OperationAction, StatusItem } from '../list' |
| | | import DocumentPicker from '../../common/document-picker' |
| | | import Completed from './completed' |
| | | import Embedding from './embedding' |
| | | import Metadata from '@/app/components/datasets/metadata/metadata-document' |
| | | import Metadata from './metadata' |
| | | import SegmentAdd, { ProcessStatus } from './segment-add' |
| | | import BatchModal from './batch-modal' |
| | | import style from './style.module.css' |
| | |
| | | import { useDatasetDetailContext } from '@/context/dataset-detail' |
| | | import FloatRightContainer from '@/app/components/base/float-right-container' |
| | | import useBreakpoints, { MediaType } from '@/hooks/use-breakpoints' |
| | | import { LayoutRight2LineMod } from '@/app/components/base/icons/src/public/knowledge' |
| | | import { useCheckSegmentBatchImportProgress, useChildSegmentListKey, useSegmentBatchImport, useSegmentListKey } from '@/service/knowledge/use-segment' |
| | | import { useDocumentDetail, useDocumentMetadata, useInvalidDocumentList } from '@/service/knowledge/use-document' |
| | | import { useDocumentDetail, useDocumentMetadata } from '@/service/knowledge/use-document' |
| | | import { useInvalid } from '@/service/use-base' |
| | | |
| | | type DocumentContextValue = { |
| | |
| | | export const DocumentTitle: FC<DocumentTitleProps> = ({ datasetId, extension, name, processMode, parent_mode, wrapperCls }) => { |
| | | const router = useRouter() |
| | | return ( |
| | | <div className={cn('flex flex-1 items-center justify-start', wrapperCls)}> |
| | | <div className={cn('flex items-center justify-start flex-1', wrapperCls)}> |
| | | <DocumentPicker |
| | | datasetId={datasetId} |
| | | value={{ |
| | |
| | | params: { metadata: 'without' }, |
| | | }) |
| | | |
| | | const { data: documentMetadata } = useDocumentMetadata({ |
| | | const { data: documentMetadata, error: metadataErr, refetch: metadataMutate } = useDocumentMetadata({ |
| | | datasetId, |
| | | documentId, |
| | | params: { metadata: 'only' }, |
| | |
| | | } |
| | | |
| | | const isDetailLoading = !documentDetail && !error |
| | | const isMetadataLoading = !documentMetadata && !metadataErr |
| | | |
| | | const embedding = ['queuing', 'indexing', 'paused'].includes((documentDetail?.display_status || '').toLowerCase()) |
| | | |
| | | const invalidChunkList = useInvalid(useSegmentListKey) |
| | | const invalidChildChunkList = useInvalid(useChildSegmentListKey) |
| | | const invalidDocumentList = useInvalidDocumentList(datasetId) |
| | | |
| | | const handleOperate = (operateName?: string) => { |
| | | invalidDocumentList() |
| | | if (operateName === 'delete') { |
| | | backToPrev() |
| | | } |
| | | else { |
| | | detailMutate() |
| | | // If operation is not rename, refresh the chunk list after 5 seconds |
| | | if (operateName) { |
| | | setTimeout(() => { |
| | | invalidChunkList() |
| | | invalidChildChunkList() |
| | | }, 5000) |
| | | } |
| | | setTimeout(() => { |
| | | invalidChunkList() |
| | | invalidChildChunkList() |
| | | }, 5000) |
| | | } |
| | | } |
| | | |
| | |
| | | mode, |
| | | parentMode, |
| | | }}> |
| | | <div className='flex h-full flex-col bg-background-default'> |
| | | <div className='flex min-h-16 flex-wrap items-center justify-between border-b border-b-divider-subtle py-2.5 pl-3 pr-4'> |
| | | <div onClick={backToPrev} className={'flex h-8 w-8 shrink-0 cursor-pointer items-center justify-center rounded-full hover:bg-components-button-tertiary-bg'}> |
| | | <RiArrowLeftLine className='h-4 w-4 text-components-button-ghost-text hover:text-text-tertiary' /> |
| | | <div className='flex flex-col h-full bg-background-default'> |
| | | <div className='flex items-center justify-between flex-wrap min-h-16 pl-3 pr-4 py-2.5 border-b border-b-divider-subtle'> |
| | | <div onClick={backToPrev} className={'shrink-0 rounded-full w-8 h-8 flex justify-center items-center cursor-pointer hover:bg-components-button-tertiary-bg'}> |
| | | <RiArrowLeftLine className='text-components-button-ghost-text hover:text-text-tertiary w-4 h-4' /> |
| | | </div> |
| | | <DocumentTitle |
| | | datasetId={datasetId} |
| | |
| | | parent_mode={parentMode} |
| | | processMode={mode} |
| | | /> |
| | | <div className='flex flex-wrap items-center'> |
| | | <div className='flex items-center flex-wrap'> |
| | | {embeddingAvailable && documentDetail && !documentDetail.archived && !isFullDocMode && ( |
| | | <> |
| | | <SegmentAdd |
| | |
| | | showBatchModal={showBatchModal} |
| | | embedding={embedding} |
| | | /> |
| | | <Divider type='vertical' className='!mx-3 !h-[14px] !bg-divider-regular' /> |
| | | <Divider type='vertical' className='!bg-divider-regular !h-[14px] !mx-3' /> |
| | | </> |
| | | )} |
| | | <StatusItem |
| | |
| | | > |
| | | { |
| | | showMetadata |
| | | ? <RiLayoutLeft2Line className='h-4 w-4 text-components-button-secondary-text' /> |
| | | : <RiLayoutRight2Line className='h-4 w-4 text-components-button-secondary-text' /> |
| | | ? <LayoutRight2LineMod className='w-4 h-4 text-components-button-secondary-text' /> |
| | | : <RiLayoutRight2Line className='w-4 h-4 text-components-button-secondary-text' /> |
| | | } |
| | | </button> |
| | | </div> |
| | | </div> |
| | | <div className='flex flex-1 flex-row' style={{ height: 'calc(100% - 4rem)' }}> |
| | | <div className='flex flex-row flex-1' style={{ height: 'calc(100% - 4rem)' }}> |
| | | {isDetailLoading |
| | | ? <Loading type='app' /> |
| | | : <div className={cn('flex h-full min-w-0 grow flex-col', |
| | | embedding ? '' : isFullDocMode ? 'relative pl-11 pr-11 pt-4' : 'relative pl-5 pr-11 pt-3', |
| | | : <div className={cn('h-full grow min-w-0 flex flex-col', |
| | | embedding ? '' : isFullDocMode ? 'relative pt-4 pr-11 pl-11' : 'relative pt-3 pr-11 pl-5', |
| | | )}> |
| | | {embedding |
| | | ? <Embedding |
| | |
| | | } |
| | | </div> |
| | | } |
| | | <FloatRightContainer showClose isOpen={showMetadata} onClose={() => setShowMetadata(false)} isMobile={isMobile} panelClassName='!justify-start' footer={null}> |
| | | <FloatRightContainer showClose isOpen={showMetadata} onClose={() => setShowMetadata(false)} isMobile={isMobile} panelClassname='!justify-start' footer={null}> |
| | | <Metadata |
| | | className='mr-2 mt-3' |
| | | datasetId={datasetId} |
| | | documentId={documentId} |
| | | docDetail={{ ...documentDetail, ...documentMetadata, doc_type: documentMetadata?.doc_type === 'others' ? '' : documentMetadata?.doc_type } as any} |
| | | loading={isMetadataLoading} |
| | | onUpdate={metadataMutate} |
| | | /> |
| | | </FloatRightContainer> |
| | | </div> |