balibabu
Feat: If there is no result in the recall test, an empty data image will be displayed. #4182 (#4183)
c34c86c
| import { ReactComponent as SelectedFilesCollapseIcon } from '@/assets/svg/selected-files-collapse.svg'; | |
| import Image from '@/components/image'; | |
| import { useTranslate } from '@/hooks/common-hooks'; | |
| import { ITestingChunk } from '@/interfaces/database/knowledge'; | |
| import { | |
| Card, | |
| Collapse, | |
| Empty, | |
| Flex, | |
| Pagination, | |
| PaginationProps, | |
| Popover, | |
| Space, | |
| } from 'antd'; | |
| import camelCase from 'lodash/camelCase'; | |
| import SelectFiles from './select-files'; | |
| import { | |
| useSelectIsTestingSuccess, | |
| useSelectTestingResult, | |
| } from '@/hooks/knowledge-hooks'; | |
| import { useGetPaginationWithRouter } from '@/hooks/logic-hooks'; | |
| import { useCallback, useState } from 'react'; | |
| import styles from './index.less'; | |
| const similarityList: Array<{ field: keyof ITestingChunk; label: string }> = [ | |
| { field: 'similarity', label: 'Hybrid Similarity' }, | |
| { field: 'term_similarity', label: 'Term Similarity' }, | |
| { field: 'vector_similarity', label: 'Vector Similarity' }, | |
| ]; | |
| const ChunkTitle = ({ item }: { item: ITestingChunk }) => { | |
| const { t } = useTranslate('knowledgeDetails'); | |
| return ( | |
| <Flex gap={10}> | |
| {similarityList.map((x) => ( | |
| <Space key={x.field}> | |
| <span className={styles.similarityCircle}> | |
| {((item[x.field] as number) * 100).toFixed(2)} | |
| </span> | |
| <span className={styles.similarityText}>{t(camelCase(x.field))}</span> | |
| </Space> | |
| ))} | |
| </Flex> | |
| ); | |
| }; | |
| interface IProps { | |
| handleTesting: (documentIds?: string[]) => Promise<any>; | |
| } | |
| const TestingResult = ({ handleTesting }: IProps) => { | |
| const [selectedDocumentIds, setSelectedDocumentIds] = useState<string[]>([]); | |
| const { documents, chunks, total } = useSelectTestingResult(); | |
| const { t } = useTranslate('knowledgeDetails'); | |
| const { pagination, setPagination } = useGetPaginationWithRouter(); | |
| const isSuccess = useSelectIsTestingSuccess(); | |
| const onChange: PaginationProps['onChange'] = (pageNumber, pageSize) => { | |
| pagination.onChange?.(pageNumber, pageSize); | |
| handleTesting(selectedDocumentIds); | |
| }; | |
| const onTesting = useCallback( | |
| (ids: string[]) => { | |
| setPagination({ page: 1 }); | |
| handleTesting(ids); | |
| }, | |
| [setPagination, handleTesting], | |
| ); | |
| return ( | |
| <section className={styles.testingResultWrapper}> | |
| <Collapse | |
| expandIcon={() => ( | |
| <SelectedFilesCollapseIcon></SelectedFilesCollapseIcon> | |
| )} | |
| className={styles.selectFilesCollapse} | |
| items={[ | |
| { | |
| key: '1', | |
| label: ( | |
| <Flex | |
| justify={'space-between'} | |
| align="center" | |
| className={styles.selectFilesTitle} | |
| > | |
| <Space> | |
| <span> | |
| {selectedDocumentIds?.length ?? 0}/{documents?.length ?? 0} | |
| </span> | |
| {t('filesSelected')} | |
| </Space> | |
| </Flex> | |
| ), | |
| children: ( | |
| <div> | |
| <SelectFiles | |
| setSelectedDocumentIds={setSelectedDocumentIds} | |
| handleTesting={onTesting} | |
| ></SelectFiles> | |
| </div> | |
| ), | |
| }, | |
| ]} | |
| /> | |
| <Flex | |
| gap={'large'} | |
| vertical | |
| flex={1} | |
| className={styles.selectFilesCollapse} | |
| > | |
| {isSuccess && chunks.length > 0 ? ( | |
| chunks?.map((x) => ( | |
| <Card key={x.chunk_id} title={<ChunkTitle item={x}></ChunkTitle>}> | |
| <Flex gap={'middle'}> | |
| {x.img_id && ( | |
| <Popover | |
| placement="left" | |
| content={ | |
| <Image | |
| id={x.img_id} | |
| className={styles.imagePreview} | |
| ></Image> | |
| } | |
| > | |
| <Image id={x.img_id} className={styles.image}></Image> | |
| </Popover> | |
| )} | |
| <div>{x.content_with_weight}</div> | |
| </Flex> | |
| </Card> | |
| )) | |
| ) : isSuccess && chunks.length === 0 ? ( | |
| <Empty></Empty> | |
| ) : null} | |
| </Flex> | |
| <Pagination | |
| {...pagination} | |
| size={'small'} | |
| total={total} | |
| onChange={onChange} | |
| /> | |
| </section> | |
| ); | |
| }; | |
| export default TestingResult; | |