mirror of
https://github.com/infiniflow/ragflow.git
synced 2025-12-08 20:42:30 +08:00
### What problem does this PR solve? https://github.com/infiniflow/ragflow/issues/6984 1. Markdown parser supports get pictures 2. For Native, when handling Markdown, it will handle images 3. improve merge and ### Type of change - [x] New Feature (non-breaking change which adds functionality) --------- Co-authored-by: Kevin Hu <kevinhu.sh@gmail.com>
102 lines
2.7 KiB
TypeScript
102 lines
2.7 KiB
TypeScript
import Image from '@/components/image';
|
|
import { IChunk } from '@/interfaces/database/knowledge';
|
|
import { Card, Checkbox, CheckboxProps, Flex, Popover, Switch } from 'antd';
|
|
import classNames from 'classnames';
|
|
import DOMPurify from 'dompurify';
|
|
import { useEffect, useState } from 'react';
|
|
|
|
import { useTheme } from '@/components/theme-provider';
|
|
import { ChunkTextMode } from '../../constant';
|
|
import styles from './index.less';
|
|
|
|
interface IProps {
|
|
item: IChunk;
|
|
checked: boolean;
|
|
switchChunk: (available?: number, chunkIds?: string[]) => void;
|
|
editChunk: (chunkId: string) => void;
|
|
handleCheckboxClick: (chunkId: string, checked: boolean) => void;
|
|
selected: boolean;
|
|
clickChunkCard: (chunkId: string) => void;
|
|
textMode: ChunkTextMode;
|
|
}
|
|
|
|
const ChunkCard = ({
|
|
item,
|
|
checked,
|
|
handleCheckboxClick,
|
|
editChunk,
|
|
switchChunk,
|
|
selected,
|
|
clickChunkCard,
|
|
textMode,
|
|
}: IProps) => {
|
|
const available = Number(item.available_int);
|
|
const [enabled, setEnabled] = useState(false);
|
|
const { theme } = useTheme();
|
|
|
|
const onChange = (checked: boolean) => {
|
|
setEnabled(checked);
|
|
switchChunk(available === 0 ? 1 : 0, [item.chunk_id]);
|
|
};
|
|
|
|
const handleCheck: CheckboxProps['onChange'] = (e) => {
|
|
handleCheckboxClick(item.chunk_id, e.target.checked);
|
|
};
|
|
|
|
const handleContentDoubleClick = () => {
|
|
editChunk(item.chunk_id);
|
|
};
|
|
|
|
const handleContentClick = () => {
|
|
clickChunkCard(item.chunk_id);
|
|
};
|
|
|
|
useEffect(() => {
|
|
setEnabled(available === 1);
|
|
}, [available]);
|
|
|
|
return (
|
|
<Card
|
|
className={classNames(styles.chunkCard, {
|
|
[`${theme === 'dark' ? styles.cardSelectedDark : styles.cardSelected}`]:
|
|
selected,
|
|
})}
|
|
>
|
|
<Flex gap={'middle'} justify={'space-between'}>
|
|
<Checkbox onChange={handleCheck} checked={checked}></Checkbox>
|
|
{item.image_id && (
|
|
<Popover
|
|
placement="right"
|
|
content={
|
|
<Image id={item.image_id} className={styles.imagePreview}></Image>
|
|
}
|
|
>
|
|
<Image id={item.image_id} className={styles.image}></Image>
|
|
</Popover>
|
|
)}
|
|
|
|
<section
|
|
onDoubleClick={handleContentDoubleClick}
|
|
onClick={handleContentClick}
|
|
className={styles.content}
|
|
>
|
|
<div
|
|
dangerouslySetInnerHTML={{
|
|
__html: DOMPurify.sanitize(item.content_with_weight),
|
|
}}
|
|
className={classNames(styles.contentText, {
|
|
[styles.contentEllipsis]: textMode === ChunkTextMode.Ellipse,
|
|
})}
|
|
></div>
|
|
</section>
|
|
|
|
<div>
|
|
<Switch checked={enabled} onChange={onChange} />
|
|
</div>
|
|
</Flex>
|
|
</Card>
|
|
);
|
|
};
|
|
|
|
export default ChunkCard;
|