File size: 3,428 Bytes
e52051a f3d0ebd badd5fe e52051a 7b71fb2 a9e3dcb 88e5a61 a9e3dcb 825281b 7b71fb2 f3d0ebd e52051a f3d0ebd 7b71fb2 badd5fe ae21b62 7b71fb2 badd5fe 7b71fb2 badd5fe 7b71fb2 badd5fe ae21b62 7b71fb2 a9e3dcb 7b71fb2 a9e3dcb 7b71fb2 a9e3dcb 7b71fb2 88e5a61 e52051a 7b71fb2 825281b 7b71fb2 f3d0ebd 88e5a61 f3d0ebd e52051a f3d0ebd 7b71fb2 e52051a 058cd84 f3d0ebd 88e5a61 f3d0ebd 88e5a61 f3d0ebd 7b71fb2 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 |
import { ReactComponent as CancelIcon } from '@/assets/svg/cancel.svg';
import { ReactComponent as RefreshIcon } from '@/assets/svg/refresh.svg';
import { ReactComponent as RunIcon } from '@/assets/svg/run.svg';
import { useTranslate } from '@/hooks/commonHooks';
import { useRunDocument } from '@/hooks/documentHooks';
import { IKnowledgeFile } from '@/interfaces/database/knowledge';
import { Badge, DescriptionsProps, Flex, Popover, Space, Tag } from 'antd';
import { useTranslation } from 'react-i18next';
import reactStringReplace from 'react-string-replace';
import { RunningStatus, RunningStatusMap } from '../constant';
import { isParserRunning } from '../utils';
import styles from './index.less';
const iconMap = {
[RunningStatus.UNSTART]: RunIcon,
[RunningStatus.RUNNING]: CancelIcon,
[RunningStatus.CANCEL]: RefreshIcon,
[RunningStatus.DONE]: RefreshIcon,
[RunningStatus.FAIL]: RefreshIcon,
};
interface IProps {
record: IKnowledgeFile;
}
const PopoverContent = ({ record }: IProps) => {
const { t } = useTranslate('knowledgeDetails');
const replaceText = (text: string) => {
// Remove duplicate \n
const nextText = text.replace(/(\n)\1+/g, '$1');
const replacedText = reactStringReplace(
nextText,
/(\[ERROR\].+\s)/g,
(match, i) => {
return (
<span key={i} className={styles.popoverContentErrorLabel}>
{match}
</span>
);
},
);
return replacedText;
};
const items: DescriptionsProps['items'] = [
{
key: 'process_begin_at',
label: t('processBeginAt'),
children: record.process_begin_at,
},
{
key: 'process_duation',
label: t('processDuration'),
children: record.process_duation,
},
{
key: 'progress_msg',
label: t('progressMsg'),
children: replaceText(record.progress_msg.trim()),
},
];
return (
<Flex vertical className={styles.popoverContent}>
{items.map((x, idx) => {
return (
<div key={x.key} className={idx < 2 ? styles.popoverContentItem : ''}>
<b>{x.label}:</b>
<div className={styles.popoverContentText}>{x.children}</div>
</div>
);
})}
</Flex>
);
};
export const ParsingStatusCell = ({ record }: IProps) => {
const text = record.run;
const runningStatus = RunningStatusMap[text];
const { t } = useTranslation();
const runDocumentByIds = useRunDocument();
const isRunning = isParserRunning(text);
const OperationIcon = iconMap[text];
const label = t(`knowledgeDetails.runningStatus${text}`);
const handleOperationIconClick = () => {
runDocumentByIds({
doc_ids: [record.id],
run: isRunning ? 2 : 1,
knowledgeBaseId: record.kb_id,
});
};
return (
<Flex justify={'space-between'} align="center">
<Popover content={<PopoverContent record={record}></PopoverContent>}>
<Tag color={runningStatus.color}>
{isRunning ? (
<Space>
<Badge color={runningStatus.color} />
{label}
<span>{(record.progress * 100).toFixed(2)}%</span>
</Space>
) : (
label
)}
</Tag>
</Popover>
<div onClick={handleOperationIconClick} className={styles.operationIcon}>
<OperationIcon />
</div>
</Flex>
);
};
export default ParsingStatusCell;
|