feat: implement Document Management page with filterable table and batch actions
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Sonnet 4.6
parent
7cd7a10bea
commit
65ba1b214d
@@ -1,58 +0,0 @@
|
||||
import React from 'react';
|
||||
import { useTheme } from '../../contexts';
|
||||
import type { RetrievalData } from '../../types';
|
||||
|
||||
interface CitedAnswerProps {
|
||||
text: string;
|
||||
sources: RetrievalData[];
|
||||
onCiteClick: (index: number) => void;
|
||||
}
|
||||
|
||||
export const CitedAnswer: React.FC<CitedAnswerProps> = ({ text, sources, onCiteClick }) => {
|
||||
const { theme } = useTheme();
|
||||
|
||||
if (!text) return null;
|
||||
|
||||
// Split on [N] patterns, preserving delimiters
|
||||
const parts = text.split(/(\[\d+\])/g);
|
||||
|
||||
return (
|
||||
<span style={{ whiteSpace: 'pre-wrap', lineHeight: 1.6 }}>
|
||||
{parts.map((part, i) => {
|
||||
const match = part.match(/^\[(\d+)\]$/);
|
||||
if (!match) return <React.Fragment key={i}>{part}</React.Fragment>;
|
||||
|
||||
const idx = parseInt(match[1], 10);
|
||||
const source = sources[idx - 1];
|
||||
|
||||
return (
|
||||
<sup
|
||||
key={i}
|
||||
title={source ? `${source.file} · ${source.clause}` : `引用 ${idx}`}
|
||||
onClick={() => onCiteClick(idx)}
|
||||
style={{
|
||||
display: 'inline-flex',
|
||||
alignItems: 'center',
|
||||
justifyContent: 'center',
|
||||
minWidth: 18,
|
||||
height: 18,
|
||||
padding: '0 4px',
|
||||
marginLeft: 1,
|
||||
fontSize: 10,
|
||||
fontWeight: 700,
|
||||
background: theme.gradientAccent,
|
||||
color: '#fff',
|
||||
borderRadius: 4,
|
||||
cursor: source ? 'pointer' : 'default',
|
||||
verticalAlign: 'super',
|
||||
lineHeight: 1,
|
||||
userSelect: 'none',
|
||||
}}
|
||||
>
|
||||
{idx}
|
||||
</sup>
|
||||
);
|
||||
})}
|
||||
</span>
|
||||
);
|
||||
};
|
||||
Reference in New Issue
Block a user