diff --git a/web/app/components/datasets/documents/detail/completed/child-segment-list.tsx b/web/app/components/datasets/documents/detail/completed/child-segment-list.tsx new file mode 100644 index 0000000000..787c9b6e94 --- /dev/null +++ b/web/app/components/datasets/documents/detail/completed/child-segment-list.tsx @@ -0,0 +1,82 @@ +import { type FC, useState } from 'react' +import { RiArrowDownSLine, RiArrowRightSLine } from '@remixicon/react' +import { FormattedText } from '../../../formatted-text/formatted' +import { EditSlice } from '../../../formatted-text/flavours/edit-slice' +import { useDocumentContext } from '../index' +import type { ChildChunkDetail } from '@/models/datasets' +import Input from '@/app/components/base/input' +import classNames from '@/utils/classnames' +import Divider from '@/app/components/base/divider' + +type IChildSegmentCardProps = { + child_chunks: ChildChunkDetail[] + onSave: () => void + handleInputChange: (value: string) => void +} + +const ChildSegmentList: FC = ({ + child_chunks, + onSave, + handleInputChange, +}) => { + let parentMode = useDocumentContext(s => s.parentMode) + parentMode = 'paragraph' + const [collapsed, setCollapsed] = useState(true) + + const toggleCollapse = () => { + setCollapsed(!collapsed) + } + + return ( +
+
+
{ + event.stopPropagation() + toggleCollapse() + }}> + { + parentMode === 'paragraph' + ? collapsed + ? ( + + ) + : () + : null + } + {`${child_chunks.length} CHILD CHUNKS`} + · + +
+ {parentMode === 'full-doc' + ? handleInputChange(e.target.value)} + onClear={() => handleInputChange('')} + /> + : null} +
+ {(parentMode === 'full-doc' || !collapsed) + ?
+ + + {child_chunks.map((childChunk, index) => { + return {}} + className='' + /> + })} + +
+ + : null} +
+ ) +} + +export default ChildSegmentList diff --git a/web/app/components/datasets/documents/detail/completed/index.tsx b/web/app/components/datasets/documents/detail/completed/index.tsx index adba7dbe1c..492fa458cc 100644 --- a/web/app/components/datasets/documents/detail/completed/index.tsx +++ b/web/app/components/datasets/documents/detail/completed/index.tsx @@ -11,6 +11,7 @@ import SegmentList from './segment-list' import DisplayToggle from './display-toggle' import BatchAction from './batch-action' import SegmentDetail from './segment-detail' +import { mockSegments } from './mock-data' import cn from '@/utils/classnames' import { formatNumber } from '@/utils/format' import Modal from '@/app/components/base/modal' @@ -123,8 +124,9 @@ const Completed: FC = ({ ) useEffect(() => { - if (segmentList) - setSegments(segmentList.data || []) + setSegments(mockSegments.data) + // if (segmentList) + // setSegments(segmentList.data || []) }, [segmentList]) const resetList = useCallback(() => { diff --git a/web/app/components/datasets/documents/detail/completed/mock-data.ts b/web/app/components/datasets/documents/detail/completed/mock-data.ts index d655b4b2de..009a75d75c 100644 --- a/web/app/components/datasets/documents/detail/completed/mock-data.ts +++ b/web/app/components/datasets/documents/detail/completed/mock-data.ts @@ -1,3 +1,5 @@ +import type { ChildChunkType } from '@/models/datasets' + export const mockSegments = { data: [ { @@ -23,7 +25,7 @@ export const mockSegments = { index_node_id: 'b67972c2-4a95-4e46-bf8e-f32535bfc483', index_node_hash: '40ead185f2ec6a451da09e99f4f5a7438df4542590090660b7f2f40099220cf0', hit_count: 0, - enabled: true, + enabled: false, disabled_at: 1732081062, disabled_by: '', status: 'completed', @@ -33,6 +35,26 @@ export const mockSegments = { completed_at: 1732081064, error: null, stopped_at: 1732081062, + child_chunks: [ + { + id: 'f3c7e7b6-5e7e-4c8d-9a0b-8f7e1c1f7a6d', + position: 1, + segment_id: '12aa196a-cf47-4962-a64a-7d927ed9b0ea', + content: 'Dify 云服务 · 自托管 · 文档 · (需用英文)常见问题解答 / 联系团队\n\n', + word_count: 45, + created_at: 1732081062, + type: 'automatic' as ChildChunkType, + }, + { + id: 'f3c7e7b6-5e7e-4c8d-9a0b-8f7e1c1f7a6c', + position: 2, + segment_id: '12aa196a-cf47-4962-a64a-7d927ed9b0ea', + content: 'Dify 是一个开源的 LLM 应用开发平台。其直观的界面结合了 AI 工作流、RAG 管道、Agent、模型管理、可观测性功能等,让您可以快速从原型到生产。', + word_count: 79, + created_at: 1732081062, + type: 'automatic' as ChildChunkType, + }, + ], }, { id: '4c701023-90a6-4df9-bc26-49cfb701badc', diff --git a/web/app/components/datasets/documents/detail/completed/segment-card.tsx b/web/app/components/datasets/documents/detail/completed/segment-card.tsx index d929c85401..7b0e8fd60d 100644 --- a/web/app/components/datasets/documents/detail/completed/segment-card.tsx +++ b/web/app/components/datasets/documents/detail/completed/segment-card.tsx @@ -3,6 +3,8 @@ import { useTranslation } from 'react-i18next' import { RiArrowRightUpLine, RiDeleteBinLine, RiEditLine } from '@remixicon/react' import { StatusItem } from '../../list' import DocumentFileIcon from '../../../common/document-file-icon' +import { useDocumentContext } from '../index' +import ChildSegmentList from './child-segment-list' import { SegmentIndexTag, useSegmentListContext } from '.' import type { SegmentDetailModel } from '@/models/datasets' import Indicator from '@/app/components/header/indicator' @@ -112,8 +114,11 @@ const SegmentCard: FC = ({ hit_count, answer, keywords, + child_chunks = [], } = detail as Required['detail'] const [showModal, setShowModal] = useState(false) + const isCollapsed = useSegmentListContext(s => s.isCollapsed) + const mode = useDocumentContext(s => s.mode) const isDocScene = useMemo(() => { return scene === 'doc' @@ -149,11 +154,10 @@ const SegmentCard: FC = ({ return content } - const isCollapsed = useSegmentListContext(s => s.isCollapsed) return ( -
onClick?.()}> -
+
onClick?.()}> +
{isDocScene ? <>
@@ -167,7 +171,7 @@ const SegmentCard: FC = ({ )}
-
+
{loading ? ( @@ -176,7 +180,7 @@ const SegmentCard: FC = ({ <> {embeddingAvailable && ( -