Feat: Add ParsedPageCard component #3221 (#4976)

### What problem does this PR solve?

Feat: Add ParsedPageCard component #3221
### Type of change


- [x] New Feature (non-breaking change which adds functionality)
This commit is contained in:
balibabu 2025-02-14 18:12:39 +08:00 committed by GitHub
parent 754d5ea364
commit b4ad565df6
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
8 changed files with 166 additions and 6 deletions

View File

@ -1,6 +1,6 @@
import { Routes } from '@/routes';
import { useCallback } from 'react';
import { useNavigate, useSearchParams } from 'umi';
import { useNavigate, useParams, useSearchParams } from 'umi';
export enum QueryStringMap {
KnowledgeId = 'knowledgeId',
@ -9,6 +9,7 @@ export enum QueryStringMap {
export const useNavigatePage = () => {
const navigate = useNavigate();
const [searchParams] = useSearchParams();
const { id } = useParams();
const navigateToDatasetList = useCallback(() => {
navigate(Routes.Datasets);
@ -61,6 +62,15 @@ export const useNavigatePage = () => {
[searchParams],
);
const navigateToChunk = useCallback(
(route: Routes) => {
navigate(
`${route}/${id}?${QueryStringMap.KnowledgeId}=${getQueryString(QueryStringMap.KnowledgeId)}`,
);
},
[getQueryString, id, navigate],
);
return {
navigateToDatasetList,
navigateToDataset,
@ -70,5 +80,6 @@ export const useNavigatePage = () => {
navigateToChat,
navigateToChunkParsedResult,
getQueryString,
navigateToChunk,
};
};

View File

@ -0,0 +1,34 @@
import { Card, CardContent } from '@/components/ui/card';
interface ParsedPageCardProps {
page: string;
content: string;
}
export function ParsedPageCard({ page, content }: ParsedPageCardProps) {
return (
<Card className="bg-colors-outline-neutral-standard border-colors-outline-neutral-strong rounded-3xl">
<CardContent className="p-4">
<p className="text-colors-text-neutral-standard text-base">{page}</p>
<div className="text-colors-text-neutral-strong text-lg mt-2">
{content}
</div>
</CardContent>
</Card>
);
}
interface ChunkCardProps {
activated: boolean;
}
export function ChunkCard({}: ChunkCardProps) {
return (
<Card className="bg-colors-outline-neutral-standard border-colors-outline-neutral-strong rounded-3xl">
<CardContent className="p-4">
<p className="text-colors-text-neutral-standard text-base">{}</p>
<div className="text-colors-text-neutral-strong text-lg mt-2">{}</div>
</CardContent>
</Card>
);
}

View File

@ -1,3 +1,10 @@
import ParsedResultPanel from '../parsed-result-panel';
export default function ChunkResult() {
return <div>ChunkResult</div>;
return (
<section className="flex">
<ParsedResultPanel></ParsedResultPanel>
<div className="flex-1"></div>
</section>
);
}

View File

@ -0,0 +1,20 @@
import { Button } from '@/components/ui/button';
import { Copy } from 'lucide-react';
export function ChunkToolbar() {
return (
<div className="flex justify-between px-9">
<span className="text-colors-text-neutral-strong text-3xl font-bold">
Parsed results
</span>
<div className="flex items-center gap-3">
<Button variant={'icon'} size={'icon'}>
<Copy />
</Button>
<Button variant={'outline'} size={'sm'}>
Export
</Button>
</div>
</div>
);
}

View File

@ -1,12 +1,41 @@
import { PageHeader } from '@/components/page-header';
import { Button } from '@/components/ui/button';
import { Segmented, SegmentedValue } from '@/components/ui/segmented';
import {
QueryStringMap,
useNavigatePage,
} from '@/hooks/logic-hooks/navigate-hooks';
import { Outlet } from 'umi';
import { Routes } from '@/routes';
import { EllipsisVertical } from 'lucide-react';
import { useMemo } from 'react';
import { Outlet, useLocation } from 'umi';
export default function ChunkPage() {
const { navigateToDataset, getQueryString } = useNavigatePage();
const { navigateToDataset, getQueryString, navigateToChunk } =
useNavigatePage();
const location = useLocation();
const options = useMemo(() => {
return [
{
label: 'Parsed results',
value: Routes.ParsedResult,
},
{
label: 'Chunk result',
value: Routes.ChunkResult,
},
{
label: 'Result view',
value: Routes.ResultView,
},
];
}, []);
const path = useMemo(() => {
return location.pathname.split('/').slice(0, 3).join('/');
}, [location.pathname]);
return (
<section>
<PageHeader
@ -14,7 +43,24 @@ export default function ChunkPage() {
back={navigateToDataset(
getQueryString(QueryStringMap.KnowledgeId) as string,
)}
></PageHeader>
>
<div>
<Segmented
options={options}
value={path}
onChange={navigateToChunk as (val: SegmentedValue) => void}
className="bg-colors-background-inverse-standard text-colors-text-neutral-standard"
></Segmented>
</div>
<div className="flex items-center gap-2">
<Button variant={'icon'} size={'icon'}>
<EllipsisVertical />
</Button>
<Button variant={'tertiary'} size={'sm'}>
Save
</Button>
</div>
</PageHeader>
<Outlet />
</section>
);

View File

@ -0,0 +1,35 @@
import { ParsedPageCard } from './chunk-card';
import { ChunkToolbar } from './chunk-toolbar';
const list = new Array(10).fill({
page: 'page 1',
content: `Word并不像 TeXLaTeX为我们提供了合适的定理环境因此需要我们另想办法。
1
使
1.1
仿
1.2
Theorem里面Theorem工具栏SetTheorem`,
});
export default function ParsedResultPanel() {
return (
<div className="flex-1 py-6 border-l space-y-6">
<ChunkToolbar></ChunkToolbar>
<div className="space-y-6 overflow-auto max-h-[94vh] px-9">
{list.map((x, idx) => (
<ParsedPageCard
key={idx}
page={x.page}
content={x.content}
></ParsedPageCard>
))}
</div>
</div>
);
}

View File

@ -1,3 +1,10 @@
import ParsedResultPanel from '../parsed-result-panel';
export default function ParsedResult() {
return <div>ParsedResult</div>;
return (
<section className="flex">
<div className="flex-1"></div>
<ParsedResultPanel></ParsedResultPanel>
</section>
);
}